/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.ir.transform;
import gw.internal.gosu.ir.transform.statement.*;
import gw.internal.gosu.parser.statements.*;
import gw.lang.ir.IRExpression;
import gw.lang.ir.IRStatement;
import gw.internal.gosu.parser.expressions.InitializerAssignment;
import gw.lang.ir.statement.IRNoOpStatement;
import gw.lang.parser.IStatement;
/**
*/
public class StatementTransformer
{
public static IRStatement compile( TopLevelTransformationContext context, IStatement stmt )
{
try
{
if( stmt instanceof StatementList )
{
return StatementListTransformer.compile( context, (StatementList)stmt );
}
else if( stmt instanceof VarStatement )
{
return VarStatementTransformer.compile( context, (VarStatement)stmt );
}
else if( stmt instanceof AssignmentStatement )
{
return AssignmentStatementTransformer.compile( context, (AssignmentStatement)stmt );
}
else if( stmt instanceof MemberAssignmentStatement )
{
return MemberAssignmentStatementTransformer.compile( context, (MemberAssignmentStatement)stmt );
}
else if( stmt instanceof ArrayAssignmentStatement )
{
return ArrayAssignmentStatementTransformer.compile( context, (ArrayAssignmentStatement)stmt );
}
else if( stmt instanceof MapAssignmentStatement)
{
return MapAssignmentStatementTransformer.compile( context, (MapAssignmentStatement)stmt );
}
else if( stmt instanceof MethodCallStatement )
{
return MethodCallStatementTransformer.compile( context, (MethodCallStatement)stmt );
}
else if( stmt instanceof NewStatement )
{
return NewStatementTransformer.compile( context, (NewStatement)stmt );
}
else if( stmt instanceof BlockInvocationStatement )
{
return BlockInvocationStatementTransformer.compile( context, (BlockInvocationStatement)stmt );
}
else if( stmt instanceof BeanMethodCallStatement )
{
return BeanMethodCallStatementTransformer.compile( context, (BeanMethodCallStatement)stmt );
}
else if( stmt instanceof ReturnStatement )
{
return ReturnStatementTransformer.compile( context, (ReturnStatement)stmt );
}
else if( stmt instanceof BreakStatement )
{
return BreakStatementTransformer.compile( context, (BreakStatement)stmt );
}
else if( stmt instanceof ContinueStatement )
{
return ContinueStatementTransformer.compile( context, (ContinueStatement)stmt );
}
else if( stmt instanceof IfStatement)
{
return IfStatementTransformer.compile( context, (IfStatement)stmt );
}
else if( stmt instanceof WhileStatement )
{
return WhileStatementTransformer.compile( context, (WhileStatement)stmt );
}
else if( stmt instanceof DoWhileStatement )
{
return DoWhileStatementTransformer.compile( context, (DoWhileStatement)stmt );
}
else if( stmt instanceof ForEachStatement )
{
return ForEachStatementTransformer.compile( context, (ForEachStatement)stmt );
}
else if( stmt instanceof SwitchStatement)
{
return SwitchStatementTransformer.compile( context, (SwitchStatement)stmt );
}
else if( stmt instanceof TryCatchFinallyStatement)
{
return TryCatchFinallyStatementTransformer.compile( context, (TryCatchFinallyStatement)stmt );
}
else if( stmt instanceof ThrowStatement )
{
return ThrowStatementTransformer.compile( context, (ThrowStatement)stmt );
}
else if( stmt instanceof AssertStatement )
{
return AssertStatementTransformer.compile( context, (AssertStatement) stmt );
}
else if( stmt instanceof UsingStatement )
{
return UsingStatementTransformer.compile( context, (UsingStatement)stmt );
}
else if( stmt instanceof EvalStatement )
{
return EvalStatementTransformer.compile( context, (EvalStatement)stmt );
}
else if( stmt instanceof SyntheticFunctionStatement )
{
throw new IllegalArgumentException("SyntheticFunctionStatements need to be compiled explicitly, since they require the backing DFS");
}
else if( stmt instanceof SyntheticMemberAccessStatement )
{
return SyntheticMemberAccessStatementTransformer.compile( context, (SyntheticMemberAccessStatement)stmt );
}
else if( stmt instanceof HideFieldNoOpStatement )
{
return VarStatementTransformer.compile( context, ((HideFieldNoOpStatement)stmt).getVarStmt() );
}
else if( stmt instanceof NoOpStatement )
{
// noop
return new IRNoOpStatement();
}
else if( stmt instanceof UsesStatement || stmt instanceof UsesStatementList )
{
// noop
return null;
}
else
{
throw new UnsupportedOperationException(
"Statement Compiler not yet implemented for: " + stmt.getClass().getName() );
}
}
finally
{
context.updateSuperInvokedAfterLastExpressionCompiles();
}
}
// This is in its own method because it requires additional context
public static IRStatement compileInitializerAssignment( TopLevelTransformationContext context, InitializerAssignment stmt, IRExpression root )
{
return InitializerAssignmentTransformer.compile( context, stmt, root );
}
}