首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDT中用ArrayAccess代替MethodInvocation

JDT中用ArrayAccess代替MethodInvocation
EN

Stack Overflow用户
提问于 2015-03-24 05:19:35
回答 2查看 106关注 0票数 0

我需要改变

代码语言:javascript
复制
xyz[3].aaa[1].bbb[2].jjj

代码语言:javascript
复制
getXyz(3).getAaa(1).getBbb(2).getJjj()

使用JDT核。

用一些getter方法替换ArrayAccess没有帮助,因为访问的数组访问如下:

代码语言:javascript
复制
xyz[3].aaa[1].bbb[2]
xyz[3].aaa[1]
xyz[3]

因此,将ArrayAccess替换为getter将失去一些替代物。

我尝试过的另一个选择是访问FieldAccess,但是这样做,我只能做一些类似的事情

代码语言:javascript
复制
getXyz(3).getAaa(1)[1].getBbb(2)[2].getJjj()

是否有一种替代1或2的方法,或者更确切地说,是否有解析和获取aaa1、bbb2来删除或替换的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-31 15:11:10

找到了我自己问题的答案。简单地说,在表达式xyz[3].aaa[1]中,xyz[3].aaa需要被视为数组,索引表达式为1,这样aaa[1][1]才能得到正确的考虑。

然而,在编程上,我发现下面的方法更容易处理。这种方法是通过简单的替换replace("\"", "").replace("+", "").replace('[', '(').replace(']', ')')将这里的数组表达式作为方法调用来处理,这样就减少了对方法的重命名问题。

代码语言:javascript
复制
@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());
}
票数 0
EN

Stack Overflow用户

发布于 2015-03-24 08:47:50

如果很难在一次中完成所有的更改,那么最简单和“最好理解”的解决方案就是将您的代码更改分解成几个过程。我的意思是说:

  1. 解析AST
  2. 做一些不会覆盖自己的改变
  3. 应用编辑

因此,这意味着每次传递时都要重新解析代码。这样做的缺点是性能会下降很多。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29225527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档