gpt4 book ai didi

java - 更改 TypeDeclaration 时 Eclipse AST 不更改类文件

转载 作者:行者123 更新时间:2023-12-01 08:52:48 26 4
gpt4 key购买 nike

我正在尝试使用 Java AST 编辑多个 Java 类。但我的更改不会显示在 Java 类文件中。

我具体想做什么?我想获取一个IPackageFragment并访问所有ICompilationUnit。对于每个声明的类,我想将父类(super class)设置为特定类(使用父类(super class)的限定名称 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(..)

关于java - 更改 TypeDeclaration 时 Eclipse AST 不更改类文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42279095/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com