Eclipse AST not changing files which are not opened in eclipse

别来无恙 提交于 2019-12-02 08:06:12

问题


I am trying to modify source code using eclipse plugin, JDT and AST (Abstract Syntax Tree). I can read all Java files and make operation on all those file, But when i am saving those changes (Edits) in to files using

    TextEdit edits = rewriter.rewriteAST();
    // apply the text edits to the compilation unit
    edits.apply(document);
    iCompilationUnit.getBuffer().setContents(document.get());

It only make changes in file those are open in eclipse in unsaved mode. Rest of files are not affected.

Find my code snippet below:

CompilationUnit cu = parse(iCompilationUnit);
    MethodVisitor visitor = new MethodVisitor();
    cu.accept(visitor);
    String source = iCompilationUnit.getSource();
    Document document= new Document(source);
    ASTRewrite rewriter = ASTRewrite.create(cu.getAST());
    cu.recordModifications();
    for (MethodDeclaration methodDeclaration : visitor.getMethods()) {
        System.out.print("Method name: " + methodDeclaration.getName()
                + " Return type: " + methodDeclaration.getReturnType2());
        MethodDeclaration methodDecl = methodDeclaration;
        Block block = methodDecl.getBody();
        ListRewrite listRewrite = rewriter.getListRewrite(block, Block.STATEMENTS_PROPERTY);
        Statement placeHolder = (Statement) rewriter.createStringPlaceholder("System.out.println(\"Test Print\");", ASTNode.EMPTY_STATEMENT);
        listRewrite.insertFirst(placeHolder, null);
    }
    TextEdit edits = rewriter.rewriteAST();
    // apply the text edits to the compilation unit
    edits.apply(document);
    iCompilationUnit.getBuffer().setContents(document.get());

回答1:


Try to:

  1. Apply the TextEdit directly to the ICompilationUnit instead of using Document.
  2. Use ICompilationUnit.commitWorkingCopy to save the changes

I use code similar to this:

iCompilationUnit.becomeWorkingCopy(new NullProgressMonitor());
CompilationUnit cu = parse(iCompilationUnit);
ASTRewrite rewriter = ASTRewrite.create(cu.getAST());

... process AST ...

iCompilationUnit.applyTextEdit(rewrite.rewriteAST(), new NullProgressMonitor());
iCompilationUnit.commitWorkingCopy(false, new NullProgressMonitor());   


来源:https://stackoverflow.com/questions/22317911/eclipse-ast-not-changing-files-which-are-not-opened-in-eclipse

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!