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...
を開き、検出したいもののサンプルを貼り付け勧め:
は、詳細な回答のために、ありがとうございました。 PsiMethodCallExpression要素を見つけるまで親をループしています。次に、.resolveMethod()。getContainingClass()を使用しています。しかし、スーパークラスのBaseModel(.getメソッドが宣言されているところ)を取得し、サブクラスは取得しません。任意のヒント? – ul1sses
気にしないで、すでに方法を見つけました: ' PsiReferenceExpressionImpl referenceExpression =(PsiReferenceExpressionImpl)parent.getFirstChild()。getFirstChild(); PsiClassReferenceType classReferenceType =(PsiClassReferenceType)referenceExpression.getType(); ' – ul1sses