Java中逗号运算符的等价物?

Java中逗号运算符的等价物?,java,code-generation,Java,Code Generation,我试图对一些Java代码进行源代码转换,从而生成这样的代码:对于每个表达式,如果对表达式求值,就会调用一个方法 (用例是一个简单的行覆盖率度量。我以前在JavaScript中做过类似的事情:变成(覆盖(“path/to/file.js”,12),或其他什么,其中12是表达式的行号) Java没有逗号运算符。我考虑在方法调用中包装表达式,例如,我的covered函数将被声明为public static T covered(String file,int line,T expr),并返回其第三个参数

我试图对一些Java代码进行源代码转换,从而生成这样的代码:对于每个表达式,如果对表达式求值,就会调用一个方法

(用例是一个简单的行覆盖率度量。我以前在JavaScript中做过类似的事情:
变成
(覆盖(“path/to/file.js”,12),
或其他什么,其中12是表达式的行号)

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

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

(我现在看到问题了。)

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

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

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

    covered(..., <my-expression>)
    
    覆盖(…,)
    
    或者类似的。(对于每个基本类型,这需要一个
    覆盖的重载
    ,以及一个带有签名的重载(…,))


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

对表达式粒度的覆盖率分析对我来说似乎有点过分。@StephenC是的,这很好,因为我可以在一个地方(处理表达式的代码)完成所有操作。否则,我将不得不以不同的方式处理不同类型的语句。没什么大不了的,但我认为这是可行的,也没有太多额外的复杂性。谢谢
covered(..., <my-expression>)