2014-02-14 3 views
1

В книге приведен пример перезаписи комментариев (для рефакторинга старого кода).многократный рефакторинг комментариев в 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 

Книга код будет печатать только последний комментарий. Как изменить этот код, чтобы все комментарии С предыдущей печати будут обработаны сейчас?

+0

'cmtChannel.get (0)' получает только первый комментарий - попробуйте выполнить итерацию через все возможные Если это не сработает, вы можете выполнить итерацию через декларацию и получить «первый комментарий» в каждом литерале. – petrbel

+0

У вас нет ошибок с этим вводом? Предполагая, что вы имеете в виду Cymbol.g4, и он не изменяется. – cantSleepNow

ответ

0

Последний комментарий является единственным комментарием справа от вашего varDecl. Ваш varDecl не завершен до "};". Другие комментарии, которые вы ищете, разбросаны между узлами дерева разбора вашего VarDecl AST. Чтобы собрать всех из них, вам нужно будет все охотиться.

Посмотрите на

Публичный список getTokens (INT старт, стоп INT, Set типы)

В BufferedTokenStream (суперкласс CommonTokenStream). В методе exitVarDecl вы можете использовать ctx.getStart() и ctx.getStop(), чтобы получить 1-й два параметра, а затем передать набор, содержащий CymbolLexer.COMMENTS. Это должно дать вам все комментарии внутри ваш varDecl (и у вас уже есть код, чтобы получить первый комментарий снаружи.

Смежные вопросы