/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.gosu.ir.transform.expression; import gw.internal.gosu.parser.expressions.ConditionalTernaryExpression; import gw.internal.gosu.ir.transform.ExpressionTransformer; import gw.internal.gosu.ir.transform.TopLevelTransformationContext; import gw.lang.ir.IRExpression; /** */ public class ConditionalTernaryExpressionTransformer extends AbstractExpressionTransformer<ConditionalTernaryExpression> { public static IRExpression compile( TopLevelTransformationContext cc, ConditionalTernaryExpression expr ) { ConditionalTernaryExpressionTransformer compiler = new ConditionalTernaryExpressionTransformer( cc, expr ); return compiler.compile(); } private ConditionalTernaryExpressionTransformer( TopLevelTransformationContext cc, ConditionalTernaryExpression expr ) { super( cc, expr ); } protected IRExpression compile_impl() { IRExpression condition; if( _expr().getCondition() == null ) { // Handle the "elvis" version of the ternary // e.g., first ?: second which is short for: first != null ? first : second condition = buildNotEquals( ExpressionTransformer.compile( _expr().getFirst(), _cc() ), nullLiteral() ); } else { condition = ExpressionTransformer.compile( _expr().getCondition(), _cc() ); } return buildTernary( condition, ExpressionTransformer.compile( _expr().getFirst(), _cc() ), ExpressionTransformer.compile( _expr().getSecond(), _cc() ), getDescriptor( _expr().getType() ) ); } }