在JDT中使用MethodInvocation替换ArrayAccess

时间:2015-03-24 05:19:36

标签: java eclipse-jdt

我需要转换

xyz[3].aaa[1].bbb[2].jjj

getXyz(3).getAaa(1).getBbb(2).getJjj()

使用JDT核心。

用一些getter替换ArrayAccess方法无效,因为访问的数组访问如下: -

xyz[3].aaa[1].bbb[2]
xyz[3].aaa[1]
xyz[3]

因此,只需将ArrayAccess替换为getter就会失去一些替代品。

我尝试过的另一个选择是访问FieldAccess,但这样做会留下类似

的内容
getXyz(3).getAaa(1)[1].getBbb(2)[2].getJjj()

有没有办法替换[1]或[2],或者更确切地说是解析和掌握aaa [1],bbb [2]来删除或替换?

2 个答案:

答案 0 :(得分:2)

如果难以在一次通过中完成所有更改,那么最简单且最容易理解"解决方案是将代码更改分解为多个过程。一次通过我的意思是:

  1. 解析AST
  2. 执行不会覆盖自己的更改
  3. 应用修改
  4. 因此,这意味着您将为每次传递重新解析代码。这样做的缺点是性能会下降很多。

    将更改分解为多个传递的一种方法是首先查找所有数组声明,然后仅对此数组执行更改。

答案 1 :(得分:0)

找到我自己的问题的答案。简短的回答是,在表达式xyz[3].aaa[1]中,xyz[3].aaa需要被视为索引表达式为1的数组,以便aaa[1][1]获得占得当。

然而,以编程方式我发现以下方法更容易处理。 方法是通过简单替换replace("\"", "").replace("+", "").replace('[', '(').replace(']', ')')将此处的数组表达式视为方法调用,问题减少为重命名方法。

@Test
public void testArray() throws Exception {
    String testExpr = "xyz[3].aaa[1].bbb[2]";

    Document document;
    ASTParser parser;
    parser = ASTParser.newParser(AST.JLS8);
    parser.setKind(ASTParser.K_EXPRESSION);
    parser.setResolveBindings(true);
    String exprString = testExpr.replace("\"", "").replace("+", "").replace('[', '(').replace(']', ')');

    document = new Document(exprString);
    parser.setSource(document.get().toCharArray());
    Object o = parser.createAST(null);

    if (o instanceof CompilationUnit) {
        CompilationUnit cu = (CompilationUnit) o;
        IProblem[] problems = cu.getProblems();
        System.err.println(problems);
    }
    Expression expr = (Expression) o;
    final ASTRewrite rewriter = ASTRewrite.create(expr.getAST());
    final AST ast = expr.getAST();
    final TextEditGroup textEdits = new TextEditGroup("test");

    expr.accept(new ASTVisitor() {
        @Override
        public boolean visit(MethodInvocation node) {
            String getter = getGetter(node.getName().getIdentifier().toString());

            rewriter.replace(node.getName(), 
                    ast.newSimpleName(getter),
                    textEdits);
            return super.visit(node);
        }


    });

    TextEdit edits = rewriter.rewriteAST(document, null);
    edits.apply(document);

    assertEquals("getXyz(3).getAaa(1).getBbb(2)", 
            document.get());
}