在antlr4中进行多次评论重构

时间:2014-02-14 11:45:54

标签: antlr4

本书给出了一个评论重写的例子(用于重构旧代码)。

public void exitVarDecl(..) { // lexmagic/ShiftVarComments.java
    Token semi = ctx.getStop();
    int i = semi.getTokenIndex();
    List<Token> cmtChannel =
    tokens.getHiddenTokensToRight(i, CymbolLexer.COMMENTS);
    if ( cmtChannel!=null ) {
        Token cmt = cmtChannel.get(0);
        if ( cmt!=null ) {
            String txt = cmt.getText().substring(2);
            String newCmt = "/* " + txt.trim() + " */\n";
            rewriter.insertBefore(ctx.start, newCmt);
            rewriter.replace(cmt, "\n");
        }
    }
}

不幸的是旧代码从未如此简单。通常人们会在代码之间放置代码,而不是仅仅在结尾处,例如:

// here is a simple array initialization
int index[2] = {  // list of parameter indices
   1,             // index for PARAM_A
   4              // index for PARAM_D
};                // finally terminating

图书代码只会打印最后一条评论。如何修改此代码,以便现在处理以前打印的所有注释?

1 个答案:

答案 0 :(得分:0)

最后一条评论是你的varDecl权利的唯一评论。你的varDecl不会完成,直到&#34;};&#34;。您查找的其他注释分散在VarDecl AST的解析树节点之间(更像是之间)。要收集所有这些,你需要将它们全部捕获。

看看

public List getTokens(int start,int stop,Set types)

在BufferedTokenStream(CommonTokenStream的超类)中。在exitVarDecl方法中,您可以使用ctx.getStart()和ctx.getStop()来获取前两个参数,然后传入包含CymbolLexer.COMMENTS的集合。那应该会给你所有的评论里面你的varDecl(你已经有了代码来获取外面的第一条评论。

相关问题