Java中等效的逗号运算符?

时间:2013-04-20 03:19:31

标签: java code-generation

我正在尝试对某些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())但它不适用于类型为void的表达式。

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

1 个答案:

答案 0 :(得分:2)

(我现在看到问题了。)

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

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

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

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

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

    或其他一些。 (这需要为每个基本类型重载covered,并且还需要带有签名<T> overload(..., <T>)的重载。)

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