2014-01-15 37 views
1

使用Eclipse JDT我想將來自多個源CompilationUnits的代碼複製到中央CompilationUnit。如何複製節點(如果它們不屬於相同的AST)

我正在使用ASTRewrite來收集所有更改。爲了複製代碼,我使用ASTRewrite.createCopyTarget(ASTNode)創建一個虛擬副本,然後將其添加到我的中央CompilationUnit中。我的問題是ASTRewrite.createCopyTarget(ASTNode)拋出IllegalArgumentException:

java.lang.IllegalArgumentException: Node is not inside the AST 
    at org.eclipse.jdt.core.dom.rewrite.ASTRewrite.validateIsCorrectAST(ASTRewrite.java:582) ~[na:na] 
    at org.eclipse.jdt.core.dom.rewrite.ASTRewrite.createTargetNode(ASTRewrite.java:698) ~[na:na] 
    at org.eclipse.jdt.core.dom.rewrite.ASTRewrite.createCopyTarget(ASTRewrite.java:723) ~[na:na] 

的ASTRewrite是使用中央目標CompilationUnit AST的設置。所以問題是:是否有可能解析多個單元,因此它們屬於同一個AST?或者是否可以通過某種方式設置CompilationUnit的父AST?

我解析的代碼如下所示:

private static ASTParser parser = ASTParser.newParser(AST.JLS4); 
public static CompilationUnit parseAst(IType type, SubMonitor progress) { 
    parser.setSource(type.getCompilationUnit()); 
    parser.setResolveBindings(true); 
    return (CompilationUnit)parser.createAST(progress); 
} 

我認爲,這必須以某種方式成爲可能,否則ASTRewrite.createCopyTarget(ASTNode)將在CompilationUnit的範圍僅限於創建僅複製。

任何指針都非常appriciated!

回答

2

ASTRewrite只能用於轉換單個AST,而不能將節點或子樹從一個AST複製到另一個AST。如果你想從一個AST複製一個節點或子樹到另一個,你必須使用ASTNode.copySubtree(AST target, ASTNode node),它允許你指定目標AST。

+0

謝謝!正是我需要的:-) –

相關問題