我正在构建一个生成void
方法的AST转换。我想检查传入的值是否已经等于另一个值,如果是,则提前退出。代码通常如下所示:
if(param.is existing) {
return
}
ReturnStatement
类有一个属性returningNullOrVoid
,它检查返回表达式是否为null
,所以我尝试了一种明显的方法:
ifS(sameX(paramEx, existingEx), returnS(constX(null))
这在编译转换类时会产生异常:
BUG! exception in phase 'instruction selection' in source unit 'Annotated.groovy' Unexpected return statement at -1:-1 return null
如何为提前退出插入return语句?
答案 0 :(得分:2)
ReturnStatement
类有一个名为RETURN_NULL_OR_VOID
的常量:
/**
* Only used for synthetic return statements emitted by the compiler.
* For comparisons use isReturningNullOrVoid() instead.
*/
public static final ReturnStatement RETURN_NULL_OR_VOID = new ReturnStatement(ConstantExpression.NULL);
Groovy编译器检查此特定实例以生成void return;
。在创建包含return语句的AST语句块时,语句是"编译器"发出的合成返回语句,您应该使用该常量:
ifS(sameX(paramEx, existingEx), ReturnStatement.RETURN_NULL_OR_VOID)