/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.ir.transform.statement;
import gw.internal.gosu.parser.ParseTree;
import gw.lang.ir.IRExpression;
import gw.lang.ir.IRStatement;
import gw.lang.ir.statement.IRDoWhileStatement;
import gw.internal.gosu.ir.transform.ExpressionTransformer;
import gw.internal.gosu.ir.transform.TopLevelTransformationContext;
import gw.internal.gosu.parser.statements.DoWhileStatement;
import gw.lang.parser.statements.ITerminalStatement;
public class DoWhileStatementTransformer extends AbstractStatementTransformer<DoWhileStatement>
{
public static IRStatement compile( TopLevelTransformationContext cc, DoWhileStatement stmt )
{
DoWhileStatementTransformer compiler = new DoWhileStatementTransformer( cc, stmt );
return compiler.compile();
}
private DoWhileStatementTransformer( TopLevelTransformationContext cc, DoWhileStatement stmt )
{
super( cc, stmt );
}
@Override
protected IRStatement compile_impl()
{
// Push a scope in case while body not a statement list
_cc().pushScope( false );
try
{
IRDoWhileStatement doWhileLoop = new IRDoWhileStatement();
// execute body
boolean[] bAbsolute = {false};
ITerminalStatement terminalStmt = _stmt().getLeastSignificantTerminalStatement(bAbsolute);
doWhileLoop.setBody( _cc().compile(_stmt().getStatement() ) );
if( terminalStmt == _stmt() && bAbsolute[0] )
{
_cc().getCurrentFunction().setLoopImplicitReturn( true );
}
// loop test
IRExpression loopTest = ExpressionTransformer.compile( _stmt().getExpression(), _cc() );
ParseTree location = _stmt().getExpression().getLocation();
if( location != null )
{
loopTest.setLineNumber( location.getLineNum() );
}
doWhileLoop.setLoopTest( loopTest );
return doWhileLoop;
}
finally
{
_cc().popScope();
}
}
}