这是一个时髦的脚本,它从一个编译单元中提取一个类成员,并将其存储在名为Member的模型中,然后尝试将其添加到另一个编译单元中。

我对最后一部分有疑问,谁能帮我。我已经通过jdt javadoc进行了超链接一段时间,但似乎找不到正确的执行顺序

void addMemberToTargetSourceFile(CompilationUnit cu2,  List<Member> memberToBeAddedToTargets){
    cu2.recordModifications();

    for(m in memberToBeAddedToTargets){
        AbstractTypeDeclaration type = (AbstractTypeDeclaration)cu2.types().get(0)
        type.add(m.node.asType( ASTNode.nodeClassForType(m.node.getNodeType()))
    }
    ASTRewrite astRewrite= ASTRewrite.create(cu2.getAST())
    Document doc = new Document(cu2.toString())
    TextEdit edit= astRewrite.rewriteAST(doc, null)
    edit.apply(doc)

    println "${edit.toString()}"
}

最佳答案

由于(无法实现的缺点是,如果没有强类型输入,这样的异常就可以清楚地查明原因,那么这样的异常就可以隐藏)。

Exception in thread "main" java.lang.IllegalArgumentException
at org.eclipse.jdt.core.dom.ASTNode.checkNewChild(ASTNode.java:1901)
at org.eclipse.jdt.core.dom.ASTNode$NodeList.add(ASTNode.java:1269)


ASTNode.checkNewChild具有引用相等性检查,用于比较每个节点的AST。
包私有访问修饰符使其无法覆盖。

想到的唯一解决方案是更改库中的ASTNode

08-26 12:12