如前所述,我需要扩展代码完成以支持内部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的内容,但无法找到有关识别正在调用其方法的类的可能性,它的超类以及它的注释值。
答案 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...
并粘贴一个想要检测的样本: