/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.ir.transform.expression;
import gw.internal.gosu.ir.transform.ExpressionTransformer;
import gw.internal.gosu.ir.transform.TopLevelTransformationContext;
import gw.internal.gosu.parser.expressions.UnaryNotPlusMinusExpression;
import gw.internal.gosu.runtime.GosuRuntimeMethods;
import gw.lang.ir.IRExpression;
import gw.lang.ir.expression.IRNotExpression;
import gw.lang.reflect.IPlaceholder;
import gw.lang.reflect.IType;
import gw.lang.reflect.java.JavaTypes;
import java.util.Collections;
/**
*/
public class UnaryNotPlusMinusExpressionTransformer extends AbstractExpressionTransformer<UnaryNotPlusMinusExpression>
{
public static IRExpression compile( TopLevelTransformationContext cc, UnaryNotPlusMinusExpression expr )
{
UnaryNotPlusMinusExpressionTransformer gen = new UnaryNotPlusMinusExpressionTransformer( cc, expr );
return gen.compile();
}
private UnaryNotPlusMinusExpressionTransformer( TopLevelTransformationContext cc, UnaryNotPlusMinusExpression expr )
{
super( cc, expr );
}
protected IRExpression compile_impl()
{
IRExpression root = ExpressionTransformer.compile( _expr().getExpression(), _cc() );
IType type = _expr().getExpression().getType();
if( _expr().isNot() )
{
if( type instanceof IPlaceholder && ((IPlaceholder)type).isPlaceholder() )
{
return callStaticMethod( GosuRuntimeMethods.class, "logicalNot", new Class[] {Object.class}, Collections.singletonList( root ) );
}
else if( type != JavaTypes.pBOOLEAN() )
{
throw new IllegalStateException( "Logical not operator '!' requires boolean operand. Found: " + type );
}
}
else if( _expr().isBitNot() )
{
if( type != JavaTypes.pINT() && type != JavaTypes.pLONG())
{
throw new IllegalStateException( "Bitwise not operator '~' requires int or long operand. Found: " + type );
}
}
return new IRNotExpression( root );
}
}