【问题标题】:Eclipse AST not changing files which are not opened in eclipseEclipse AST 不更改未在 Eclipse 中打开的文件
【发布时间】:2014-03-11 06:20:00
【问题描述】:

我正在尝试使用 Eclipse 插件、JDT 和 AST(抽象语法树)来修改源代码。我可以读取所有 Java 文件并对所有这些文件进行操作,但是当我使用

将这些更改(编辑)保存到文件中时
    TextEdit edits = rewriter.rewriteAST();
    // apply the text edits to the compilation unit
    edits.apply(document);
    iCompilationUnit.getBuffer().setContents(document.get());

它只对在 eclipse 中以未保存模式打开的文件进行更改。其余文件不受影响。

在下面找到我的代码 sn-p:

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());

【问题讨论】:

    标签: eclipse-plugin abstract-syntax-tree eclipse-jdt


    【解决方案1】:

    尝试:

    1. 将 TextEdit 直接应用到 ICompilationUnit,而不是使用 Document。
    2. 使用 ICompilationUnit.commitWorkingCopy 保存更改

    我使用类似这样的代码:

    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());   
    

    【讨论】:

    • 谢谢@christoph.keimel
    猜你喜欢
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 2011-02-16
    • 2012-03-29
    相关资源
    最近更新 更多