【问题标题】:Find Token by Index for bracket matching按索引查找令牌以进行括号匹配
【发布时间】:2020-04-28 10:46:32
【问题描述】:

我正在扩展 ANTLR example plugin,以添加括号突出显示,所以我已经从 intellij sdk 实现了 PairedBraceMatcher 类,但是我找不到从索引中获取 PsiElement 的方法,这个是我尝试过的:

public class SampleBraceMather implements PairedBraceMatcher {
    private static final BracePair[] PAIRS = {
            new BracePair(TokenIElementType.find((short) 327), TokenIElementType.find((short) 328), true)
    };


    @NotNull
    @Override
    public BracePair[] getPairs() {
        return PAIRS;
    }

    @Override
    public boolean isPairedBracesAllowedBeforeType(@NotNull IElementType lbraceType, @Nullable IElementType contextType) {
        return true;
    }

    @Override
    public int getCodeConstructStart(PsiFile file, int openingBraceOffset) {
        return openingBraceOffset;
    }
}

这确实有效,但我不想对令牌索引进行硬编码(因为它们经常更改),到目前为止我所拥有的只是 SampleLanguageParser.LBRACESampleLanguageParser.RBRACE,它们是 ANTLR 令牌索引(11和 12)。

令牌索引(327 和 328)仅在 atn 类别下的(生成的)文件 SampleLanguageLexer.interop 中定义,但我不知道如何从那里获取这些值。

【问题讨论】:

    标签: java antlr syntax-highlighting intellij-plugin brackets


    【解决方案1】:

    我发现这是解决方案

        private static IElementType LBRACE;
        private static IElementType RBRACE;
        private static IElementType LBRACKET;
        private static IElementType RBRACKET;
        private static IElementType LPARENTHESIS;
        private static IElementType RPARENTHESIS;
    
        static {
            TokenIElementType.enumerate(type -> {
                if (type instanceof TokenIElementType) {
                    TokenIElementType antlrToken = (TokenIElementType) type;
                    switch (antlrToken.getANTLRTokenType()) {
                        case SampleLanguageParser.LBRACE:
                            LBRACE = type;
                            break;
                        case SampleLanguageParser.RBRACE:
                            RBRACE = type;
                            break;
                        case SampleLanguageParser.LBRACK:
                            LBRACKET = type;
                            break;
                        case SampleLanguageParser.RBRACK:
                            RBRACKET = type;
                            break;
                        case SampleLanguageParser.LPAREN:
                            LPARENTHESIS = type;
                            break;
                        case SampleLanguageParser.RPAREN:
                            RPARENTHESIS = type;
                            break;
                    }
                }
                return false; //Doesnt matter
            });
        }
    
        private static final BracePair[] PAIRS = {
                new BracePair(LBRACE, RBRACE, true), // {}
                new BracePair(LBRACKET, RBRACKET, false), // []
                new BracePair(LPARENTHESIS, RPARENTHESIS, false), // ()
        };
    

    但它似乎很冗长,欢迎任何其他解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-11
      • 2015-07-11
      • 1970-01-01
      • 2019-12-16
      • 1970-01-01
      • 2015-06-06
      相关资源
      最近更新 更多