使用 JDT 的 AST 标识传递给方法的参数类型



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

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

例如,如果我有这样的东西:

   int x = 7;
   M1(x);

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

我的问题是这在像这样的调用中不起作用

   M1(7)

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

正如您在评论中提到的,您必须使用 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或其他什么。

附言上面的树表示是使用 ASTView 插件制作的,该插件在与 AST 配合使用时非常有用,因此如果您还没有它,我建议您获取它。

最新更新