如何通过语法结构生成自动完成?

时间:2017-04-11 21:54:03

标签: intellij-plugin jflex grammar-kit

我配置了结构化语言的语法,现在想要编写自动完成行为。有没有办法根据这样定义的语法生成它?

RootObject ::= ROOT ( NameAttr | TitleAttr )* END
private NameAttr ::= NAME string
private TitleAttr ::= TITLE string

在ROOT之后点击自动完成热键应该建议END,NAME和TITLE - 这在语法中有明确的定义

以下是完整语法的链接:https://raw.githubusercontent.com/dnltsk/intellij-mapfile-plugin/master/src/org/dnltsk/mapfileplugin/Mapfile.bnf

1 个答案:

答案 0 :(得分:0)

在我发现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));
    }
}

这会导致预期的行为。我希望这有助于其他人,如果有更好的解决方案,请告诉我。