public DekiScriptDom Visit(DekiScriptDomIfElse expr, DekiScriptOptimizerState state) { List <Tuplet <DekiScriptExpression, DekiScriptDom> > conditionals = new List <Tuplet <DekiScriptExpression, DekiScriptDom> >(); for (int i = 0; i < expr.Conditionals.Length; i++) { Tuplet <DekiScriptExpression, DekiScriptDom> conditional = expr.Conditionals[i]; // evaluate current branch DekiScriptExpression inner = conditional.Item1.VisitWith(DekiScriptExpressionOptimizer.Instance, state); DekiScriptDom node = conditional.Item2.VisitWith(this, state); // check if test has a constant outcome if (inner is DekiScriptLiteral) { if (((DekiScriptLiteral)inner).IsNilFalseZero) { // NOTE (steveb): this conditional will never be successful; skip it } else { // NOTE (steveb): this conditional will is always successful; make it the "else" branch // check if there are any previous branches if (conditionals.Count == 0) { // just return the inner node structure return(node); } // add branch as final "else" branch conditionals.Add(new Tuplet <DekiScriptExpression, DekiScriptDom>(null, node)); break; } } else { conditionals.Add(new Tuplet <DekiScriptExpression, DekiScriptDom>(inner, node)); } } return(new DekiScriptDomIfElse(expr.Location, conditionals.ToArray())); }
public Empty Visit(DekiScriptDomIfElse expr, DekiScriptDomEvaluationState state) { var context = state.Context; var env = state.Env; var parent = state.Parent; try { foreach (Tuplet <DekiScriptExpression, DekiScriptDom> conditional in expr.Conditionals) { // check if conditional is false if ((conditional.Item1 != null) && conditional.Item1.VisitWith(DekiScriptExpressionEvaluation.Instance, env.NewLocalScope()).IsNilFalseZero) { continue; } // embed conditional branch conditional.Item2.VisitWith(this, new DekiScriptDomEvaluationState(context, parent, env)); break; } } catch (Exception e) { EmbedExceptionMessage(expr, env, context, e, parent); } return(Empty.Value); }