私は、Eclipseのjdtを使用してクラスの階層をプログラムで折りたたみます(1.すべてのメソッドとフィールドを親クラスに移動する、親クラスではなく、子供の親クラスのすべてのシステムでは1つの抽象あり、そして3参照場合) 私は手順1、2を完了したが、私はここで3
の問題を持っている私のコードは次のとおりです。既存の型を持つクラスを削除した後、eclipse jdtの未解決の型を置き換えます。
//update the references to the parent class
IPackageFragment classChangedPackage = rootpackage.getPackageFragment("net.sourceforge.ganttproject");
ICompilationUnit ClassChangedCU = classChangedPackage.getCompilationUnit("GanttProject" + ".java");
ASTParser parserClassChanged = ASTParser.newParser(AST.JLS8);
parserClassChanged.setSource(ClassChangedCU);
parserClassChanged.setKind(ASTParser.K_COMPILATION_UNIT);
parserClassChanged.setResolveBindings(true); // we need bindings later on
final CompilationUnit cuClassChanged = (CompilationUnit) parserClassChanged.createAST(null);
cuClassChanged.recordModifications();
rewrite = ASTRewrite.create(cuClassChanged.getAST());
TypeDeclaration typeDeclClassChanged = (TypeDeclaration) cuClassChanged.types().get(0);
cuClassChanged.accept(new CHtypeVisitor(rewrite,classSourceName,typeDeclClassChanged));
Document doc= new Document(typeDeclClassChanged.toString());
TextEdit edits = rewrite.rewriteAST(doc, null);
try {
edits.apply(doc);
} catch (MalformedTreeException e) {
e.printStackTrace();
} catch (BadLocationException e) {
e.printStackTrace();
}
ClassChangedCU.getBuffer().setContents(doc.get());
と私の訪問者コード:
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.PrimitiveType;
import org.eclipse.jdt.core.dom.SimpleType;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
public class CHtypeVisitor extends ASTVisitor {
private ASTRewrite rewrite;
private String childTypeName;
private TypeDeclaration targetType;
public CHtypeVisitor(ASTRewrite rewrite, String childTypeName, TypeDeclaration targetType) {
super();
this.rewrite = rewrite;
this.childTypeName = childTypeName;
this.targetType = targetType;
}
@Override
public boolean visit(SimpleType node) {
if (node.toString().equals(childTypeName)) {
System.out.println("child type detected: "
+ node.getStartPosition());
// 1
rewrite.replace(node,
rewrite.getAST().newPrimitiveType(PrimitiveType.INT), null);
}
return true;
}
}
しかし、intのようなプリミティブで置き換えても機能しません。
私が望むのは、未解決の型のためにプログラムのようなものをeclipse quickfix(jdt CorrectionEngine)のように適用し、置換する型(子クラス)と置換(子クラス)を引数として指定することです。
文書は、テキスト編集がパーサに与えられたソースとしてまったく同じ内容を持っている必要があります適用する:
どうすればよいですか? –
子タイプをintプリミティブで置き換えることはありません –
訪問者が予想されるノードと名前に一致していますか?リライタはテキスト編集を行いますか?例外がスローされますか?その結果の内容はOKですか? –