2015-12-17 23 views
8

Pracuję nad wtyczką dla intellij i chcę dodać niestandardowe sugestie do edytora xml na podstawie xsd. Do tej pory mogę uzyskać wymagane sugestie z pliku xsd.Intellij Completion Contributor

I wprowadziły Współtwórcę zakończenia dla xml następująco

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")); 
       } 
      } 
     ); 
    } 
} 

ale to nie zawierały żadnych sugestii. ale kiedy implementuję niestandardowy język, to działa. Moim celem jest przeglądanie kontekstu pozycji kursora i dostarczanie sugestii na jej podstawie. jako przykład, gdy użytkownik uruchamia znacznik na wtyczce pliku xml powinien dostarczyć atrybutów jako uzupełnienie kodu. Jestem nowy w tym języku niestandardowym.

Czy ktoś może mi w tym pomóc?

+0

Jak zarejestrowałeś tego autora w plugin.xml? –

+0

Dodaję

Odpowiedz

1

końcu znalazłem sposób, aby rozwiązać ten problem

tutaj jest mój kod

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) { 
         } 
        } 

       } 
      } 
    ); 
    } 
    } 

w tym przypadku możemy uzyskać pozycję kursora i znaki związane z curser pozycję parametrów wykończenia i możemy wstrzyknąć propozycje przy użyciu zestawu wyników cpmpletion. można to również zaimplementować w języku scala.

zarejestrować zakończenia przyczynia się wtyczki xml

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

JavaDoc dla com.intellij.codeInsight.completion.CompletionContributor zawiera FAQ. Adres last question nie odpowiada za debugowanie.

W moim przypadku problem był language="Java", podczas gdy wszystkie czapki oczekiwano.