检查重写器是否有任何更改
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)。
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)。