我正在尝试对某些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
的表达式。
有没有简单的方法来实现这一目标?邪恶的代码是可以的;这是生成的代码。
答案 0 :(得分:2)
(我现在看到问题了。)
Java中唯一的上下文,其中合法出现的void表达式是它是一个语句表达式,或者是经典for
语句中的第一个或第三个部分。所以:
如果表达式用作表达式语句:
covered(...); <my-expression>;
如果表达式用作for
的第1或第3部分,
covered(...), <my-expression>
否则
covered(..., <my-expression>)
或其他一些。 (这需要为每个基本类型重载covered
,并且还需要带有签名<T> overload(..., <T>)
的重载。)
我认为这可以完全基于语法来确定。不需要类型分析或方法重载解析来确定是否实际调用了void方法。