public Empty Visit(DekiScriptDomForeach expr, DekiScriptDomEvaluationState state)
        {
            var context = state.Context;
            var env     = state.Env;
            var parent  = state.Parent;

            try {
                DekiScriptGeneratorEvaluation.Instance.Generate(expr.Generator, delegate(DekiScriptEnv subEnv) {
                    // evaluate nodes
                    expr.Node.VisitWith(this, new DekiScriptDomEvaluationState(context, parent, subEnv));
                }, env.NewLocalScope());
            } catch (Exception e) {
                EmbedExceptionMessage(expr, env, context, e, parent);
            }
            return(Empty.Value);
        }
Exemplo n.º 2
0
        public DekiScriptDom Visit(DekiScriptDomForeach expr, DekiScriptOptimizerState state)
        {
            // TODO (steveb): partial evaluation broke with the introduction of generators

            return(expr);

            //DekiScriptExpression collection = Collection.Optimize(mode, env);

            //// check if we can unroll the loop
            //if(collection is DekiScriptLiteral) {

            //    // retrieve collection
            //    List<DekiScriptLiteral> list;
            //    if(collection is DekiScriptList) {

            //        // loop over list values
            //        list = ((DekiScriptList)collection).Value;
            //    } else if(collection is DekiScriptMap) {

            //        // loop over map values
            //        list = new List<DekiScriptLiteral>(((DekiScriptMap)collection).Value.Values);
            //    } else if(collection is DekiScriptXml) {

            //        // loop over xml selection
            //        List<XDoc> selection = ((DekiScriptXml)collection).Value.ToList();
            //        list = new List<DekiScriptLiteral>(selection.Count);
            //        foreach(XDoc doc in selection) {
            //            list.Add(new DekiScriptXml(doc));
            //        }
            //    } else if(collection is DekiScriptNil) {

            //        // nothing to do
            //        list = new List<DekiScriptLiteral>();
            //    } else {
            //        throw new DekiScriptBadTypeException(0, 0, ((DekiScriptLiteral)collection).ScriptType, new DekiScriptType[] { DekiScriptType.LIST, DekiScriptType.MAP, DekiScriptType.XML, DekiScriptType.NIL });
            //    }

            //    // loop over collection
            //    int index = 0;
            //    int count = 0;
            //    List<DekiScriptDom> nodes = new List<DekiScriptDom>();
            //    foreach(DekiScriptLiteral value in list) {

            //        // set the environment variable
            //        DekiScriptEnv locals = env.NewLocalScope();
            //        locals.Locals.Add(Variable, value);
            //        locals.Locals.Add(DekiScriptRuntime.COUNT_ID, DekiScriptNumber.New(count));
            //        locals.Locals.Add(DekiScriptRuntime.INDEX_ID, DekiScriptNumber.New(index));

            //        // check if we should skip this item
            //        ++index;
            //        DekiScriptExpression where = null;
            //        if(Where != null) {
            //            where = Where.Optimize(mode, locals);
            //            if((where is DekiScriptLiteral) && ((DekiScriptLiteral)where).IsNilFalseZero) {
            //                continue;
            //            }
            //        }
            //        ++count;

            //        // evaluate nodes
            //        DekiScriptDom node = (where != null) ? new DekiScriptDomIfElse(Location, new Tuplet<DekiScriptExpression, DekiScriptDom>(where, Node)) : Node;
            //        nodes.Add(node.Optimize(mode, locals));
            //    }
            //    if(nodes.Count == 1) {
            //        return nodes[0];
            //    }
            //    return DekiScriptDomSequence.New(Location, nodes);
            //} else {

            //    // setup locals with unknown values
            //    DekiScriptEnv locals = env.NewLocalScope();
            //    locals.Locals.Add(Variable, DekiScriptUnknown.Value);
            //    locals.Locals.Add(DekiScriptRuntime.COUNT_ID, DekiScriptUnknown.Value);
            //    locals.Locals.Add(DekiScriptRuntime.INDEX_ID, DekiScriptUnknown.Value);

            //    // partially evaluate inner loop
            //    DekiScriptExpression where = (Where != null) ? Where.Optimize(mode, locals) : null;
            //    DekiScriptDom node = Node.Optimize(mode, locals);
            //    return new DekiScriptDomForeach(Location, Variable, collection, where, node);
            //}
        }