/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.lang.ir.statement;
import gw.lang.ir.IRStatement;
import gw.lang.UnstableAPI;
import java.util.List;
@UnstableAPI
public class IRSwitchStatement extends IRStatement {
private IRStatement _init;
private List<IRCaseClause> _cases;
private List<IRStatement> _defaultStatements;
public IRSwitchStatement(IRStatement init, List<IRCaseClause> cases, List<IRStatement> defaultStatements) {
_init = init;
_cases = cases;
_defaultStatements = defaultStatements;
setParentToThis( init );
for (IRCaseClause caseClause : cases) {
setParentToThis( caseClause.getCondition() );
for ( IRStatement caseStatement : caseClause.getStatements() ) {
setParentToThis( caseStatement );
}
}
for (IRStatement defaultStatement : defaultStatements) {
setParentToThis( defaultStatement );
}
}
public IRStatement getInit() {
return _init;
}
public List<IRCaseClause> getCases() {
return _cases;
}
public List<IRStatement> getDefaultStatements() {
return _defaultStatements;
}
/**
* The switch statement has a non-null terminal stmt iff:
* 1) There are no case stmts or all the the case stmts have non-break terminator and
* 2) The default stmt exists and has a non-break terminator
*/
@Override
public IRTerminalStatement getLeastSignificantTerminalStatement()
{
if( _defaultStatements.isEmpty())
{
return null;
}
IRContinueStatement caseStmtContinue = null;
if( _cases != null )
{
outer:
for( int i = 0; i < _cases.size(); i++ )
{
List caseStatements = _cases.get(i).getStatements();
if( caseStatements != null && caseStatements.size() > 0 )
{
for( int iStmt = 0; iStmt < caseStatements.size(); iStmt++ )
{
IRStatement statement = (IRStatement) caseStatements.get(iStmt);
// Note that the statement can be null if it's just a semicolon
IRTerminalStatement terminalStmt = (statement == null ? null : statement.getLeastSignificantTerminalStatement());
if( terminalStmt != null && !(terminalStmt instanceof IRBreakStatement) )
{
if( terminalStmt instanceof IRContinueStatement )
{
caseStmtContinue = (IRContinueStatement)terminalStmt;
}
continue outer;
}
}
return null;
}
}
}
for( int i = 0; i < _defaultStatements.size(); i++ )
{
IRTerminalStatement terminalStmt = _defaultStatements.get( i ).getLeastSignificantTerminalStatement();
if( terminalStmt != null && !(terminalStmt instanceof IRBreakStatement) )
{
return caseStmtContinue != null ? caseStmtContinue : terminalStmt;
}
}
return null;
}
}