Java Eclipse AST在更改TypeDeclaration时不更改类文件
我正在尝试用JavaAST编辑几个Java类。但是我的更改不会显示在Java类文件中 我具体想做什么?我想带一个IPackageFragment去参观所有的ICompilationUnits。对于每个已声明的类,我希望使用超类的限定名将超类设置为特定的类。我还尝试通过Document类应用编辑 例如:类main.model.someClass应该从wrappers.main.model.someClassWrapper继承 我对JDTAPI比较陌生,所以我找不到类文件没有更改的原因。我已经检查过了,但它对我没有帮助。我尽量接近Stackoverflow提供的其他技巧/示例中的示例。但这是行不通的 我就是这样做的: 这是访客类:Java Eclipse AST在更改TypeDeclaration时不更改类文件,java,eclipse,eclipse-plugin,eclipse-jdt,eclipse-pde,Java,Eclipse,Eclipse Plugin,Eclipse Jdt,Eclipse Pde,我正在尝试用JavaAST编辑几个Java类。但是我的更改不会显示在Java类文件中 我具体想做什么?我想带一个IPackageFragment去参观所有的ICompilationUnits。对于每个已声明的类,我希望使用超类的限定名将超类设置为特定的类。我还尝试通过Document类应用编辑 例如:类main.model.someClass应该从wrappers.main.model.someClassWrapper继承 我对JDTAPI比较陌生,所以我找不到类文件没有更改的原因。我已经检查过
提前感谢您的帮助 我猜您的编辑将是空的,对吗 通过调用CompliationUnit.recordModifications,您可以告诉AST在内部创建一个ASTRewrite,将修改记录到其中 通过ASTRewrite.create。。您正在创建第二个ASTRewrite,它对正在记录的修改一无所知 使用记录的修改的唯一API是CompliationUnit.rewriteIDocument,映射请参见对字段AST.rewriter的引用 如果您需要使用自己的ASTRewrite,请使用描述性方法,例如使用ASTRewrite.set
private void editTypesIn(IPackageFragment myPackage) throws JavaModelException {
for (ICompilationUnit unit : myPackage.getCompilationUnits()) {
TypeVisitor visitor = new TypeVisitor(myPackage.getElementName(), unit);
unit.becomeWorkingCopy(new NullProgressMonitor());
CompilationUnit parse = parse(unit);
parse.recordModifications();
parse.accept(visitor);
}
}
private static CompilationUnit parse(ICompilationUnit unit) {
ASTParser parser = ASTParser.newParser(AST.JLS8);
parser.setKind(ASTParser.K_COMPILATION_UNIT);
parser.setSource(unit);
parser.setResolveBindings(true);
return (CompilationUnit) parser.createAST(null); // parse
}
public class TypeVisitor extends ASTVisitor {
private final String currentPackage;
private final ICompilationUnit compilationUnit;
public TypeVisitor(String currentPackage, ICompilationUnit compilationUnit) {
this.currentPackage = currentPackage;
this.compilationUnit = compilationUnit;
}
@Override
public boolean visit(TypeDeclaration node) {
if (!node.isInterface()) { // is class
setSuperClass(node, "wrappers." + currentPackage + "." + node.getName().toString() + "Wrapper");
}
return super.visit(node);
}
public void setSuperClass(TypeDeclaration declaration, String qualifiedName) {
try {
// create ast and rewrite:
AST ast = declaration.getAST();
ASTRewrite astRewrite = ASTRewrite.create(ast);
// set super:
Name name = ast.newName(qualifiedName);
Type type = ast.newSimpleType(name);
declaration.setSuperclassType(type);
// apply changes
TextEdit edits = astRewrite.rewriteAST();
compilationUnit.applyTextEdit(edits, new NullProgressMonitor());
compilationUnit.commitWorkingCopy(true, new NullProgressMonitor());
} catch (JavaModelException exception) {
exception.printStackTrace();
} catch (IllegalArgumentException exception) {
exception.printStackTrace();
} catch (MalformedTreeException exception) {
exception.printStackTrace();
}
}
}