/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.ir.transform.expression;
import gw.internal.gosu.parser.expressions.ArithmeticExpression;
import gw.internal.gosu.ir.transform.ExpressionTransformer;
import gw.internal.gosu.ir.transform.TopLevelTransformationContext;
import gw.lang.ir.IRExpression;
import gw.lang.ir.expression.IRArithmeticExpression;
import gw.lang.reflect.java.IJavaType;
import gw.lang.reflect.java.JavaTypes;
import gw.lang.reflect.java.JavaTypes;
/**
*/
public abstract class AbstractBitwiseExpressionTransformer<T extends ArithmeticExpression> extends AbstractExpressionTransformer<T>
{
protected AbstractBitwiseExpressionTransformer( TopLevelTransformationContext cc, T expr )
{
super( cc, expr );
}
protected abstract IRArithmeticExpression.Operation getOp();
protected IRExpression compile_impl()
{
// Push LHS (parser guarantees type is int or long)
IRExpression lhs = ExpressionTransformer.compile( _expr().getLHS(), _cc() );
// Push RHS (parser guarantees type is int)
IRExpression rhs = ExpressionTransformer.compile( _expr().getRHS(), _cc() );
verifyTypes();
return new IRArithmeticExpression( getDescriptor( _expr().getType() ), lhs, rhs, getOp() );
}
private void verifyTypes()
{
if( _expr().getLHS().getType() != _expr().getRHS().getType() )
{
throw new IllegalStateException( "Bitwise operands are not the same type:" +
" lhs=" + _expr().getLHS().getType().getName() +
" rhs=" + _expr().getRHS().getType().getName() );
}
if( _expr().getLHS().getType() != JavaTypes.pINT() && _expr().getLHS().getType() != JavaTypes.pLONG() )
{
throw new IllegalStateException( "Operands must be int or long, found: " + _expr().getLHS().getType().getName() );
}
}
}