扩展代码完成以支持内部 orm

Extending code completion to support internal orm

如题中所述,我需要扩展代码完成以支持内部 ORM。

它类似于 ActiveRecords。例如:

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

}

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

因此,例如,在 de .get 方法内的引号之间使用插入符号时使用智能完成时,我需要根据 table 列显示参数选项。

类似的东西可以用 Intellij 插件制作吗?

我正在阅读有关 CompletionContributor 的信息,但找不到任何关于识别 class 其方法被调用的可能性的任何信息,它是超级 class,它是注释值。

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 的第二个参数允许您在特定类型的 PSI 元素上触发您的提供程序。在您的情况下,您可以定位 PlatformPatterns.psiElement(JavaElementType.LITERAL_EXPRESSION) 之类的内容,然后在您的 CompletionProvider 中,您可以使用 parameters.getPosition() 检查确切的元素,看看它是否是 PsiLiteral 代表 String.

使用 PSI API,然后您可以发现此文字周围的内容,例如 类 如果包含文件是 PsiClassOwner,或者 PsiTreeUtil.getParentOfType() 等。

在您的具体示例中,您可以检查字符串文字是否是 PsiMethodCallExpression 的一部分。

为了轻松理解 PSI 树是如何构建的,我强烈建议您打开 Tools > View PSI Structure... 并粘贴您想要检测的样本: