gpt4 book ai didi

java - 如何使用 ASTRewrite 将特定的 SimpleType 替换为 PrimitiveType?

转载 作者:行者123 更新时间:2023-12-01 05:13:51 24 4
gpt4 key购买 nike

在编译基于 java 的语言 - 处理之前,我需要预处理一些代码。在这种语言中,所有类型 color 的实例都需要替换为 int。例如,这是一个代码片段:

color red = 0xffaabbcc;
color[][] primary = new color[10][10];

经过预处理后,上面的代码应如下所示:

int red = 0xffaabbcc;
int[][] primary = new int[10][10];

我正在非 Eclipse 环境中工作。我正在使用 Eclipse JDT ASTParser 来执行此操作。我已经实现了我的 ASTVisitor,它访问所有 SimpleType 节点。以下是 ASTVisitor 实现的代码片段:

public boolean visit(SimpleType node) {
if (node.toString().equals("color")) {
System.out.println("ST color type detected: "
+ node.getStartPosition());
// 1
rewrite.replace(node,
rewrite.getAST().newPrimitiveType(PrimitiveType.INT), null);
// 2
node.setStructuralProperty(SimpleType.NAME_PROPERTY, rewrite
.getAST().newSimpleName("int")); // 2
}
return true;
}

这里的rewrite是ASTRewrite的一个实例。第 1 行没有任何作用(第 2 行被注释掉)。第 2 行导致抛出 IllegalArgumentException,因为 newSimpleName() 不会接受任何像 int 这样的 java 关键字。

用正则表达式查找并替换所有颜色实例对我来说似乎不是正确的方法,因为它可能会导致不必要的更改。但我可能是错的。

我怎样才能实现这个目标?或者我可以采取任何替代解决方案或方法吗?

谢谢

更新编辑:这是执行 ASTRewrite 的代码片段:

    CompilationUnit cu = (CompilationUnit) parser.createAST(null);
cu.recordModifications();
rewrite = ASTRewrite.create(cu.getAST());
cu.accept(new XQASTVisitor());

TextEdit edits = cu.rewrite(doc, null);
try {
edits.apply(doc);
} catch (MalformedTreeException e) {
e.printStackTrace();
} catch (BadLocationException e) {
e.printStackTrace();
}

XQAstVisitor 是包含上述访问方法的访问者类。我正在执行其他正确执行的替换。只有这一点会导致问题。

最佳答案

我发现了你的错误!本声明:

TextEdit edits = cu.rewrite(doc, null);

不对。并应替换为以下语句:

TextEdit edits = rewrite.rewriteAST(doc, null);

最后,再次将修改后的文档解析到 CompilationUnit 中,更改将被应用。更重要的是,声明:

node.setStructuralProperty(SimpleType.NAME_PROPERTY, rewrite.getAST().newSimpleName("int"));

不需要。

关于java - 如何使用 ASTRewrite 将特定的 SimpleType 替换为 PrimitiveType?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11619929/

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