IntelliJ IDEA प्लगइन विकास। भाग 5

इस भाग में: हाइलाइटिंग, लिंक सिस्टम, स्वतः पूर्णता, कोड नेविगेशन। पिछला हिस्सा यहाँ है

सिंटेक्स और त्रुटि हाइलाइटिंग


यह निर्धारित करने के लिए कि किस प्रकार संबंधित पाठ श्रेणी को हाइलाइट किया जाना चाहिए, यह निर्धारित करने के लिए 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 () विधि। इन इंटरफेस में कई जटिलताएं हैं जो अधिकांश उपयोगकर्ता भाषाओं के लिए आवश्यक नहीं हैं (उदाहरण के लिए, सामान्य प्रकार के प्रतिस्थापन के लिए समर्थन), लेकिन वे आवश्यक हैं यदि उपयोगकर्ता भाषा जावा कोड का संदर्भ दे सकती है। यदि जावा के साथ इंटरऑपरेबिलिटी की आवश्यकता नहीं है, या अन्य कारण हैं, तो प्लगइन लिंक रिज़ॉल्यूशन के मानक कार्यान्वयन को ओवरराइड कर सकता है।

मानक आईडिया हेल्पर वर्गों को निम्नलिखित घटकों से मिलकर संदर्भ हल करने के लिए उपयोग किया जाता है:

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() { //  ,   Contributor return ReferenceProvidersRegistry.getReferencesFromProviders(this); } } 

कोड पूरा हो रहा है


ऑटो-समापन के दो मुख्य प्रकार हैं जो एक कस्टम भाषा प्लग-इन में उपयोग किए जा सकते हैं: एक साधारण लिंक ऐड-ऑन और एक प्रदाता-आधारित ऐड-ऑन।

सरल ऑटो-पूरा

ऐड-ऑन सूची को पॉप्युलेट करने के लिए, IDEA PsiReference.getVariants () विधि को या तो कर्सर के नीचे लिंक पर या डमी तत्व में कर्सर के नीचे रखा गया है। इस पद्धति में स्ट्रिंग, PSI तत्वों या लुकअप क्लास के उदाहरण वाले ऑब्जेक्ट की एक सरणी वापस आनी चाहिए। यदि PsiElement का एक उदाहरण लौटे हुए सरणी में मिलता है, तो संबंधित आइकन को परिवर्धन की सूची में प्रदर्शित किया जाएगा।
GetVariants () को लागू करने का सबसे सामान्य तरीका समान ट्री ट्रैवर्सल फ़ंक्शन का उपयोग करना है जैसा कि PsiReference.resolve () विधि में है, लेकिन सभी मिली परिभाषाओं को वापस करना।

प्रदाता-आधारित ऑटो-पूर्णता

कम्प्लीशनकंटेनर इंटरफेस के आधार पर ऐड-ऑन का कार्यान्वयन कोड पूरा होने के संचालन पर सबसे अधिक नियंत्रण देता है।
पूर्णता योगदानकर्ता का उपयोग करने के लिए मुख्य परिदृश्य में विस्तार () पद्धति को कॉल करना और "पैटर्न" पैरामीटर में उचित संदर्भ पास करना शामिल है जिसमें यह ऐड-ऑन विकल्प लागू होता है, ऐड-ऑन प्रदाता, जो ऑटो-पूर्ण सूची में संबंधित आइटम उत्पन्न करता है, "प्रदाता" पैरामीटर को पास किया जाता है।

उदाहरण: MANIFEST.MF फ़ाइलों में कीवर्ड के स्वत: पूर्णीकरण के लिए पूर्णविराम सहायक।

ऑटो-पूर्ण सूची में आइटम लुकअप इंटरफ़ेस के उदाहरणों द्वारा दर्शाए जाते हैं। इन ऑब्जेक्ट्स को आमतौर पर लुकअपएलेमेंटबल का उपयोग करके बनाया जाता है। उनमें से प्रत्येक के लिए, आप निम्नलिखित विशेषताओं को परिभाषित कर सकते हैं:

उपयोग खोज


IDEA में Usages की कार्रवाई एक बहु-चरण प्रक्रिया है, जिसके प्रत्येक चरण में प्लग-इन से भागीदारी की आवश्यकता होती है: एक्सटेंशन पॉइंट com.intellij.lang.find.sagesProvider में FindUsagesProvider के कार्यान्वयन और पंजीकरण के रूप में, साथ ही कार्यक्रम संरचना (PsiNamedElement और Psference) के कार्यान्वयन की विशेषताएं। ।

उदाहरण: गुणों के लिए FindUsagesProvider को लागू करना

इस फ़ंक्शन को लागू करने के लिए, निम्न चरणों का पालन करना चाहिए:

Find Usages पैनल के शीर्षक में पाए गए तत्व के नाम को सही ढंग से प्रदर्शित करने के लिए, ElementDescriptionProvider इंटरफ़ेस का कार्यान्वयन प्रदान करना आवश्यक है। इस मामले में प्रदाता को दिए गए ElementDescriptionLocation ऑब्जेक्ट को वास्तविक प्रकार UseViewLongNameLocation का होना चाहिए।

उदाहरण: ElementDescriptionProvider गुण प्लगइन के लिए।

अगले भाग में: रिफैक्टरिंग, प्रारूपण आदि।

चक्र के सभी लेख: 1 , 2 , 3 , 4 , 5 , 6 , 7

Source: https://habr.com/ru/post/In187292/


All Articles