/* * 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.ParserBase; import gw.internal.gosu.parser.expressions.IdentityExpression; import gw.lang.ir.IRExpression; import gw.lang.ir.expression.IREqualityExpression; import gw.lang.reflect.IType; /** */ public class IdentityExpressionTransformer extends AbstractExpressionTransformer<IdentityExpression> { public static IRExpression compile( TopLevelTransformationContext cc, IdentityExpression expr ) { IdentityExpressionTransformer gen = new IdentityExpressionTransformer( cc, expr ); return gen.compile(); } private IdentityExpressionTransformer( TopLevelTransformationContext cc, IdentityExpression expr ) { super( cc, expr ); } protected IRExpression compile_impl() { IType lhsType = _expr().getLHS().getType(); IType rhsType = _expr().getRHS().getType(); IRExpression lhs = ExpressionTransformer.compile( _expr().getLHS(), _cc() ); IRExpression rhs = ExpressionTransformer.compile( _expr().getRHS(), _cc() ); // If we have primitives, make sure to convert them to the upper-bound type first if( lhsType.isPrimitive() && rhsType.isPrimitive() ) { IType type = ParserBase.resolveType( lhsType, '>', rhsType ); if( type.isPrimitive() ) { lhs = numberConvert( _expr().getLHS().getType(), type, lhs ); rhs = numberConvert( _expr().getLHS().getType(), type, rhs ); } } else if( lhsType.isPrimitive() ) { lhs = boxValue( lhsType, lhs ); } else if( rhsType.isPrimitive() ) { rhs = boxValue( rhsType, rhs ); } return new IREqualityExpression( lhs, rhs, _expr().isEquals() ); } }