Целью является вставка кодов для контроля входа и выхода из синхронизированного блока Java.
т.е.
enteringSync();
synchronized(lockObj){
enteredSync();
...
leavingSync();
}
leftSync();
Моя первоначальная мысль заключалась в том, чтобы внедрить методы ввода/вывода (которые добавляют поддеревья вокруг блока синхронизации Java), а затем распечатать полученный 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);
}
}