/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.ir.transform.expression;
import gw.internal.gosu.ir.transform.TopLevelTransformationContext;
import gw.internal.gosu.parser.MetaType;
import gw.internal.gosu.parser.expressions.DefaultArgLiteral;
import gw.internal.gosu.parser.expressions.NewExpression;
import gw.internal.gosu.parser.expressions.TypeLiteral;
import gw.lang.ir.IRExpression;
import gw.lang.ir.expression.IRFieldGetExpression;
import gw.lang.reflect.IType;
import gw.lang.reflect.TypeSystem;
/**
*/
public class DefaultArgLiteralTransformer extends AbstractExpressionTransformer<DefaultArgLiteral>
{
public static IRExpression compile( TopLevelTransformationContext cc, DefaultArgLiteral expr )
{
DefaultArgLiteralTransformer gen = new DefaultArgLiteralTransformer( cc, expr );
return gen.compile();
}
private DefaultArgLiteralTransformer( TopLevelTransformationContext cc, DefaultArgLiteral expr )
{
super( cc, expr );
}
protected IRExpression compile_impl()
{
IRExpression expression;
Object value = _expr().getValue();
IType type = _expr().getType();
if( value == null )
{
expression = pushNull();
}
else if( type.isEnum() )
{
expression = new IRFieldGetExpression( null, (String)value, getDescriptor( type ), getDescriptor( type ) );
}
else if( value.getClass().isArray() )
{
expression = NewExpressionTransformer.compile( _cc(), (NewExpression)_expr().getExpression() );
}
else if( MetaType.class.isAssignableFrom( type.getClass() ) )
{
expression = TypeLiteralTransformer.compile( _cc(), (TypeLiteral)_expr().getExpression() );
}
else
{
expression = pushConstant( value );
if( !type.isPrimitive() )
{
IType primType = TypeSystem.getPrimitiveType( type );
if( primType != null )
{
expression = boxValue( type, expression );
}
}
}
return expression;
}
}