2015-12-17 18 views
8

Ich entwickle ein Plugin für intellij und ich möchte benutzerdefinierte Vorschläge zu XML-Editor basierend auf einem xsd hinzufügen. Bis jetzt kann ich erforderliche Vorschläge von der xsd Datei erhalten.Intellij Completion Contributor

Ich habe einen Abschluss Beitrag für XML implementiert als

import com.intellij.codeInsight.completion.*; 
import com.intellij.codeInsight.lookup.LookupElementBuilder; 
import com.intellij.patterns.PlatformPatterns; 
import com.intellij.psi.xml.XmlElementType; 
import com.intellij.util.ProcessingContext; 
import com.intellij.lang.xml.*; 
import org.jetbrains.annotations.NotNull; 


public class SimpleCompletionContributor extends CompletionContributor { 
    public SimpleCompletionContributor() { 
     extend(CompletionType.BASIC,PlatformPatterns.psiElement(XmlElementType.XML_ATTRIBUTE_VALUE).withLanguage(XMLLanguage.INSTANCE), 
      new CompletionProvider<CompletionParameters>() { 
       public void addCompletions(@NotNull CompletionParameters parameters, 
              ProcessingContext context, 
              @NotNull CompletionResultSet resultSet) { 
        resultSet.addElement(LookupElementBuilder.create("Hello")); 
       } 
      } 
     ); 
    } 
} 

folgt aber diese bieten keinen Vorschlag. aber wenn ich eine benutzerdefinierte Sprache implementiere, funktioniert es. Mein Ziel ist es, den Kontext der Cursorposition zu sehen und basierend darauf einen Vorschlag zu machen. Als ein Beispiel, wenn Benutzer ein Tag auf XML-Datei-Plugin startet, sollten Attribute als Code-Vervollständigung bereitstellen. Ich bin neu in dieser benutzerdefinierten Sprache.

Also kann mir jemand mit diesem Abschluss Beitrag helfen?

+0

Wie haben Sie diesen Mitarbeiter in plugin.xml registriert? –

+0

Ich füge hinzu –

Antwort

1

schließlich fand ich einen Weg, um dieses Problem

hier zu lösen, ist mein Code

import com.intellij.codeInsight.completion.*; 
import com.intellij.codeInsight.lookup.LookupElementBuilder; 
import com.intellij.patterns.PlatformPatterns; 
import com.intellij.util.ProcessingContext; 
import org.jetbrains.annotations.NotNull; 

public class ScalaXMLCompletionContributor extends CompletionContributor { 

public ScalaXMLCompletionContributor() { 
    final RelativeNodes rlt = new RelativeNodes();//this is a class to get siblings and children from a sample xml file generated by a given xsd 

    /*if the parameter position is an xml attribute provide attributes using given xsd*/ 
    extend(CompletionType.BASIC, 
      PlatformPatterns.psiElement(), new CompletionProvider<CompletionParameters>() { 
       public void addCompletions(@NotNull CompletionParameters parameters,//completion parameters contain details of the curser position 
              ProcessingContext context, 
              @NotNull CompletionResultSet resultSet) {//result set contains completion details to suggest 
        if (parameters.getPosition().getContext().toString() == "XmlAttribute") {//check whether scala text editors position is an xml attribute position eg: <name | 
         try { 
          String[] suggestions = rlt.getAttribute(parameters.getPosition().getParent().getParent().getFirstChild().getNextSibling().getText().replaceFirst("IntellijIdeaRulezzz", ""));//extract text from completion parameter and get required suggestions from RelativeNodes 

          int i = 0; 
          do { 
           resultSet.addElement(LookupElementBuilder.create(suggestions[i]));//add suggestions to resultset to suggest in editor 
           i++; 

          } while (suggestions[i] != null); 


         } catch (NullPointerException e) { 
         } 
        } 

       } 
      } 
    ); 
    } 
    } 

in diesem Fall wir Cursorposition erhalten und Token bezogene Position durch Abschluss Parameter Curser und wir können Vorschläge injizieren Verwenden von cppleplection resultset. Dies kann auch in der Scala-Sprache implementiert werden.

Abschluss Beitrag in Plugin xml

<extensions defaultExtensionNs="com.intellij"> 
<completion.contributor language="Scala" implementationClass="com.hsr.ScalaXMLCompletionContributor"/> 
</extensions> 
1

JavaDoc für com.intellij.codeInsight.completion.CompletionContributor enthält FAQ zu registrieren. Die last question Adressen Debugging funktioniert nicht abgeschlossen.

In meinem Fall Problem war language="Java", während alle Kappen erwartet.