删除具有现有类型

时间:2017-08-25 14:53:05

标签: java eclipse-jdt

我正在使用eclipse jdt以编程方式折叠类的层次结构(1.将所有方法和字段移动到父类,2。如果父类是抽象的,则删除抽象关键字; 3.引用父类而不是父类孩子们在整个系统中都是一个。) 我完成了第1步,第2步,但是我遇到了问题 这是我的代码:

//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)的未解决类型,提供我想要替换的类型(子类)和替换(子类)。

1 个答案:

答案 0 :(得分:0)

我想我在你的代码中发现了一个错误:

您应用文本修改的文档必须与提供给解析器的源具有完全相同的内容

相比之下,当您从typeDeclClassChanged.toString()创建文档时,您将丢失所有布局/空白信息以及注释(javadoc除外)。

这将导致文本编辑应用于错误的位置。

要获取正确的源内容,您应该使用ClassChangedCU.getSource()

相关问题