Замените неразрешенный тип в 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()

Другие вопросы по тегам