如何使用ASTRewrite用PrimitiveType替换特定的SimpleType?

时间:2012-07-23 20:21:27

标签: java eclipse abstract-syntax-tree eclipse-jdt

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

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

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

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

我在非日食环境中工作。我正在使用Eclipse JDT ASTParser来做到这一点。我已经实现了访问所有SimpleType节点的ASTVisitor。以下是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;
}

这里重写是ASTRewrite的一个实例。 第1行没有效果(第2行被注释掉)。第2行导致抛出IllegalArgumentException,因为newSimpleName()不接受任何java关键字,如int。

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

我怎样才能做到这一点?或者我可以采取任何其他解决方案或方法吗?

由于

更新编辑: 这是执行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是包含上述访问方法的访问者类。我正在执行的其他替换正确执行。只有这一个会导致问题。

1 个答案:

答案 0 :(得分:0)

我发现了你的错误! 这句话:

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

不对。 并应替换为以下声明:

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

最后,再次将修改后的doc解析为CompilationUnit,将应用更改。 更重要的是,声明:

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

不需要。