5

我正在尝试对一些 Java 代码进行源代码转换,从而生成代码,其中对于每个表达式,如果计算表达式,则会调用一个方法。

(用例是一个简单的行覆盖度量。我以前在 JavaScript 中做过这种事情:<my-expression>成为(covered("path/to/file.js", 12), <my-expression>)或其他东西,其中 12 是表达式的行号)。

Java 没有逗号运算符。我考虑过在方法调用中包装表达式,例如我的covered函数将被声明public static <T> T covered(String file, int line, T expr)并返回它的第三个参数,所以我可以编写covered("path/to/file.java", 12, myExpression())但它不适用于具有 type 的表达式void

有没有简单的方法来实现这一点?邪恶的代码是可以的;这是生成的代码。

4

1 回答 1

3

(我现在看到了问题。)

Java 中唯一可以合法出现 void 表达式的上下文for是它是语句表达式,或者经典语句中的第一或第三部分。所以:

  • 如果表达式用作表达式语句:

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

    covered(...), <my-expression>
    
  • 除此以外

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

    或一些这样的。(这需要covered每个原始类型的重载,并且还需要带有签名的重载<T> overload(..., <T>)。)

我认为这可以完全根据语法来确定。不需要类型分析或方法重载解析来确定是否实际调用了 void 方法。

于 2013-04-20T03:48:22.967 回答