ANTLR4を使用して追加のコード行を挿入する
-
21-12-2019 - |
質問
ターゲットは、Java同期ブロックのエントリと終了を監視するためのコードを挿入することです。
すき。
enteringSync();
synchronized(lockObj){
enteredSync();
...
leavingSync();
}
leftSync();
.
私のオリジナルの考えは、Enter / Exitリスナーメソッド(Java Synchronizdブロックの周囲にサブツリーを追加する)を実装し、次に結果として生成されたASTを印刷することでした。今、AntLR4が木の修正をサポートしていないようであることに気づきました。
解決
最良の解決策は、解析木を操作するのではなくトークンストリーム書き換えエンジンを使用することです。例としての本。 http://amzn.com/1934356999 。これは、シリアル化識別子をクラスボディに挿入するコードスニペットです。
public class InsertSerialIDListener extends JavaBaseListener {
TokenStreamRewriter rewriter;
public InsertSerialIDListener(TokenStream tokens) {
rewriter = new TokenStreamRewriter(tokens);
}
@Override
public void enterClassBody(JavaParser.ClassBodyContext ctx) {
String field = "\n\tpublic static final long serialVersionUID = 1L;";
rewriter.insertAfter(ctx.start, field);
}
}
. 所属していません StackOverflow