2015-12-17 13 views
8

Sto sviluppando un plug-in per intellij e voglio aggiungere suggerimenti personalizzati all'editor xml basato su xsd. Fino ad ora posso ottenere i suggerimenti richiesti dal file xsd.Intellij Completion Contributor

ho implementato un collaboratore di completamento per XML come segue

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

ma questo non ha fornito alcun suggerimento. ma quando implemento il linguaggio personalizzato funziona. Il mio obiettivo è visualizzare il contesto della posizione del cursore e fornire suggerimenti basati su di esso. come esempio, quando l'utente avvia un tag sul file xml, il plugin deve fornire attributi come completamento del codice. Sono nuovo di questo linguaggio personalizzato.

Quindi qualcuno può aiutarmi con questo contributore di completamento?

+0

Come hai registrato questo contributore in plugin.xml? –

+0

Aggiungo

risposta

1

finalmente ho trovato un modo per risolvere questo problema

ecco mio codice

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 questo caso si può ottenere la posizione del cursore e gettoni collegati cursore posizione dai parametri di completamento e possiamo iniettare suggerimenti utilizzando il resultset cpmpletion. questo può essere implementato anche in scala.

per registrare collaboratore completamento nel plugin XML

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

JavaDoc per com.intellij.codeInsight.completion.CompletionContributor contiene FAQ. Gli indirizzi last question non riescono a completare il debug.

Nel mio caso il problema era language="Java", mentre tutte le protezioni previste.