如何通过语法结构生成自动完成?
How to generate autocompletion via grammar structure?
我配置了结构化语言的语法,现在想编写自动完成行为的代码。有没有办法根据这样定义的语法生成它?
RootObject ::= ROOT ( NameAttr | TitleAttr )* END
private NameAttr ::= NAME string
private TitleAttr ::= TITLE string
在 ROOT 后点击自动完成热键应该提示 END、NAME 和 TITLE - 这在语法中有明确定义
这里是 link 完整的语法:https://raw.githubusercontent.com/dnltsk/intellij-mapfile-plugin/master/src/org/dnltsk/mapfileplugin/Mapfile.bnf
在我发现 PsiElement 已经包含了类似 "FooTokenType.NAME, FooTokenType.TITLE or FooTokenType.END expected, got 'IntellijIdeaRulezzz'"
的一般错误描述后,我以一种非常务实的方式管理了自动完成:
public void addCompletions(@NotNull CompletionParameters parameters, ProcessingContext context, @NotNull CompletionResultSet resultSet) {
PsiElement element = parameters.getPosition().getParent();
String genericErrorDescription = ((PsiErrorElementImpl) element).getErrorDescription();
errorDescription = errorDescription.substring(0, errorDescription.indexOf(" expected, got "));
errorDescription = errorDescription.replaceAll("FooTokenType\.", "");
String[] suggestedTokens = errorDescription.split("(, )|( or )");
for (String suggestedToken : suggestedTokens) {
resultSet.addElement(LookupElementBuilder.create(suggestedToken));
}
}
这会导致预期的行为。我希望这对其他人有帮助,如果周围有更好的解决方案,请告诉我。
我配置了结构化语言的语法,现在想编写自动完成行为的代码。有没有办法根据这样定义的语法生成它?
RootObject ::= ROOT ( NameAttr | TitleAttr )* END
private NameAttr ::= NAME string
private TitleAttr ::= TITLE string
在 ROOT 后点击自动完成热键应该提示 END、NAME 和 TITLE - 这在语法中有明确定义
这里是 link 完整的语法:https://raw.githubusercontent.com/dnltsk/intellij-mapfile-plugin/master/src/org/dnltsk/mapfileplugin/Mapfile.bnf
在我发现 PsiElement 已经包含了类似 "FooTokenType.NAME, FooTokenType.TITLE or FooTokenType.END expected, got 'IntellijIdeaRulezzz'"
的一般错误描述后,我以一种非常务实的方式管理了自动完成:
public void addCompletions(@NotNull CompletionParameters parameters, ProcessingContext context, @NotNull CompletionResultSet resultSet) {
PsiElement element = parameters.getPosition().getParent();
String genericErrorDescription = ((PsiErrorElementImpl) element).getErrorDescription();
errorDescription = errorDescription.substring(0, errorDescription.indexOf(" expected, got "));
errorDescription = errorDescription.replaceAll("FooTokenType\.", "");
String[] suggestedTokens = errorDescription.split("(, )|( or )");
for (String suggestedToken : suggestedTokens) {
resultSet.addElement(LookupElementBuilder.create(suggestedToken));
}
}
这会导致预期的行为。我希望这对其他人有帮助,如果周围有更好的解决方案,请告诉我。