使用JDT的LAST识别传递给方法的参数类型

时间:2014-02-23 19:02:33

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

我正在使用JDT的AST来解析Java文件,我正在尝试弄清楚如何识别在方法调用期间传递给方法的参数的类型。

目前,我使用VariableDeclarationFragment将任何变量的类型存储在HashMap中的方法中。当发生方法调用(使用MethodInvocation标识)时,我搜索在HashMap中作为参数传递的变量,以确定其类型。

例如,如果我有类似的东西:

   int x = 7;
   M1(x);
在HashMap中的

我存储映射到int的x。当调用方法M1时,我检查x的类型是什么,并根据需要使用它。

我的问题是,这在

等调用中不起作用
   M1(7)

有没有办法用AST确定'7'的类型?

1 个答案:

答案 0 :(得分:0)

正如您在评论中提到的,您必须使用resolveTypeBindings()

M1(7)

将表示为:

ExpressionStatement [655, 6]
    EXPRESSION
        MethodInvocation [655, 5]
            > (Expression) type binding: void
            > method binding: Main.M1(int)
            ResolvedTypeInferredFromExpectedType: false
            Boxing: false; Unboxing: false
            ConstantExpressionValue: null
            EXPRESSION: null
            TYPE_ARGUMENTS (0)
            NAME
            ARGUMENTS (1)
                NumberLiteral [658, 1]
                    > (Expression) type binding: int
                    Boxing: false; Unboxing: false
                    ConstantExpressionValue: 7
                    TOKEN: '7'

因此,通过ExpressionStatement,您会发现它Expression MethodInvocation,那么您可以获得它的参数,它将是NumberLiteral然后您可以使用resolveTypeBindings()

注意:在评论中,您被告知要检查它是否NumberLiteral并假设它的号码。是的,这是真的它是一个数字,但你不知道它的类型;是int还是double还是别的。

P.S。上面的树表示是使用ASTView plug-in制作的,这对于使用AST非常有帮助,所以如果你还没有它,我建议你这样做。