2017-02-16 53 views
0

我想用Java AST編輯幾個Java類。但是我的更改不會顯示在Java類文件中。Eclipse AST在更改時不改變類文件TypeDeclaration

我想要做什麼?我想採取IPackageFragment並訪問所有ICompilationUnit s。對於每個聲明的類,我想將超類設置爲特定的類(使用超類的限定名稱because it is an Xtend class)。我也嘗試通過Document課程進行編輯。

例如:main.model.someClass應該wrappers.main.model.someClassWrapper

繼承我是相對較新的JDT API,所以我找不到爲什麼類文件不改變的原因。我已經檢查過this post,但它沒有幫助我。我試圖儘可能接近來自How To Train the JDT Dragon的其他提示/示例,我從Stackoverflow獲得了這些示例。但它不會工作。

這是我要做的事:

private void editTypesIn(IPackageFragment myPackage) throws JavaModelException { 
    for (ICompilationUnit unit : myPackage.getCompilationUnits()) { 
     TypeVisitor visitor = new TypeVisitor(myPackage.getElementName(), unit); 
     unit.becomeWorkingCopy(new NullProgressMonitor()); 
     CompilationUnit parse = parse(unit); 
     parse.recordModifications(); 
     parse.accept(visitor); 
    } 
} 

private static CompilationUnit parse(ICompilationUnit unit) { 
    ASTParser parser = ASTParser.newParser(AST.JLS8); 
    parser.setKind(ASTParser.K_COMPILATION_UNIT); 
    parser.setSource(unit); 
    parser.setResolveBindings(true); 
    return (CompilationUnit) parser.createAST(null); // parse 
} 

這是訪問者類:

public class TypeVisitor extends ASTVisitor { 
    private final String currentPackage; 
    private final ICompilationUnit compilationUnit; 

    public TypeVisitor(String currentPackage, ICompilationUnit compilationUnit) { 
     this.currentPackage = currentPackage; 
     this.compilationUnit = compilationUnit; 
    } 

    @Override 
    public boolean visit(TypeDeclaration node) { 
     if (!node.isInterface()) { // is class 
      setSuperClass(node, "wrappers." + currentPackage + "." + node.getName().toString() + "Wrapper"); 
     } 
     return super.visit(node); 
    } 

    public void setSuperClass(TypeDeclaration declaration, String qualifiedName) { 
     try { 
      // create ast and rewrite: 
      AST ast = declaration.getAST(); 
      ASTRewrite astRewrite = ASTRewrite.create(ast); 
      // set super: 
      Name name = ast.newName(qualifiedName); 
      Type type = ast.newSimpleType(name); 
      declaration.setSuperclassType(type); 
      // apply changes 
      TextEdit edits = astRewrite.rewriteAST(); 
      compilationUnit.applyTextEdit(edits, new NullProgressMonitor()); 
      compilationUnit.commitWorkingCopy(true, new NullProgressMonitor()); 
     } catch (JavaModelException exception) { 
      exception.printStackTrace(); 
     } catch (IllegalArgumentException exception) { 
      exception.printStackTrace(); 
     } catch (MalformedTreeException exception) { 
      exception.printStackTrace(); 
     } 
    } 
} 

在此先感謝您的幫助!

回答

1

我想你的編輯將是空的,對吧?

通過致電CompilationUnit.recordModifications()您告訴AST內部創建一個ASTRewrite,其中將記錄修改。

通過ASTRewrite.create(..)您正在創建一個第二個ASTRewrite不知道所記錄的修改。

用於使用記錄的修改的唯一API是CompilationUnit.rewrite(IDocument,Map)(請參閱字段AST.rewriter的參考)。

如果您需要使用自己的ASTRewrite,請使用「描述性方法」,例如使用ASTRewrite.set(..)

+0

感謝您的幫助,我現在就開始工作! – ConveniencePatterns