В книге приведен пример перезаписи комментариев (для рефакторинга старого кода).многократный рефакторинг комментариев в 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
Книга код будет печатать только последний комментарий. Как изменить этот код, чтобы все комментарии С предыдущей печати будут обработаны сейчас?
'cmtChannel.get (0)' получает только первый комментарий - попробуйте выполнить итерацию через все возможные Если это не сработает, вы можете выполнить итерацию через декларацию и получить «первый комментарий» в каждом литерале. – petrbel
У вас нет ошибок с этим вводом? Предполагая, что вы имеете в виду Cymbol.g4, и он не изменяется. – cantSleepNow