/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.gosu.parser.statements; import gw.internal.gosu.parser.Expression; import gw.internal.gosu.parser.Statement; import gw.lang.parser.statements.IIfStatement; import gw.lang.parser.statements.ITerminalStatement; /** * Represents an if-statement as specified in the Gosu grammar: * <pre> * <i>if-statement</i> * <b>if</b> <b>(</b> <expression> <b>)</b> <statement> [ <b>else</b> <statement> ] [ <b>unless</b> <b>(</b> <expression> <b>)</b> ] * </pre> * <p/> * * @see gw.lang.parser.IGosuParser */ public final class IfStatement extends Statement implements IIfStatement { protected Expression _expression; protected Statement _statement; protected Statement _elseStatement; protected Expression _except; /** * @return The conditional expression. */ public Expression getExpression() { return _expression; } /** * @param expression The conditional expression. */ public void setExpression( Expression expression ) { _expression = expression; } /** * @return The statement to execute if the conditional expression evaluates * to true. */ public Statement getStatement() { return _statement; } /** * @param statement The statement to execute if the conditional expression * evaluates to true. */ public void setStatement( Statement statement ) { _statement = statement; } /** * @return The else statement to execute if the conditional expression evaluates * to false. */ public Statement getElseStatement() { return _elseStatement; } /** * @return <tt>true</tt> if this if statement has an else statement. */ public boolean hasElseStatement() { return _elseStatement != null; } /** * @param elseStatement The else statement to execute if the conditional expression * evaluates to false. */ public void setElseStatement( Statement elseStatement ) { _elseStatement = elseStatement; } /** * @return The exceptional conditional expression. * @deprecated */ public Expression getExcept() { return _except; } /** * @deprecated */ public void setExcept( Expression except ) { _except = except; } public Object execute() { if( !isCompileTimeConstant() ) { return super.execute(); } throw new IllegalStateException( "Can't execute this parsed element directly" ); } @Override protected ITerminalStatement getLeastSignificantTerminalStatement_internal( boolean[] bAbsolute ) { boolean[] bAbsoluteStmt = {false}; ITerminalStatement ifStmtTerminal = getStatement() == null ? null : getStatement().getLeastSignificantTerminalStatement( bAbsoluteStmt ); boolean[] bAbsoluteElse = {false}; ITerminalStatement elseStmtTerminal = getElseStatement() == null ? null : getElseStatement().getLeastSignificantTerminalStatement( bAbsoluteElse ); bAbsolute[0] = bAbsoluteStmt[0] && bAbsoluteElse[0]; return getLeastSignificant( ifStmtTerminal, elseStmtTerminal ); } @Override public String toString() { String strElseStmt = getElseStatement() == null ? "" : ("else\n" + getElseStatement()); //noinspection deprecation return "if( " + toString(getExpression()) + " )\n" + toString(getStatement()) + strElseStmt + (getExcept() == null ? "" : "\nunless( " + getExcept() + " )" ); } private String toString(Object o) { return o == null ? "" : o.toString(); } }