I need to
visit each method declaration within a class in order to
add some comments to the methods in the given class.
void parseMethodDeclaration() {
ICompilationUnit unit = getCompilationUnitByName(unitName);
ASTParser parser = ASTParser.newParser(AST.JLS4);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(unit);
parser.setResolveBindings(true);
CompilationUnit parse = (CompilationUnit) parser.createAST(null);
parse.accept(new ASTVisitor() {
@Override
public boolean visit(MethodDeclaration node) {
String unitName = node.resolveBinding().getDeclaringClass().getName();
//
if some conditions are satisfied
addComment(unitName, node);
return super.visit(node);
}
});
}
And the addComment
method is defined as follows to add comments to the given
method:
void addComment(String unitName, MethodDeclaration method){
ICompilationUnit unit = getCompilationUnitByName(unitName);
AST ast = method.getAST();
ASTRewrite rewriter = ASTRewrite.create(ast);
ListRewrite listRewrite = rewriter.getListRewrite(method.getBody(),
Block.STATEMENTS_PROPERTY);
Statement placeHolder = (Statement)rewriter.createStringPlaceholder("//MyComment",
ASTNode.EMPTY_STATEMENT);
listRewrite.insertFirst(placeHolder, null);
TextEdit edits = rewriter.rewriteAST();
Document document = new Document(unit.getSource());
edits.apply(document);
unit.getBuffer().setContents(document.get());
}
This code works properly to add comments to the first
visited method, but it doesn't apply comments in the right
place in other methods. The problem originates from the fact
that I'm using the original AST to visit each method while
its corresponding sourcecode (ICompilationUnit) will be
changed after the comments are added to the first method.
Then, listRewrite.insertFirst will put the comment
in a wrong place.
Do you know how can I resolve this issue? Is there anyway to
update the original AST as well?