如何使用jdt.ast来解决多态性

时间:2016-12-16 02:56:21

标签: eclipse eclipse-jdt

我正在努力通过eclipse-jdt-ast获取覆盖方法绑定。 就像我们使用eclipse时一样,按Ctrl键并单击该方法,我们可以跳转到方法实现。

虽然它在java中是动态的,但以下效果很好:

public class Father{
public void test(){}
}

和儿子:

public class Son extends Father{
@Override
public void test(){}

   public static void  main (String[] arg){
    Father f=new Son();
    f.test();
   }
}

当我们点击main中的测试时,我们可以正确跳转到Son.java 我想知道该怎么做。我试图查看源,但没找到位置,因为代码太多了。

现在我的代码是:

public class Main {
static  String filep="example/Son.java";
static String[] src={"example/"};
static String[] classfile={"example/"};

public static void main(String[] args) throws IOException,Exception{

    ASTParser parser = ASTParser.newParser(AST.JLS8);
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    parser.setSource(Files.toString(new File(filep), Charsets.UTF_8).toCharArray());
    // only setEnvironment can we get bindings from char[]
    parser.setEnvironment(classfile, src, null, true);
    parser.setUnitName(filep);
    parser.setResolveBindings(true);
    parser.setKind(ASTParser.K_COMPILATION_UNIT);
    CompilationUnit compilationUnit = (CompilationUnit) parser.createAST(null);
    if (compilationUnit.getAST().hasResolvedBindings()) {
        System.out.println("Binding activated.");
    }
    else {
        System.out.println("Binding is not activated.");
    }
    ASTNode node=compilationUnit.findDeclaringNode("f");
    compilationUnit.accept(new Myvisitor(compilationUnit));
}
}

我的访客是:

public class Myvisitor extends ASTVisitor {
int i=0;
CompilationUnit compilationUnit;
Myvisitor(CompilationUnit compilationUnit){
    this.compilationUnit=compilationUnit;
}


@Override
public boolean visit(MethodInvocation node) {
    i++;
    System.out.println(i);
    IMethodBinding binding=node.resolveMethodBinding();

    ASTNode astNode=compilationUnit.findDeclaringNode(binding);
    System.out.println(astNode);
    return true;
}

}

这有点长但很简单,希望你能在这里阅读。我个人认为 findDeclaringNode方法可以做到。但是,当我传递绑定时,它返回null。你有什么想法吗? 非常感谢

1 个答案:

答案 0 :(得分:1)

当寻找给定超级方法的所有实现时,AST几乎没有帮助,因为即使它的绑定它只有从sub到super的引用,但不是相反的方向。

以相反方向搜索使用set_concat = set() for x in Se: for y in literal_eval(x): set_concat.update(y) set_concat {'a', 'b', 'c', 'd', 'e', 'f', 'g'} 。如果您查看SearchEngine,可以在line 218附近找到相关的代码部分(截至当前的HEAD)

您必须先找到代表超级方法的JavaElementImplementationHyperlink。然后在最终调用IMethod之前准备SearchRequestorIJavaSearchScopeSearchPattern。搜索结果收集在engine.search(..)

Eclipse插件开发的一个很好的传统是“猴子看,猴子做”,所以我希望看看这段代码能让你开始追求:)