如何在Groovy AST转换中创建void return语句?

时间:2015-12-02 20:00:54

标签: groovy metaprogramming abstract-syntax-tree

我正在构建一个生成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语句?

1 个答案:

答案 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)