扩展代码完成以支持内部 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...
并粘贴您想要检测的样本:
如题中所述,我需要扩展代码完成以支持内部 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...
并粘贴您想要检测的样本: