Java中逗号运算符的等价物?
我试图对一些Java代码进行源代码转换,从而生成这样的代码:对于每个表达式,如果对表达式求值,就会调用一个方法 (用例是一个简单的行覆盖率度量。我以前在JavaScript中做过类似的事情: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),并返回其第三个参数
变成(覆盖(“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>)