我正在尝试使用Java AST编辑多个Java类。但是我的更改不会显示在Java类文件中。
我想具体做什么?我想要一个IPackageFragment
并访问所有ICompilationUnit
。对于每个声明的类,我想将超类设置为特定的类(使用超类的限定名称because it is an Xtend class)。我还尝试通过Document
类应用编辑。
例如:类main.model.someClass
应该从wrappers.main.model.someClassWrapper
继承
我是JDT API的新手,因此找不到类文件未更改的原因。我已经检查了this post,但是它没有帮助我。我试图尽可能与How To Train the JDT Dragon从Stackoverflow获得的其他技巧/示例的示例保持紧密联系。但这是行不通的。
这是我的方法:
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();
}
}
}
在此先感谢您的帮助!
最佳答案
我想您的编辑将为空,对吗?
通过调用CompilationUnit.recordModifications()
,您告诉AST在内部创建一个ASTRewrite
,其中将记录修改。
通过ASTRewrite.create(..)
,您正在创建第二个ASTRewrite
,它不知道所记录的修改。
消费记录的修改的唯一API是CompilationUnit.rewrite(IDocument,Map)
(请参见对字段AST.rewriter
的引用)。
如果您需要使用自己的ASTRewrite
,请使用“描述性方法”,例如,使用ASTRewrite.set(..)
。