Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[jdt-core-dev] How to manage multiple modifications on the same AST


Hello everybody,

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?


Thank you very much

--
Mohammad Ghafari

DeepSE group @ DEIB - Politecnico di Milano
http://home.deib.polimi.it/ghafari


Back to the top