2016-10-27 9 views
0

このように、内部のORMをサポートするためにコード補完を拡張する必要があります。内部のormをサポートするようにコード補完を拡張する

ActiveRecordsのようなものです。例:

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

} 

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

ので、引用符の間キャレットがデに.getメソッドの内部で、例えば、私はテーブルの列に基づいてパラメータのオプションを表示する必要がある場合、スマート完了を使用した場合。

Intellijプラグインで作成することは可能でしょうか?

私はCompletionContributorについて読んでいましたが、メソッドが呼び出されているクラス、スーパークラス、および注釈の値を識別する可能性については何も見つかりませんでした。

答えて

1

CompletionContributorです。この例では、official SDK docsから取られる:

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

extendの2番目のパラメータは、あなたがPSI要素の特定の種類のプロバイダをトリガすることができます。あなたの場合は、PlatformPatterns.psiElement(JavaElementType.LITERAL_EXPRESSION)のようなものをターゲットに設定し、CompletionProviderでは正確な要素をparameters.getPosition()で確認し、がStringであるかどうかを確認できます。

PSIのAPIを使用して、含まれているファイルがPsiClassOwnerある場合は、その後、クラスと同様に、このリテラルの周りに何があるかを発見することができ、またはPsiTreeUtil.getParentOfType()となど

あなたの具体的な例では文字列リテラルである場合は、あなたがチェックできますPsiMethodCallExpressionの一部です。

簡単PSIツリーが構築されている方法を理解するために、私は非常にあなたがTools > View PSI Structure...を開き、検出したいもののサンプルを貼り付け勧め:

enter image description here

+0

は、詳細な回答のために、ありがとうございました。 PsiMethodCallExpression要素を見つけるまで親をループしています。次に、.resolveMethod()。getContainingClass()を使用しています。しかし、スーパークラスのBaseModel(.getメソッドが宣言されているところ)を取得し、サブクラスは取得しません。任意のヒント? – ul1sses

+0

気にしないで、すでに方法を見つけました: ' PsiReferenceExpressionImpl referenceExpression =(PsiReferenceExpressionImpl)parent.getFirstChild()。getFirstChild(); PsiClassReferenceType classReferenceType =(PsiClassReferenceType)referenceExpression.getType(); ' – ul1sses

関連する問題