/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.ir.transform;
import gw.internal.gosu.ir.transform.expression.AdditiveExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.ArrayAccessTransformer;
import gw.internal.gosu.ir.transform.expression.BeanMethodCallExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.BitshiftExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.BitwiseAndExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.BitwiseOrExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.BitwiseXorExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.BlockExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.BlockInvocationTransformer;
import gw.internal.gosu.ir.transform.expression.BooleanLiteralTransformer;
import gw.internal.gosu.ir.transform.expression.CharLiteralTransformer;
import gw.internal.gosu.ir.transform.expression.CollectionInitializerExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.ConditionalAndExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.ConditionalOrExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.ConditionalTernaryExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.DefaultArgLiteralTransformer;
import gw.internal.gosu.ir.transform.expression.EqualityExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.EvalExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.ExistsExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.FeatureLiteralTransformer;
import gw.internal.gosu.ir.transform.expression.IdentifierTransformer;
import gw.internal.gosu.ir.transform.expression.IdentityExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.IntervalExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.MapAccessTransformer;
import gw.internal.gosu.ir.transform.expression.MapInitializerExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.MemberAccessTransformer;
import gw.internal.gosu.ir.transform.expression.MemberExpansionAccessTransformer;
import gw.internal.gosu.ir.transform.expression.MethodCallExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.MultiplicativeExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.NewExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.NullExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.NumericLiteralTransformer;
import gw.internal.gosu.ir.transform.expression.ObjectInitializerExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.ObjectLiteralExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.QueryExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.RelationalExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.StaticTypeOfTransformer;
import gw.internal.gosu.ir.transform.expression.StringLiteralTransformer;
import gw.internal.gosu.ir.transform.expression.TemplateStringLiteralTransformer;
import gw.internal.gosu.ir.transform.expression.TypeAsTransformer;
import gw.internal.gosu.ir.transform.expression.TypeIsTransformer;
import gw.internal.gosu.ir.transform.expression.TypeLiteralTransformer;
import gw.internal.gosu.ir.transform.expression.TypeOfTransformer;
import gw.internal.gosu.ir.transform.expression.UnaryExpressionTransformer;
import gw.internal.gosu.ir.transform.expression.UnaryNotPlusMinusExpressionTransformer;
import gw.internal.gosu.parser.ParenthesizedExpression;
import gw.internal.gosu.parser.expressions.AdditiveExpression;
import gw.internal.gosu.parser.expressions.ArrayAccess;
import gw.internal.gosu.parser.expressions.BeanMethodCallExpression;
import gw.internal.gosu.parser.expressions.BitshiftExpression;
import gw.internal.gosu.parser.expressions.BitwiseAndExpression;
import gw.internal.gosu.parser.expressions.BitwiseOrExpression;
import gw.internal.gosu.parser.expressions.BitwiseXorExpression;
import gw.internal.gosu.parser.expressions.BlockExpression;
import gw.internal.gosu.parser.expressions.BlockInvocation;
import gw.internal.gosu.parser.expressions.BooleanLiteral;
import gw.internal.gosu.parser.expressions.CharLiteral;
import gw.internal.gosu.parser.expressions.CollectionInitializerExpression;
import gw.internal.gosu.parser.expressions.ConditionalAndExpression;
import gw.internal.gosu.parser.expressions.ConditionalOrExpression;
import gw.internal.gosu.parser.expressions.ConditionalTernaryExpression;
import gw.internal.gosu.parser.expressions.DefaultArgLiteral;
import gw.internal.gosu.parser.expressions.EqualityExpression;
import gw.internal.gosu.parser.expressions.EvalExpression;
import gw.internal.gosu.parser.expressions.ExistsExpression;
import gw.internal.gosu.parser.expressions.FeatureLiteral;
import gw.internal.gosu.parser.expressions.IdentityExpression;
import gw.internal.gosu.parser.expressions.IntervalExpression;
import gw.internal.gosu.parser.expressions.MapAccess;
import gw.internal.gosu.parser.expressions.MapInitializerExpression;
import gw.internal.gosu.parser.expressions.MemberAccess;
import gw.internal.gosu.parser.expressions.MemberExpansionAccess;
import gw.internal.gosu.parser.expressions.MethodCallExpression;
import gw.internal.gosu.parser.expressions.MultiplicativeExpression;
import gw.internal.gosu.parser.expressions.NewExpression;
import gw.internal.gosu.parser.expressions.NullExpression;
import gw.internal.gosu.parser.expressions.NumericLiteral;
import gw.internal.gosu.parser.expressions.ObjectInitializerExpression;
import gw.internal.gosu.parser.expressions.ObjectLiteralExpression;
import gw.internal.gosu.parser.expressions.QueryExpression;
import gw.internal.gosu.parser.expressions.RelationalExpression;
import gw.internal.gosu.parser.expressions.StaticTypeOfExpression;
import gw.internal.gosu.parser.expressions.StringLiteral;
import gw.internal.gosu.parser.expressions.TemplateStringLiteral;
import gw.internal.gosu.parser.expressions.TypeIsExpression;
import gw.internal.gosu.parser.expressions.TypeLiteral;
import gw.internal.gosu.parser.expressions.UnaryExpression;
import gw.internal.gosu.parser.expressions.UnaryNotPlusMinusExpression;
import gw.lang.ir.IRExpression;
import gw.lang.ir.IRStatement;
import gw.lang.parser.IExpression;
import gw.lang.parser.expressions.IIdentifierExpression;
import gw.lang.parser.expressions.ITypeAsExpression;
import gw.lang.parser.expressions.ITypeOfExpression;
import java.util.List;
/**
*/
public class ExpressionTransformer
{
private IExpression _expr;
private TopLevelTransformationContext _cc;
public static IRExpression compile( IExpression expr, TopLevelTransformationContext cc )
{
ExpressionTransformer gen = new ExpressionTransformer( expr, cc );
return gen.compile();
}
public static List<IRStatement> compileInitializer( IExpression expr, TopLevelTransformationContext cc, IRExpression root )
{
ExpressionTransformer gen = new ExpressionTransformer( expr, cc );
return gen.compileInitializer( root );
}
private ExpressionTransformer( IExpression expr, TopLevelTransformationContext cc )
{
_expr = expr;
_cc = cc;
}
private IRExpression compile()
{
if( _expr instanceof IIdentifierExpression )
{
return IdentifierTransformer.compile( _cc, (IIdentifierExpression)_expr );
}
else if( _expr instanceof ITypeAsExpression )
{
return TypeAsTransformer.compile( _cc, (ITypeAsExpression)_expr );
}
else if( _expr instanceof TypeIsExpression)
{
return TypeIsTransformer.compile( _cc, (TypeIsExpression)_expr );
}
else if( _expr instanceof ITypeOfExpression)
{
return TypeOfTransformer.compile( _cc, (ITypeOfExpression)_expr );
}
else if( _expr instanceof StaticTypeOfExpression)
{
return StaticTypeOfTransformer.compile( _cc, (StaticTypeOfExpression)_expr );
}
else if( _expr instanceof StringLiteral )
{
return StringLiteralTransformer.compile( _cc, (StringLiteral)_expr );
}
else if( _expr instanceof CharLiteral )
{
return CharLiteralTransformer.compile( _cc, (CharLiteral)_expr );
}
else if( _expr instanceof NumericLiteral )
{
return NumericLiteralTransformer.compile( _cc, (NumericLiteral)_expr );
}
else if( _expr instanceof TypeLiteral)
{
return TypeLiteralTransformer.compile( _cc, (TypeLiteral)_expr );
}
else if( _expr instanceof BooleanLiteral )
{
return BooleanLiteralTransformer.compile( _cc, (BooleanLiteral)_expr );
}
else if( _expr instanceof DefaultArgLiteral )
{
return DefaultArgLiteralTransformer.compile( _cc, (DefaultArgLiteral)_expr );
}
else if( _expr instanceof UnaryExpression)
{
return UnaryExpressionTransformer.compile( _cc, (UnaryExpression)_expr );
}
else if( _expr instanceof UnaryNotPlusMinusExpression)
{
return UnaryNotPlusMinusExpressionTransformer.compile( _cc, (UnaryNotPlusMinusExpression)_expr );
}
else if( _expr instanceof EqualityExpression)
{
return EqualityExpressionTransformer.compile( _cc, (EqualityExpression)_expr );
}
else if( _expr instanceof IdentityExpression)
{
return IdentityExpressionTransformer.compile( _cc, (IdentityExpression)_expr );
}
else if( _expr instanceof RelationalExpression )
{
return RelationalExpressionTransformer.compile( _cc, (RelationalExpression)_expr );
}
else if( _expr instanceof ConditionalOrExpression)
{
return ConditionalOrExpressionTransformer.compile( _cc, (ConditionalOrExpression)_expr );
}
else if( _expr instanceof ConditionalAndExpression)
{
return ConditionalAndExpressionTransformer.compile( _cc, (ConditionalAndExpression)_expr );
}
else if( _expr instanceof AdditiveExpression)
{
return AdditiveExpressionTransformer.compile( _cc, (AdditiveExpression)_expr );
}
else if( _expr instanceof MultiplicativeExpression)
{
return MultiplicativeExpressionTransformer.compile( _cc, (MultiplicativeExpression)_expr );
}
else if( _expr instanceof BitshiftExpression)
{
return BitshiftExpressionTransformer.compile( _cc, (BitshiftExpression)_expr );
}
else if( _expr instanceof BitwiseOrExpression)
{
return BitwiseOrExpressionTransformer.compile( _cc, (BitwiseOrExpression)_expr );
}
else if( _expr instanceof BitwiseXorExpression)
{
return BitwiseXorExpressionTransformer.compile( _cc, (BitwiseXorExpression)_expr );
}
else if( _expr instanceof BitwiseAndExpression)
{
return BitwiseAndExpressionTransformer.compile( _cc, (BitwiseAndExpression)_expr );
}
else if( _expr instanceof BeanMethodCallExpression )
{
return BeanMethodCallExpressionTransformer.compile( _cc, (BeanMethodCallExpression)_expr );
}
else if( _expr instanceof MethodCallExpression )
{
return MethodCallExpressionTransformer.compile( _cc, (MethodCallExpression)_expr );
}
else if( _expr instanceof MemberExpansionAccess)
{
return MemberExpansionAccessTransformer.compile( _cc, (MemberExpansionAccess)_expr );
}
else if( _expr instanceof MemberAccess)
{
return MemberAccessTransformer.compile( _cc, (MemberAccess)_expr );
}
else if( _expr instanceof NewExpression )
{
return NewExpressionTransformer.compile( _cc, (NewExpression)_expr );
}
else if( _expr instanceof EvalExpression)
{
return EvalExpressionTransformer.compile( _cc, (EvalExpression)_expr );
}
else if( _expr instanceof QueryExpression )
{
return QueryExpressionTransformer.compile( _cc, (QueryExpression)_expr );
}
else if( _expr instanceof ConditionalTernaryExpression)
{
return ConditionalTernaryExpressionTransformer.compile( _cc, (ConditionalTernaryExpression)_expr );
}
else if( _expr instanceof ArrayAccess)
{
return ArrayAccessTransformer.compile( _cc, (ArrayAccess)_expr );
}
else if( _expr instanceof MapAccess)
{
return MapAccessTransformer.compile( _cc, (MapAccess)_expr );
}
else if( _expr instanceof IntervalExpression )
{
return IntervalExpressionTransformer.compile( _cc, (IntervalExpression)_expr );
}
else if( _expr instanceof ParenthesizedExpression)
{
return compile( ((ParenthesizedExpression)_expr).getExpression(), _cc );
}
// else if( _expr instanceof VirtualExpression )
// {
// VirtualExpressionCompiler.compile( _cc, (VirtualExpression)_expr );
// }
else if( _expr instanceof NullExpression )
{
return NullExpressionTransformer.compile( _cc, (NullExpression)_expr );
}
else if( _expr instanceof BlockExpression)
{
return BlockExpressionTransformer.compile( _cc, (BlockExpression)_expr );
}
else if( _expr instanceof ObjectLiteralExpression)
{
return ObjectLiteralExpressionTransformer.compile( _cc, (ObjectLiteralExpression)_expr );
}
else if( _expr instanceof TemplateStringLiteral )
{
return TemplateStringLiteralTransformer.compile( _cc, (TemplateStringLiteral)_expr );
}
else if( _expr instanceof ExistsExpression )
{
return ExistsExpressionTransformer.compile( _cc, (ExistsExpression)_expr );
}
else if( _expr instanceof BlockInvocation )
{
return BlockInvocationTransformer.compile( _cc, (BlockInvocation)_expr );
}
else if( _expr instanceof FeatureLiteral )
{
return FeatureLiteralTransformer.compile( _cc, (FeatureLiteral)_expr );
}
else
{
if( _expr == null )
{
throw new IllegalStateException( "Found null parsed element, which is illegal" );
}
throw new UnsupportedOperationException( "Expression Transformer not yet implemented for: " + _expr.getClass().getName() );
}
}
private List<IRStatement> compileInitializer( IRExpression root )
{
if( _expr instanceof CollectionInitializerExpression)
{
return CollectionInitializerExpressionTransformer.compile( _cc, (CollectionInitializerExpression)_expr, root );
}
else if( _expr instanceof MapInitializerExpression)
{
return MapInitializerExpressionTransformer.compile( _cc, (MapInitializerExpression)_expr, root );
}
else if( _expr instanceof ObjectInitializerExpression)
{
return ObjectInitializerExpressionTransformer.compile( _cc, (ObjectInitializerExpression)_expr, root );
}
else
{
throw new UnsupportedOperationException( "Expression Transformer not yet implemented for: " + _expr.getClass().getName() );
}
}
}