/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.gosu.ir.transform.expression; import gw.internal.gosu.parser.expressions.NumericLiteral; import gw.internal.gosu.ir.transform.TopLevelTransformationContext; import gw.lang.ir.IRExpression; import gw.lang.ir.IRTypeConstants; import gw.lang.reflect.IType; import gw.lang.reflect.java.JavaTypes; import java.util.Collections; import java.util.Arrays; /** */ public class NumericLiteralTransformer extends AbstractExpressionTransformer<NumericLiteral> { public static IRExpression compile( TopLevelTransformationContext cc, NumericLiteral expr ) { NumericLiteralTransformer gen = new NumericLiteralTransformer( cc, expr ); return gen.compile(); } private NumericLiteralTransformer( TopLevelTransformationContext cc, NumericLiteral expr ) { super( cc, expr ); } protected IRExpression compile_impl() { final IType type = _expr().getType(); if( type == JavaTypes.BIG_DECIMAL() || type == JavaTypes.BIG_INTEGER() ) { return buildNewExpression( getDescriptor( type ), Arrays.asList(IRTypeConstants.STRING()), Collections.singletonList( stringLiteral( _expr().getValue().toString() ) ) ); } else { Number value = getValueOfProperType( type ); IRExpression expression = pushConstant( value ); if( !type.isPrimitive() ) { expression = boxValueToType( type, expression ); } return expression; } } private Number getValueOfProperType( IType type ) { Number value = _expr().getValue(); if( type == JavaTypes.pDOUBLE() || type == JavaTypes.DOUBLE() ) { value = new Double( value.doubleValue() ); } if( type == JavaTypes.pLONG() || type == JavaTypes.LONG() ) { value = new Long( value.longValue() ); } return value; } }