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

时间:2016-10-27 12:31:20

标签: intellij-plugin

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

它就像ActiveRecords。例:

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

}

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

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

可以用Intellij插件制作这样的东西吗?

我正在阅读有关CompletionContributor的内容,但无法找到有关识别正在调用其方法的类的可能性,它的超类以及它的注释值。

1 个答案:

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

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

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

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

enter image description here