2014-03-26 42 views
0

获得嵌套的方法调用类型如何能推导出一个嵌套的方法调用,如类型:使用JDT和AST

JavaSourceFile javaSourceFile = new JavaSourceFile(); 

javaSourceFile.getClasses().size() 

它适用于正常的方法调用,如

javaSourceFile.getClasses() 

但我想获得getClasses()的返回类型。这就是我所做的。在

ASTVisitor.visit(MethodInvocation invocation) 

我想获得size()调用的类型。我用

Expression expression = invocation.getExpression(); 
    if (expression != null) { 

     ITypeBinding typeBinding = expression.resolveTypeBinding(); 
     if (typeBinding != null) { 
      Call call = new Call(invocation.getName().getFullyQualifiedName(), typeBinding.getName()); 
      this.activeMethod.getCalls().add(call); 
     } 
    } 

获取方法调用的类型。但是如果有一个方法调用,就像在开始时概述的那样,我只是得到空值。我也使用

invocation.resolveMethodBinding(); 

事后如果绑定无法使用表达式解析。

+0

你从哪里得到空? invocation.getExpression()是否返回null?或者你在说aboput expression.resolveTypeBinding()?或typeBinding.getName()? –

+0

我从expression.resolveTypeBinding()中获得null –

回答

0

在这个例子中你有2个方法调用。所以你的访问者将被调用2次,除非你返回false

您第一次使用此表达式访问此表达式javaSourceFile.getClasses().size()并且如果您致​​电resolveTypeBinding(),实际上您将获得size()方法的类型,因为它首先发生。

但是在给定的代码中,如果您的访问者被称为javaSourceFile.getClasses().size(),那么您实际上正在为javaSourceFile.getClasses()解析类型,因为您使用getExpression()方法。 (注:如果您在访问方法没有返回false它将再次为javaSourceFile.getClasses()被访问(因为它的方法调用一样),然后你会得到javaSourceFile变量的类型)

另外你说你null我相信不应该发生,如果一切正常设置(例如,也许你没有指定某些类的classpaths /源路径)。由于我需要完整的代码,因此无法分辨出为什么发生。