/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.parser.statements;
import gw.internal.gosu.parser.Expression;
import gw.lang.parser.statements.IReturnStatement;
import gw.lang.parser.statements.ITerminalStatement;
import gw.lang.parser.statements.TerminalType;
import gw.util.GosuExceptionUtil;
/**
* Represents a return statement as specified in the Gosu grammar:
*
* @see gw.lang.parser.IGosuParser
*/
public final class ReturnStatement extends TerminalStatement implements IReturnStatement
{
private Expression _value;
public boolean isCompileTimeConstant()
{
return getValue() == null || getValue().isCompileTimeConstant();
}
public Object execute()
{
if( !isCompileTimeConstant() )
{
return super.execute();
}
// Return statement can be executed directly if the return value can be
// evaluated directly e.g., if it's a literal
try
{
return _value.evaluate();
}
catch( Throwable t )
{
throw GosuExceptionUtil.forceThrow( t );
}
}
public Expression getValue()
{
return _value;
}
public void setValue( Expression value )
{
_value = value;
}
@Override
public TerminalType getTerminalType() {
return TerminalType.ReturnOrThrow;
}
@Override
protected ITerminalStatement getLeastSignificantTerminalStatement_internal( boolean[] bAbsolute )
{
bAbsolute[0] = true;
return this;
}
@Override
public String toString()
{
Expression value = getValue();
return "return" + (value == null ? "" : (" " + value.toString()));
}
}