检查重写器是否有任何更改

Check if rewriter has any changes

CommonTokenStream tokens = new CommonTokenStream(new JavaLexer(CharStreams.fromPath(path)));

JavaParser parser = new JavaParser(tokens);
TokenStreamRewriter rewriter = new TokenStreamRewriter(tokens);
var myVisitor= new MyVisitor(rewriter);

myVisitor.visit(parser.compilationUnit());
try (PrintWriter out = new PrintWriter(path.toFile())) {
    out.print(rewriter.getText());
}

MyVisitor 使用 TokenStreamRewriter 更改输入文件。但有时没有什么可以改变的。如果 MyVisitor 没有更改文件,那么我就不必调用 getText() 也不必写回文本。 (因为我的文件很大)

我可以从重写器那里知道文件是否有任何更改吗?

我试图检查 rewriter.getLastRewriteTokenIndex,但它总是 -1。

稍微考虑了一下,我相信这应该能满足您的需求:

package org.antlr.v4.runtime;

import org.antlr.v4.runtime.TokenStream;
import org.antlr.v4.runtime.TokenStreamRewriter;

public class MyTokenStreamRewriter extends TokenStreamRewriter {
    public MyTokenStreamRewriter(TokenStream tokens) {
        super(tokens);
    }

    public int getRewriteCount() {
        return getRewriteCount(DEFAULT_PROGRAM_NAME);
    }

    public int getRewriteCount(String programName) {
        return programs.get(programName).size();
    }
}

然后,创建一个 MyTokenStreamRewriter(或您想要的任何名称)而不是 TokenStreamRewriter。您真的想知道为给定程序或默认程序安排了多少次重写(不是真正的 tokenIndex)。