用现有类型删除 class 后替换 eclipse jdt 中未解析的类型
Replace an unresolved type in eclipse jdt after deleting a class with an existing type
我正在使用 eclipse jdt 以编程方式折叠 class 的层次结构(1. 将所有方法和字段移至父级 class,2. 如果父级 [=22],则删除抽象关键字=] 是抽象的,并且 3. 在所有系统中引用父 class 而不是子一个。)
我完成了第 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 quickfix (jdt CorrectionEngine) 的东西,作为参数提供我想要替换的类型 (child class) 和替换 (child class).
我想我在你的代码中发现了一个错误:
您应用文本编辑的文档必须具有与提供给解析器的源完全相同的内容。
相比之下,当您从 typeDeclClassChanged.toString()
创建文档时,您将丢失所有布局/空白信息以及注释(javadoc 除外)。
这将导致文本编辑应用到错误的位置。
要获取正确的源内容,您应该使用ClassChangedCU.getSource()
我正在使用 eclipse jdt 以编程方式折叠 class 的层次结构(1. 将所有方法和字段移至父级 class,2. 如果父级 [=22],则删除抽象关键字=] 是抽象的,并且 3. 在所有系统中引用父 class 而不是子一个。)
我完成了第 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 quickfix (jdt CorrectionEngine) 的东西,作为参数提供我想要替换的类型 (child class) 和替换 (child class).
我想我在你的代码中发现了一个错误:
您应用文本编辑的文档必须具有与提供给解析器的源完全相同的内容。
相比之下,当您从 typeDeclClassChanged.toString()
创建文档时,您将丢失所有布局/空白信息以及注释(javadoc 除外)。
这将导致文本编辑应用到错误的位置。
要获取正确的源内容,您应该使用ClassChangedCU.getSource()