2013-04-20 60 views
4

我正在嘗試對某些Java代碼進行源代碼轉換,結果代碼中的每個表達式都會在計算表達式時調用方法。 (這個用例是一個簡單的行覆蓋度量,我之前在JavaScript中做過這樣的事情:<my-expression>變成了(covered("path/to/file.js", 12), <my-expression>)或其他東西,其中12是表達式的行號)。Java中的逗號運算符的等效形式?

Java沒有逗號運算符。我想過在方法調用中包裝表達式,例如我的covered函數將被聲明爲public static <T> T covered(String file, int line, T expr)並返回其第三個參數,因此我可以編寫covered("path/to/file.java", 12, myExpression()),但它不適用於類型爲void的表達式。

有沒有簡單的方法來完成這個?邪惡的代碼是好的;這是生成的代碼。

+0

表達式粒度的覆蓋分析對我來說似乎有點過分。 – 2013-04-20 03:40:54

+0

@StephenC是的,這很好,因爲我可以在一個地方完成所有任務(處理表達式的代碼)。否則,我不得不以不同的方式處理不同類型的陳述。不是一個大問題,但仍然。 – 2013-04-20 03:42:47

回答

2

(我看到的問題,現在。)

Java中的唯一背景在哪裏可以合法地出現空洞的表達是當它是一個語句表達,或第一或第三部分中的經典for聲明。所以:

  • 如果該表達式被用作表達語句:

    covered(...); <my-expression>; 
    
  • 如果該表達式被用作for的第一或第三部分,

    covered(...), <my-expression> 
    
  • 否則

    covered(..., <my-expression>) 
    

    或其他一些。 (這需要covered用於每個原語類型的過載,同時還與簽名<T> overload(..., <T>)過載。)

我認爲這可以純粹基於語法來確定。不需要類型分析或方法重載解析來確定是否實際調用了無效方法。

+0

我認爲這是有效的,並沒有太多額外的複雜性。謝謝! – 2013-04-20 04:10:28