2017-04-11 119 views
0

我配置了结构化语言的语法,现在想要编写自动完成行为。有没有一种方法可以基于这样定义的语法来生成?如何通过语法结构生成自动完成?

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

击中自动完成热键ROOT后应建议END,姓名和头衔 - 这是在语法

这里明确规定是完整的语法链接:https://raw.githubusercontent.com/dnltsk/intellij-mapfile-plugin/master/src/org/dnltsk/mapfileplugin/Mapfile.bnf

回答

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)); 
    } 
} 

这会导致预期的行为。我希望这有助于其他人,请让我知道是否有更好的解决方案。