1

これは、1 つのコンパイル ユニットからクラス メンバーを抽出し、それを Member という名前のモデルに格納してから、それを別のコンパイル ユニットに追加しようとする groovy スクリプトです。

最後の部分に問題があります。誰か助けてください。しばらくの間、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()}"
}
4

1 に答える 1

0

これは実行できません (グルーヴィーな欠点は、強い型付けを行わないと、原因を明確に特定するこのような例外が隠されたままである可​​能性があることです)

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 を変更することです

于 2012-11-17T02:37:09.617 に答える