मैं एक COM ऐड-इन लिख रहा हूं जो एक आईडीई का विस्तार कर रहा है जिसकी सख्त जरूरत है। इसमें कई विशेषताएं शामिल हैं, लेकिन इस पद की खातिर इसे 2 तक सीमित कर दें:
- वहाँ एक है कोड एक्सप्लोरर toolwindow कि प्रदर्शित करता है एक treeview उपयोगकर्ता नेविगेट मॉड्यूल और उनके सदस्यों की सुविधा देता है।
- एक नहीं है कोड निरीक्षण toolwindow कि प्रदर्शित करता है एक DataGridView उपयोगकर्ता नेविगेट कोड मुद्दों की सुविधा देता है और उन्हें स्वचालित रूप से ठीक है।
दोनों उपकरणों में एक "ताज़ा करें" बटन है जो एक अतुल्यकालिक कार्य शुरू करता है जो सभी खोले गए प्रोजेक्टों में सभी कोड को पार्स करता है; कोड एक्सप्लोरर पार्स परिणाम का उपयोग करता है के निर्माण के लिए treeview , और कोड निरीक्षण पार्स परिणाम का उपयोग करता कोड समस्याओं का पता लगाने और उसके परिणामों में प्रदर्शित करने के लिए DataGridView ।
मैं यहां क्या करने की कोशिश कर रहा हूं, सुविधाओं के बीच पार्स परिणामों को साझा करना है, ताकि जब कोड एक्सप्लोरर ताज़ा हो जाए, तो कोड निरीक्षण इसके बारे में जानता है और पार्सिंग कार्य को फिर से करने के बिना खुद को ताज़ा कर सकता है जो कोड एक्सप्लोरर ने अभी किया था ।
तो मैंने क्या किया, मैंने अपने पार्सर क्लास को एक इवेंट प्रोवाइडर बनाया, जिसमें फीचर्स दर्ज हो सकते हैं:
private void _parser_ParseCompleted(object sender, ParseCompletedEventArgs e)
{
Control.Invoke((MethodInvoker) delegate
{
Control.SolutionTree.Nodes.Clear();
foreach (var result in e.ParseResults)
{
var node = new TreeNode(result.Project.Name);
node.ImageKey = "Hourglass";
node.SelectedImageKey = node.ImageKey;
AddProjectNodes(result, node);
Control.SolutionTree.Nodes.Add(node);
}
Control.EnableRefresh();
});
}
private void _parser_ParseStarted(object sender, ParseStartedEventArgs e)
{
Control.Invoke((MethodInvoker) delegate
{
Control.EnableRefresh(false);
Control.SolutionTree.Nodes.Clear();
foreach (var name in e.ProjectNames)
{
var node = new TreeNode(name + " (parsing...)");
node.ImageKey = "Hourglass";
node.SelectedImageKey = node.ImageKey;
Control.SolutionTree.Nodes.Add(node);
}
});
}
और यह काम करता है। मुझे जो समस्या आ रही है, वह यह है ... यह काम करता है - मेरा मतलब है, जब कोड निरीक्षण ताज़ा हो जाते हैं, तो पार्सर कोड एक्सप्लोरर (और बाकी सभी) को कहता है "दोस्त, किसी की पार्सिंग, कुछ भी आप इसके बारे में करना चाहते हैं? " - और जब पार्सिंग पूरी हो जाती है, तो पार्सर अपने श्रोताओं से कहता है "दोस्तों, मेरे पास आपके लिए नए परिणाम हैं, आप इसके बारे में कुछ भी करना चाहते हैं?"।
इस समस्या के बारे में बताने के लिए आपको एक उदाहरण के माध्यम से चलता हूं:
- उपयोगकर्ता कोड एक्सप्लोरर लाता है, जो उपयोगकर्ता को बताता है "मैं यहां काम कर रहा हूं"; उपयोगकर्ता आईडीई में काम करना जारी रखता है, कोड एक्सप्लोरर खुद को फिर से बनाता है, जीवन सुंदर है।
- उपयोगकर्ता फिर कोड निरीक्षण लाता है, जो उपयोगकर्ता को बताता है "मैं यहां काम कर रहा हूं"; पार्सर कोड एक्सप्लोरर को कहता है "यार, किसी की पार्सिंग, कुछ भी आप इसके बारे में करना चाहते हैं?" - कोड एक्सप्लोरर उपयोगकर्ता को बताता है "मैं यहां काम कर रहा हूं"; उपयोगकर्ता अभी भी IDE में काम कर सकता है, लेकिन कोड एक्सप्लोरर को नेविगेट नहीं कर सकता क्योंकि यह ताज़ा है। और वह कोड निरीक्षण के पूरा होने की प्रतीक्षा कर रहा है।
- उपयोगकर्ता निरीक्षण परिणामों में एक कोड मुद्दा देखता है जिसे वे संबोधित करना चाहते हैं; वे इसे नेविगेट करने के लिए डबल-क्लिक करते हैं, पुष्टि करते हैं कि कोड के साथ कोई समस्या है, और "फिक्स" बटन पर क्लिक करें। मॉड्यूल को संशोधित किया गया था और इसे फिर से पार्स करने की आवश्यकता है, इसलिए कोड निरीक्षण इसके साथ आगे बढ़ते हैं; कोड एक्सप्लोरर उपयोगकर्ता को बताता है "मैं यहां काम कर रहा हूं", ...
देखें यह कहाँ जा रहा है? मुझे यह पसंद नहीं है, और मुझे यकीन है कि उपयोगकर्ता इसे पसंद नहीं करेंगे। मैं क्या खो रहा हूँ? मुझे सुविधाओं के बीच पार्स परिणाम साझा करने के बारे में कैसे जाना चाहिए, लेकिन फिर भी उपयोगकर्ता को नियंत्रण में रखना चाहिए कि फीचर को अपना काम कब करना चाहिए ?
जो कारण मैं पूछ रहा हूं, वह इसलिए है क्योंकि मुझे लगा कि यदि मैंने वास्तविक कार्य को स्थगित कर दिया, जब तक कि उपयोगकर्ता सक्रिय रूप से ताज़ा करने का निर्णय नहीं लेता है, और पार्स परिणामों को "कैश्ड" करता है क्योंकि वे आते हैं ... अच्छी तरह से तब मैं एक ट्रीव्यू ताज़ा करूँगा और संभवतः बासी पार्स परिणाम में कोड मुद्दों का पता लगाना ... जो मुझे शाब्दिक रूप से एक वर्ग में वापस लाता है, जहां प्रत्येक सुविधा अपने स्वयं के पार्स परिणामों के साथ काम करती है: क्या कोई तरीका है जो मैं सुविधाओं के बीच पार्स परिणाम साझा कर सकता हूं और एक प्यारा यूएक्स हो सकता है?
कोड c # है , लेकिन मैं कोड की तलाश नहीं कर रहा हूं, मैं अवधारणाओं की तलाश कर रहा हूं ।
VBAParser
ANTLR द्वारा उत्पन्न की गई है और मुझे एक पार्स ट्री देता है, लेकिन विशेषताएं इसका उपभोग नहीं करती हैं। RubberduckParser
पार्स पेड़ लेता है, यह चलता है, और मुद्दों पर एक VBProjectParseResult
स्थापित करता है, Declaration
वस्तुओं है कि सभी अपने References
संकल्प लिया - कि की क्या विशेषताएं इनपुट के लिए ले .. हाँ, यह बहुत ज्यादा एक सभी या कुछ भी नहीं की स्थिति है। RubberduckParser
नहीं फिर से पार्स मॉड्यूल है कि हालांकि संशोधित नहीं किया गया है करने के लिए स्मार्ट पर्याप्त है। लेकिन अगर वहाँ एक अड़चन है यह पार्सिंग के साथ नहीं है, तो यह कोड निरीक्षण के साथ है।