如果节点不属于同一AST,如何复制节点

时间:2014-01-15 15:10:27

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

使用Eclipse JDT我想将来自多个源CompilationUnits的代码复制到中央CompilationUnit。

我正在使用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]

使用AST为中央目标CompilationUnit设置ASTRewrite。所以问题是:是否可以解析多个单元,因此它们属于同一个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范围内创建副本。

任何指针都非常受欢迎!

1 个答案:

答案 0 :(得分:2)

ASTRewrite只能用于转换单个AST,但不能用于将节点或子树从一个AST复制到另一个AST。如果要将节点或子树从一个AST复制到另一个AST,则必须使用ASTNode.copySubtree(AST target, ASTNode node)来指定目标AST。