Замените неразрешенный тип в eclipse jdt после удаления класса с существующим типом
Я использую eclipse jdt, чтобы программно свернуть иерархию класса ( 1. переместить все методы и поля в родительский класс, 2. удалить абстрактное ключевое слово, если родительский класс является абстрактным, и 3. ссылаться на родительский класс вместо дочернего. во всей системе.) Я выполняю шаги 1, 2, но у меня есть проблемы с 3.
Вот мой код:
//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 (jdt CorrectionEngine) для неразрешенных типов, предоставляя в качестве аргумента тип, который я хочу заменить (дочерний класс) и замену (дочерний класс).
1 ответ
Я думаю, что нашел ошибку в вашем коде:
Документ, к которому вы применяете текстовые правки, должен иметь то же содержание, что и источник, предоставленный синтаксическому анализатору.
Напротив, когда вы создаете документ из typeDeclClassChanged.toString()
вы теряете всю информацию о макете / пробелах, а также комментарии (за исключением javadoc).
Это приведет к редактированию текста, примененному в неправильных позициях.
Чтобы получить правильный исходный контент, вы должны использовать ClassChangedCU.getSource()