2017-08-25 5 views
0

私は、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)のように適用し、置換する型(子クラス)と置換(子クラス)を引数として指定することです。

文書は、テキスト編集がパーサに与えられたソースとしてまったく同じ内容を持っている必要があります適用する:

+0

どうすればよいですか? –

+0

子タイプをintプリミティブで置き換えることはありません –

+0

訪問者が予想されるノードと名前に一致していますか?リライタはテキスト編集を行いますか?例外がスローされますか?その結果の内容はOKですか? –

答えて

0

は、私はあなたのコードのバグを見つけたと思います。

対照的に、typeDeclClassChanged.toString()からドキュメントを作成すると、すべてのレイアウト/空白情報とコメント(javadocを除く)が失われています。

これにより、テキストの編集が間違った位置に適用されます。

正しいソースコンテンツを取得するには、ClassChangedCU.getSource()

関連する問題