Как генерировать автозаполнение через структуру грамматики?

Я настроил грамматику структурированного языка и теперь хочу кодировать поведение автозаполнения. Есть ли способ генерировать это на основе грамматики, которая определена следующим образом?

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 ответ

Решение

После того, как я выяснил, что 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));
    }
}

Что приводит к ожидаемому поведению. Я надеюсь, что это поможет другим, и, пожалуйста, дайте мне знать, если есть лучшее решение вокруг.

Другие вопросы по тегам