/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.parser.statements;
import gw.internal.gosu.parser.Statement;
import gw.internal.gosu.parser.CannotExecuteGosuException;
import gw.lang.parser.statements.ITryCatchFinallyStatement;
import gw.lang.parser.statements.ITerminalStatement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
/**
* Represents a try-catch-finally-statement as specified in the Gosu grammar:
* <pre>
* <i>try-catch-finally-statement</i>
* <b>try</b> <statement> [ <b>catch</b> <b>(</b> <identifier> <b>)</b> <statement> ] [ <b>finally</b> <statement> ]
* </pre>
* <p/>
*
* @see gw.lang.parser.IGosuParser
*/
public final class TryCatchFinallyStatement extends Statement implements ITryCatchFinallyStatement
{
private Statement _tryStatement;
private List<CatchClause> _catchStatements;
private Statement _finallyStatement;
private Map<String,Integer> _offsetByName;
public TryCatchFinallyStatement()
{
_offsetByName = new HashMap<String,Integer>();
}
public Statement getTryStatement()
{
return _tryStatement;
}
public void setTryStatement( Statement tryStatement )
{
_tryStatement = tryStatement;
}
public List<CatchClause> getCatchStatements()
{
return _catchStatements;
}
public void addCatchClause( CatchClause catchClause )
{
if( _catchStatements == null )
{
_catchStatements = new ArrayList<CatchClause>();
}
_catchStatements.add( catchClause );
}
public Statement getFinallyStatement()
{
return _finallyStatement;
}
public void setFinallyStatement( Statement finallyStatement )
{
_finallyStatement = finallyStatement;
}
public Object execute()
{
if( !isCompileTimeConstant() )
{
return super.execute();
}
throw new CannotExecuteGosuException();
}
@Override
protected ITerminalStatement getLeastSignificantTerminalStatement_internal( boolean[] bAbsolute )
{
boolean[] bTry = {false};
ITerminalStatement termRet = _tryStatement == null ? null : _tryStatement.getLeastSignificantTerminalStatement( bTry );
bAbsolute[0] = bTry[0];
if( _catchStatements != null ) {
for( CatchClause catchClause : _catchStatements ) {
boolean[] bCatch = {false};
ITerminalStatement catchTerm = catchClause.getLeastSignificantTerminalStatement( bCatch );
termRet = getLeastSignificant( termRet, catchTerm );
bAbsolute[0] = bAbsolute[0] && bCatch[0];
}
}
bAbsolute[0] = termRet != null && bAbsolute[0];
return termRet;
}
/**
*/
@Override
public String toString()
{
return "try\n" + _tryStatement.toString() +
(_catchStatements == null ? "" : printCatches()) +
(_finallyStatement == null ? "" : ("finally\n" + _finallyStatement.toString()));
}
private String printCatches() {
StringBuilder sb = new StringBuilder();
for( CatchClause c : getCatchStatements() )
{
sb.append( c.toString() );
}
return sb.toString();
}
}