2014-02-23 55 views
2

我正在使用JDT的AST來解析Java文件,並且當前正試圖弄清楚如何識別在方法調用期間傳遞給方法的參數的類型。使用JDT的AST識別傳遞給方法的參數類型

當前我使用VariableDeclarationFragment將任何變量的類型存儲在HashMap中的方法中。當發生方法調用時(使用MethodInvocation標識),我搜索在HashMap中作爲參數傳遞的變量以確定其類型。

因此,舉例來說,如果我有這樣的:

int x = 7; 
    M1(x); 
在我商店X映射到詮釋HashMap中

。當方法M1被調用時,我檢查x的類型,並根據需要使用它。

我的問題是,這並不在調用工作就像

M1(7) 

是否有確定的「7」使用AST類型的一種方式?

+0

是的。閱讀Java標準。它會告訴你規則。 –

+0

我想我已經想通了。您在傳遞的參數上調用resolveTypeBindings()。 – gracey

+0

我的想法是檢查參數表達式的類型,如果它是[NumberLiteral](http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.jdt.doc.isv%2Freference %2Fapi%2Forg%2Feclipse%2Fjdt%2Fcore%2Fdom%2FNumberLiteral.html)你遇到了一個數字。 – Katona

回答

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非常有幫助,所以如果您尚未擁有它,我建議您獲取它。

+0

我經常使用ASTView插件,但從未設法使用resolveTypeBindings()。通過創建一個訪問類型爲VariableDeclarationFragment的節點的方法來解決這個問題。 – gracey

+0

@gracey是啊,你可以使用訪客模式來收集'VariableDeclarationFragment',但它與'resolveTypeBinding()'無關,你總是可以做到這一點,無論解決或不解決,所以不知道你的意思。 – Templar

相關問題