इस भाग में: हाइलाइटिंग, लिंक सिस्टम, स्वतः पूर्णता, कोड नेविगेशन। पिछला हिस्सा यहाँ है ।
सिंटेक्स और त्रुटि हाइलाइटिंग
यह निर्धारित करने के लिए कि किस प्रकार संबंधित पाठ श्रेणी को हाइलाइट किया जाना चाहिए, यह निर्धारित करने के लिए IDEA द्वारा उपयोग की जाने वाली कक्षा को
TextAttributesKey कहा जाता है। इस वर्ग का एक उदाहरण प्रत्येक अलग-अलग प्रकार के तत्वों के लिए बनाया गया है, जिन्हें हाइलाइट किया जाना चाहिए (कीवर्ड, संख्याएं, रेखाएं, टिप्पणियां आदि), यह डिफ़ॉल्ट विशेषताओं को परिभाषित करता है जो संबंधित प्रकार के तत्वों पर लागू होते हैं (उदाहरण के लिए, कीवर्ड बोल्ड हैं , नीले में संख्या, इटैलिक और एक हरे रंग की पृष्ठभूमि में लाइनें)। TextAttributesKey की संपादक में उपयोग की जाने वाली विशिष्ट विशेषताओं की मैपिंग
EditorColorsScheme वर्ग द्वारा परिभाषित की गई है और उपयोगकर्ता द्वारा कॉन्फ़िगर किया जा सकता है यदि प्लग-इन एक उपयुक्त कॉन्फ़िगरेशन इंटरफ़ेस प्रदान करता है। ओवरलैपिंग कई TextAttributeKeys को हाइलाइट करने में उपयोग किया जा सकता है: उदाहरण के लिए, एक कुंजी शैली को निर्धारित कर सकती है और दूसरा तत्व के रंग को निर्धारित कर सकती है।
बुनियादी वाक्य रचना हाइलाइटिंग
सिंटेक्स और त्रुटि हाइलाइटिंग विभिन्न स्तरों पर किया जाता है। सबसे पहले - लेक्सिकल विश्लेषण के परिणामों के आधार पर वाक्य रचना हाइलाइटिंग को
SyntaxHighlighter इंटरफ़ेस के माध्यम से किया जाता है। यह इंटरफ़ेस प्रत्येक प्रकार के टोकन के लिए TextAttributeKey उदाहरण देता है, जिसके लिए विशेष हाइलाइटिंग की आवश्यकता होती है। लेक्सर त्रुटियों को उजागर करने के लिए, TextAttributeKey वर्ग का एक मानक ऑब्जेक्ट अमान्य वर्णों के लिए उपयोग किया जाता है (
HighligherColors.BAD_CHARACTER
)।
सर्किट डिजाइनरों के काम को सुविधाजनक बनाने और विभिन्न प्रोग्रामिंग भाषाओं के लिए समान प्रदर्शन करने के लिए, रंग प्रबंधन योजना थोड़ा बदल गई है, भले ही योजना मूल रूप से उनके लिए नहीं थी। पहले, भाषा प्लगइन्स निश्चित रंग योजनाओं का उपयोग करते थे जो हमेशा संगत नहीं होते हैं, उदाहरण के लिए, अंधेरे विषयों के साथ। नया कार्यान्वयन आपको मानक पाठ विशेषताओं के एक सेट पर निर्भरता निर्धारित करने की अनुमति देता है जो एक योजना से बंधे हैं, और एक विशिष्ट भाषा के लिए नहीं। विशिष्ट भाषाओं के लिए गुण अभी भी स्कीमा डिजाइनर द्वारा निर्धारित किए जा सकते हैं, लेकिन अब वे वैकल्पिक हैं। नई रंग योजनाओं को संगतता समस्याओं से बचने के लिए एक्सटेंशन .icls प्राप्त हुआ है।
अब,
DefaultLanguageHighlighterColors वर्ग का उपयोग पाठ विशेषताओं को परिभाषित करने और मानक कुंजियों के आधार पर किया जाता है।
उदाहरण: गुण प्लगइन के लिए
SyntaxHighlighlighter कार्यान्वयन ।
हाइलाइटिंग के दूसरे स्तर पर - पार्सिंग के दौरान होने वाली त्रुटियों को उजागर करना। यदि एक विशिष्ट टोकन श्रृंखला भाषा के व्याकरण से मेल नहीं खाती है, तो अमान्य टोकन को उजागर करने और त्रुटि संदेश प्रदर्शित करने के लिए PsiBuilder.error () विधि का उपयोग किया जा सकता है।
एनोटेशन
एनोटेटर इंटरफेस का उपयोग करके बैकलाइटिंग का तीसरा स्तर किया जाता है। प्लगइन
com.intellij.annotator
एक्सटेंशन
com.intellij.annotator
पर एक या कई एनोटेशन दर्ज कर
com.intellij.annotator
, जिसके बाद उन्हें उपयोगकर्ता की भाषा पीएसआई ट्री के तत्वों को उजागर करते हुए पृष्ठभूमि प्रक्रिया में बुलाया जाएगा। एनोटेशन न केवल वाक्यविन्यास, बल्कि शब्दार्थ का भी विश्लेषण कर सकते हैं, और इस प्रकार त्रुटियों को संसाधित करने और हाइलाइट करने के लिए अधिक सूक्ष्म तर्क प्रदान करते हैं। एक एनोटेशन में पाई गई समस्याओं (तथाकथित त्वरित समाधान) को हल करने के लिए कार्यक्षमता हो सकती है।
जब एक फ़ाइल को संशोधित किया जाता है, तो एनोटेशन को केवल पीएसआई पेड़ के बदले हुए तत्वों को संसाधित करने के लिए वृद्धिशील कहा जाता है।
त्रुटि या चेतावनी के रूप में पाठ की एक विशिष्ट श्रेणी को हाइलाइट करने के लिए, एनोटेशनहोल्डर के ऑब्जेक्ट पर एनोटेशन createErrorAnnotation () या createWarningAnnotation () कॉल करता है, और त्रुटि सुधार लॉजिक को जोड़ने के लिए एनोटेटर वर्ग के लौटे ऑब्जेक्ट पर वैकल्पिक रूप से registerFix ()। अतिरिक्त हाइलाइटिंग लागू करने के लिए, एनोटेशन AnnotationHolder.createInfoAnnotation () को खाली संदेश के साथ कॉल कर सकता है और फिर, Annotation.setTextAttributes () को कॉल करके, पाठ विशेषताएँ सेट करें।
उदाहरण:
गुण भाषा के लिए एनोटेटर ।
बाहरी एनोटेशन
अंत में, यदि उपयोगकर्ता भाषा फ़ाइल सत्यापन के लिए बाहरी उपकरणों का उपयोग करती है, तो उनके परिणाम
com.intellij.externalAnnotator
इंटरफ़ेस को लागू करके और इसे
com.intellij.externalAnnotator
एक्सटेंशन
com.intellij.externalAnnotator
पर पंजीकृत करके प्रदान किए जा सकते हैं। एक्सटर्नलनोटेटर के साथ बैकलाइटिंग की प्राथमिकता सबसे कम है और सभी पृष्ठभूमि प्रक्रियाओं के पूरा होने के बाद ही होती है। बाहरी एनोटेशन बाहरी उपकरणों के उत्पादन को अनुकूलित करने और हाइलाइटिंग प्रदर्शित करने के लिए एक ही एनोटेशनहार्ड इंटरफ़ेस का उपयोग करते हैं।
रंग सेटिंग्स पेज
प्लगइन एक कॉन्फ़िगरेशन इंटरफ़ेस भी प्रदान कर सकता है जो उपयोगकर्ता को कुछ तत्वों के रंगों को अनुकूलित करने की अनुमति देता है। ऐसा करने के लिए, आपको
ColorSettingPage वर्ग का एक उदाहरण बनाने और इसे विस्तार बिंदु
com.intellij.colorSettingsPage
साथ पंजीकृत करने की
com.intellij.colorSettingsPage
।
उदाहरण:
गुण के लिए ColorSettingsPage ।
"HTML से निर्यात करें" फ़ंक्शन संपादक के समान ही हाइलाइटिंग तंत्र का उपयोग करता है, इसलिए यह SyntaxHighlighter के कार्यान्वयन के तुरंत बाद उपयोगकर्ता भाषा के लिए उपलब्ध हो जाता है।
इंटेलीज आईडीईए संदर्भ प्रणाली
उपयोगकर्ता भाषा कार्यक्रम संरचना के कार्यान्वयन में सबसे महत्वपूर्ण और भ्रामक भागों में से एक लिंक रिज़ॉल्यूशन है, अर्थात्। तत्व के उपयोग के स्थान (अभिव्यक्ति, विधि कॉल, आदि में चर) से परिभाषा की जगह (चर, विधि, आदि की घोषणा) के आगे बढ़ने की क्षमता। इसके लिए कई IDEA फीचर्स को सपोर्ट करना होता है, जैसे कि "Go to Declaration" (Ctrl-B और Ctrl-Click), साथ ही उपयोग, पुनर्नामकरण और ऑटो-पूर्ति के लिए खोज करते समय।
प्रत्येक PSI तत्व जो एक संदर्भ के रूप में संचालित होना चाहिए PsiElement.getReference () विधि को ओवरराइड करना चाहिए ताकि यह
PsiReference इंटरफ़ेस के संबंधित कार्यान्वयन को वापस कर
दे । यह इंटरफ़ेस PsiElement वर्ग द्वारा ही, या एक अलग से दोनों को लागू किया जा सकता है। यदि किसी तत्व में कई लिंक हो सकते हैं (उदाहरण के लिए, वर्गों को सूचीबद्ध करने वाली एक पंक्ति), तो इस मामले में इसे PsiElement.getReferences () विधि को लागू करना होगा, जो लिंक की एक सरणी देता है।
PsiReference इंटरफ़ेस की मुख्य विधि रिज़ॉल्यूशन () है, जो या तो उस तत्व को लौटाता है जो लिंक को इंगित करता है, या नल यदि लिंक को हल नहीं किया जा सकता है (उदाहरण के लिए, यदि यह एक अपरिभाषित वर्ग को इंगित करता है)। विपरीत विधि isReferenceTo () है, जो यह जांचती है कि लिंक किसी विशिष्ट तत्व को इंगित करता है या नहीं। बाद के तरीके को कॉल रिज़ॉल्यूशन () द्वारा पारित किया जा सकता है और परिणाम को पारित पीएसआई तत्व के साथ तुलना कर सकता है, लेकिन डेवलपर को अतिरिक्त अनुकूलन लागू करने की अनुमति देता है।
उदाहरण: प्रॉपर्टीज प्लगइन में
रिसोर्सबंडल से लिंक ।
आईडीईए कई इंटरफेस प्रदान करता है जिसे लिंक सपोर्ट को लागू करने के लिए आधार के रूप में इस्तेमाल किया जा सकता है, जिसका नाम है
PsiScopeProcessor इंटरफ़ेस और PsiElement.processDeclarations () विधि। इन इंटरफेस में कई जटिलताएं हैं जो अधिकांश उपयोगकर्ता भाषाओं के लिए आवश्यक नहीं हैं (उदाहरण के लिए, सामान्य प्रकार के प्रतिस्थापन के लिए समर्थन), लेकिन वे आवश्यक हैं यदि उपयोगकर्ता भाषा जावा कोड का संदर्भ दे सकती है। यदि जावा के साथ इंटरऑपरेबिलिटी की आवश्यकता नहीं है, या अन्य कारण हैं, तो प्लगइन लिंक रिज़ॉल्यूशन के मानक कार्यान्वयन को ओवरराइड कर सकता है।
मानक आईडिया हेल्पर वर्गों को निम्नलिखित घटकों से मिलकर संदर्भ हल करने के लिए उपयोग किया जाता है:
- एक वर्ग जो PsiScopeProcessor इंटरफ़ेस को लागू करता है, जो संभव लिंक परिभाषाओं को एकत्र करता है और पूरी तरह से पूरा होने पर रिज़ॉल्यूशन प्रक्रिया को रोक देता है। मुख्य विधि जिसे कार्यान्वित करने की आवश्यकता है, वह है निष्पादन (), जिसे प्रत्येक परिभाषा को संसाधित करने के लिए कहा जाता है और परिभाषा मिलने पर झूठी लौट आती है;
- एक फ़ंक्शन जो लिंक से अपने रिज़ॉल्यूशन के स्थान से पेड़ को निकालता है या दायरे से बाहर निकलता है;
- PSI तत्व, जिस पर PSI के पेड़ को ट्रेस करते समय processDeclarations () विधि कहा जाता है। यदि तत्व एक परिभाषा है, तो यह अपने आप में निष्पादन () विधि का संदर्भ देता है। यदि आवश्यक हो, तो गुंजाइश निर्धारित करने के लिए भाषा के नियमों के अनुसार, तत्व अपने बच्चे के तत्वों को PsiScopeProcessor पारित कर सकता है।
PsiReference इंटरफ़ेस का एक विस्तार है जो लिंक को कई लक्ष्य तत्वों का उपयोग करने की अनुमति देता है - PsiPolyVariantReference। लिंक लक्ष्य तत्वों को multResolve () विधि द्वारा लौटाया जाता है। इस प्रकार के लिंक के लिए "घोषणा पर जाएं" कार्रवाई आपको नेविगेशन के लिए किस तत्व का उपयोग करने की अनुमति देती है। MultiResolve () का कार्यान्वयन PsiScopeProcessor पर आधारित हो सकता है, यदि पहले परिणाम के बाद खोज को रोकने के बजाय, शेष लक्ष्य तत्वों को इकट्ठा करना जारी रखें।
दूसरी ओर, IntelliJ IDEA के पास संदर्भ योगदानकर्ता और संदर्भ प्रदाता के माध्यम से एक संदर्भ प्रणाली को लागू करने के लिए एक दृष्टिकोण है।
PsiReferenceContributor प्रत्येक
PsiElement की जाँच करता है और, उपयोगकर्ता द्वारा निर्धारित संबंधित विवरण के अनुसार, इस मामले (
उदाहरण ) के लिए पंजीकृत लिंक प्रदाता की वस्तु लौटाता है। बदले में,
PsiReferenceProvider एक वर्ग है जिसे PSI पेड़ के एक तत्व के भीतर लिंक खोजने के लिए डिज़ाइन किया गया है। यह PsiReference वस्तुओं (
उदाहरण ) की एक सरणी देता है।
PsiReferenceProvider.getReferencesByElement () विधि को उन लिंक (PsiReference) की सूची वापस करनी चाहिए जो PsiElement तत्व में सम्मिलित हैं। इस स्थिति में, केवल एक लिंक लौटाया जाता है, लेकिन सामान्य स्थिति में कई हो सकते हैं, प्रत्येक लिंक में संबंधित textRange (प्रारंभिक सूचकांक और PSI तत्व के पाठ के अंदर लिंक के अंत सूचकांक) को समाहित करना होगा।
संदर्भ अंशदाता को उचित विस्तार बिंदु - com.intellij.psi.referenceContributor पर plugin.xml फ़ाइल में पंजीकृत होना चाहिए।
तब PsiElement.getReferences () पद्धति को लागू करते समय लिंक की एक सूची प्राप्त करने के लिए उसके काम के परिणामों का उपयोग करना संभव है। प्रत्येक संदर्भ तत्व में इस कोड को डुप्लिकेट नहीं करने के लिए, आप कस्टम साई तत्वों के लिए एक आधार वर्ग को परिभाषित कर सकते हैं:
public class MyASTWrapperPsiElement extends ASTWrapperPsiElement { public MyASTWrapperPsiElement(@NotNull ASTNode astNode) { super(astNode); } @Override public PsiReference getReference() { PsiReference[] references = getReferences(); return references.length == 0 ? null : references[0]; } @NotNull @Override public PsiReference[] getReferences() {
कोड पूरा हो रहा है
ऑटो-समापन के दो मुख्य प्रकार हैं जो एक कस्टम भाषा प्लग-इन में उपयोग किए जा सकते हैं: एक साधारण लिंक ऐड-ऑन और एक प्रदाता-आधारित ऐड-ऑन।
सरल ऑटो-पूरा
ऐड-ऑन सूची को पॉप्युलेट करने के लिए, IDEA PsiReference.getVariants () विधि को या तो कर्सर के नीचे लिंक पर या डमी तत्व में कर्सर के नीचे रखा गया है। इस पद्धति में स्ट्रिंग, PSI तत्वों या लुकअप क्लास के उदाहरण वाले ऑब्जेक्ट की एक सरणी वापस आनी चाहिए। यदि PsiElement का एक उदाहरण लौटे हुए सरणी में मिलता है, तो संबंधित आइकन को परिवर्धन की सूची में प्रदर्शित किया जाएगा।
GetVariants () को लागू करने का सबसे सामान्य तरीका समान ट्री ट्रैवर्सल फ़ंक्शन का उपयोग करना है जैसा कि PsiReference.resolve () विधि में है, लेकिन सभी मिली परिभाषाओं को वापस करना।
प्रदाता-आधारित ऑटो-पूर्णता
कम्प्लीशनकंटेनर इंटरफेस के आधार पर ऐड-ऑन का कार्यान्वयन कोड पूरा होने के संचालन पर सबसे अधिक नियंत्रण देता है।
पूर्णता योगदानकर्ता का उपयोग करने के लिए मुख्य परिदृश्य में विस्तार () पद्धति को कॉल करना और "पैटर्न" पैरामीटर में उचित संदर्भ पास करना शामिल है जिसमें यह ऐड-ऑन विकल्प लागू होता है, ऐड-ऑन प्रदाता, जो ऑटो-पूर्ण सूची में संबंधित आइटम उत्पन्न करता है, "प्रदाता" पैरामीटर को पास किया जाता है।
उदाहरण: MANIFEST.MF फ़ाइलों में कीवर्ड के स्वत:
पूर्णीकरण के लिए पूर्णविराम सहायक।
ऑटो-पूर्ण सूची में आइटम
लुकअप इंटरफ़ेस के उदाहरणों द्वारा दर्शाए जाते हैं। इन ऑब्जेक्ट्स को आमतौर पर लुकअपएलेमेंटबल का उपयोग करके बनाया जाता है। उनमें से प्रत्येक के लिए, आप निम्नलिखित विशेषताओं को परिभाषित कर सकते हैं:
- शरीर पाठ, अतिरिक्त पाठ, प्रकार के साथ लाइन - अतिरिक्त पाठ मुख्य एक के तुरंत बाद दिखाया जाता है, लेकिन इसका उपयोग मैचों की खोज के लिए नहीं किया जाता है, यह मुख्य रूप से विधि मापदंडों की एक सूची दिखाने के लिए है। परिवर्धन की सूची में पूरक अभिव्यक्ति के प्रकार वाली एक पंक्ति सही-संरेखित होती है, आमतौर पर रिटर्न प्रकार की विधि या वर्ग युक्त;
- आइकन;
- पाठ विशेषताएँ
- पाठ को सम्मिलित करते समय एक हैंडलर एक कॉलबैक विधि है जिसे तब जोड़ा जाता है जब परिवर्धन की सूची से कोई आइटम चुना जाता है, इसका उपयोग किया जा सकता है, उदाहरण के लिए, विधि कॉल के बाद कोष्ठक सम्मिलित करने के लिए।
उपयोग खोज
IDEA में Usages की कार्रवाई एक बहु-चरण प्रक्रिया है, जिसके प्रत्येक चरण में प्लग-इन से भागीदारी की आवश्यकता होती है: एक्सटेंशन पॉइंट com.intellij.lang.find.sagesProvider में
FindUsagesProvider के कार्यान्वयन और पंजीकरण के रूप में, साथ ही कार्यक्रम संरचना (PsiNamedElement और Psference) के कार्यान्वयन की विशेषताएं। ।
उदाहरण:
गुणों के लिए
FindUsagesProvider को
लागू करना ।
इस फ़ंक्शन को लागू करने के लिए, निम्न चरणों का पालन करना चाहिए:
- हमें खोजे जाने की क्रिया करने से पहले, IDEA प्रत्येक उपयोगकर्ता भाषा फ़ाइल में दर्शाए गए शब्दों का एक सूचकांक बनाता है। FindUsagesProvider.getScriptScanner () से प्राप्त WordsScanner के कार्यान्वयन का उपयोग करते हुए, IDEA प्रत्येक फ़ाइल की सामग्री को लोड करता है और शब्द हैंडलर के साथ, इसे वर्ड स्कैनर में पास करता है। स्कैनर पाठ को शब्दों में तोड़ता है, प्रत्येक शब्द (कोड, टिप्पणी, लाइनें) के संदर्भ को परिभाषित करता है और उन्हें हैंडलर के पास भेजता है। स्कैनर को लागू करने का सबसे आसान तरीका है, DefaultScriptScanner वर्ग का उपयोग करना;
- जब उपयोगकर्ता Find Usages कार्रवाई को आमंत्रित करता है, तो IDEA उस आइटम की पहचान करता है जिसके लिंक खोजने के लिए। कर्सर के नीचे PSI तत्व (या कर्सर के नीचे टोकन ट्री में प्रत्यक्ष माता-पिता) एक PsiNamedElement या उसके संदर्भ में होना चाहिए। IDEA, PsiNamedElement.getName () द्वारा लौटाए गए पाठ को खोजने के लिए कैश शब्द का उपयोग करेगा। यदि PsiNamedElement पाठ श्रेणी में getName () द्वारा लौटाए गए पहचानकर्ता के अलावा अन्य पाठ शामिल हैं, तो शुरुआती पहचानकर्ता को वापस करने के लिए getTextOffset () विधि को फिर से लिखना चाहिए;
- एक आइटम मिल जाने पर, IDEA FindUsagesProvider को कॉल करता है। canFindUsagesFor () यह पता लगाने के लिए कि क्या इस तत्व पर कोई कार्रवाई लागू होती है;
- जब उपयोगकर्ता को खोज Usages संवाद दिखाया जाता है, तो IDEA, FindUsagesProvider.getType () और FindUsagesProvider.getDescriptiveName () को निर्धारित करने के लिए कहता है कि यह तत्व कैसे प्रदर्शित किया जाना चाहिए;
- प्रत्येक फ़ाइल में पाए गए शब्दों के लिए, IDEA एक PSI ट्री बनाता है और एक पुनरावर्ती वंश निष्पादित करता है। आईडीईए प्रत्येक तत्व के पाठ को शब्दों में तोड़ता है और उन्हें स्कैन करता है। यदि किसी तत्व को एक पहचानकर्ता के रूप में अनुक्रमित किया जाता है, तो प्रत्येक शब्द के लिए यह जाँच की जाती है कि क्या वह खोजे जाने वाले तत्व की ओर इशारा करता है;
- सभी उपयोग पाए जाने के बाद, परिणाम usages पैनल में प्रदर्शित किए जाते हैं। उपयोगकर्ता को प्रदर्शित करने के लिए पाठ FindUsagesProvider.getNodeText () विधि से लिया गया है।
Find Usages पैनल के शीर्षक में पाए गए तत्व के नाम को सही ढंग से प्रदर्शित करने के लिए, ElementDescriptionProvider इंटरफ़ेस का कार्यान्वयन प्रदान करना आवश्यक है। इस मामले में प्रदाता को दिए गए ElementDescriptionLocation ऑब्जेक्ट को वास्तविक प्रकार UseViewLongNameLocation का होना चाहिए।
उदाहरण:
ElementDescriptionProvider गुण प्लगइन के लिए।
अगले भाग में: रिफैक्टरिंग, प्रारूपण आदि।
चक्र के सभी लेख: 1 , 2 , 3 , 4 , 5 , 6 , 7 ।