这是一个时髦的脚本,它从一个编译单元中提取一个类成员,并将其存储在名为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