2016-10-27 5 views
0

Wie im Titel erwähnt, muss ich Code-Vervollständigung erweitern, um ein internes ORM zu unterstützen.Erweiterung des Codes zur Unterstützung interner ORM

Es ist so etwas wie ActiveRecords. Bsp .:

@TableName("ONE_MODEL") 
public class OneModel extends BaseModel { 

} 

... 
OneModel oneModel = OneModel.getById(1); 
Object value = oneModel.get("COLUMN_NAME"); 
... 

Also, bei der Verwendung von Smart-Abschluss, wenn caret zwischen Anführungszeichen innerhalb de .get Methode, zum Beispiel, ich brauche Optionen anzuzeigen Parameter basierend auf den Tabellenspalten.

So etwas ist mit Intellij Plugins möglich?

Ich habe über CompletionContributor gelesen, kann aber nichts über die Möglichkeit finden, die Klasse zu identifizieren, deren Methode aufgerufen wird, es ist Superklasse und es sind Annotationswerte.

Antwort

1

CompletionContributor ist der Weg zu gehen. Dieses Beispiel wird aus dem official SDK docs genommen:

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

Der zweite Parameter von extend können Sie Ihren Provider auf eine bestimmte Art von PSI-Element ausgelöst wird. In Ihrem Fall könnten Sie etwas wie PlatformPatterns.psiElement(JavaElementType.LITERAL_EXPRESSION) zielen, dann können Sie in Ihrem CompletionProvider nach dem genauen Element mit parameters.getPosition() suchen und sehen, ob es ein PsiLiteral ist, das eine String darstellt.

den PSI-API verwenden, können Sie dann entdecken, was um diesen wörtlichen ist, wie Klassen, wenn die enthaltende Datei ein PsiClassOwner oder mit PsiTreeUtil.getParentOfType() usw.

In Ihrem speziellen Beispiel ist, können Sie überprüfen, ob der Stringliteral ist Teil eines PsiMethodCallExpression.

Um leicht zu verstehen, wie das PSI Baum gebaut wird, empfehle ich Ihnen sehr Tools > View PSI Structure... öffnen und eine Probe von einfügen, was Sie suchen wollen:

enter image description here

+0

Danke, sehr viel, für die ausführliche Antwort. Ich bin Schleife durch Eltern, bis ein PsiMethodCallExpression-Element finden, dann verwende ich die. ResolveMethod(). GetContainingClass(). Aber es erhält die Superklasse BaseModel (wo die .get-Methode deklariert ist), nicht die Unterklasse. Irgendwelche Tipps? – ul1sses

+0

Haben Sie nichts dagegen, schon einen Weg gefunden: ' PsiReferenceExpressionImpl referenceExpression = (PsiReferenceExpressionImpl) parent.getFirstChild(). GetFirstChild(); PsiClassReferenceType classReferenceType = (PsiClassReferenceType) referenceExpression.getType(); ' – ul1sses

Verwandte Themen