使用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范围内创建副本。

任何指针都非常有用!

最佳答案

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

10-08 13:39