package org.ssssssss.script.parsing.ast; import org.ssssssss.script.MagicScriptContext; import org.ssssssss.script.MagicScriptError; import org.ssssssss.script.interpreter.AstInterpreter; import org.ssssssss.script.parsing.Span; import java.util.List; public class IfStatement extends Node { private final Expression condition; private final List trueBlock; private final List elseIfs; private final List falseBlock; public IfStatement(Span span, Expression condition, List trueBlock, List elseIfs, List falseBlock) { super(span); this.condition = condition; this.trueBlock = trueBlock; this.elseIfs = elseIfs; this.falseBlock = falseBlock; } public Expression getCondition() { return condition; } public List getTrueBlock() { return trueBlock; } public List getElseIfs() { return elseIfs; } public List getFalseBlock() { return falseBlock; } @Override public Object evaluate(MagicScriptContext context) { Object condition = getCondition().evaluate(context); if (!(condition instanceof Boolean)) MagicScriptError.error("Expected a condition evaluating to a boolean, got " + condition, getCondition().getSpan()); if ((Boolean) condition) { context.push(); Object breakOrContinueOrReturn = AstInterpreter.interpretNodeList(getTrueBlock(), context); context.pop(); return breakOrContinueOrReturn; } if (getElseIfs().size() > 0) { for (IfStatement elseIf : getElseIfs()) { condition = elseIf.getCondition().evaluate(context); if (!(condition instanceof Boolean)) MagicScriptError.error("Expected a condition evaluating to a boolean, got " + condition, elseIf.getCondition().getSpan()); if ((Boolean) condition) { context.push(); Object breakOrContinueOrReturn = AstInterpreter.interpretNodeList(elseIf.getTrueBlock(), context); context.pop(); return breakOrContinueOrReturn; } } } if (getFalseBlock().size() > 0) { context.push(); Object breakOrContinueOrReturn = AstInterpreter.interpretNodeList(getFalseBlock(), context); context.pop(); return breakOrContinueOrReturn; } return null; } }