Exemplo n.º 1
0
        public void FindLoopParameters()
        {
            var context = new VisitorContext
            {
                SyntaxProvider = new DefaultSyntaxProvider(new SparkSettings())
            };
            var nodes = ParseNodes("<for each='var x in new [] {1,2,3}'>${xIndex}${xIsLast}</for>",
                                   new SpecialNodeVisitor(context));

            var visitor = new ChunkBuilderVisitor(context);

            visitor.Accept(nodes);

            var expressionVisitor = new DetectCodeExpressionVisitor(null);
            var index             = expressionVisitor.Add("xIndex");
            var count             = expressionVisitor.Add("xCount");
            var isFirst           = expressionVisitor.Add("xIsFirst");
            var isLast            = expressionVisitor.Add("xIsLast");

            expressionVisitor.Accept(visitor.Chunks);

            Assert.IsTrue(index.Detected);
            Assert.IsFalse(count.Detected);
            Assert.IsFalse(isFirst.Detected);
            Assert.IsTrue(isLast.Detected);
        }
        protected override void Visit(ForEachChunk chunk)
        {
            ForEachInspector inspector = new ForEachInspector(chunk.Code);

            if (inspector.Recognized)
            {
                DetectCodeExpressionVisitor       visitor = new DetectCodeExpressionVisitor(base.OuterPartial);
                DetectCodeExpressionVisitor.Entry entry   = visitor.Add(inspector.VariableName + "Index");
                DetectCodeExpressionVisitor.Entry entry2  = visitor.Add(inspector.VariableName + "Count");
                DetectCodeExpressionVisitor.Entry entry3  = visitor.Add(inspector.VariableName + "IsFirst");
                DetectCodeExpressionVisitor.Entry entry4  = visitor.Add(inspector.VariableName + "IsLast");
                visitor.Accept(chunk.Body);
                if (entry4.Detected)
                {
                    entry.Detected  = true;
                    entry2.Detected = true;
                }
                string str = "__iter__" + inspector.VariableName;
                if (entry2.Detected)
                {
                    this._source.Append("var ").Append(inspector.VariableName).Append("Count=0;for(var ").Append(str).Append(" in ").Append(inspector.CollectionCode).Append("){ if(typeof(").Append(inspector.CollectionCode).Append("[").Append(str).Append("])!='function') {").Append("++").Append(inspector.VariableName).Append("Count;}}");
                }
                if (entry.Detected)
                {
                    this._source.Append("var ").Append(inspector.VariableName).Append("Index=0;");
                }
                if (entry3.Detected)
                {
                    this._source.Append("var ").Append(inspector.VariableName).Append("IsFirst=true;");
                }
                this._source.Append("for (var ").Append(str).Append(" in ").Append(inspector.CollectionCode).Append(") {");
                this._source.Append("var ").Append(inspector.VariableName).Append("=").Append(inspector.CollectionCode).Append("[__iter__").Append(inspector.VariableName).Append("];");
                this._source.Append("if(typeof(").Append(inspector.VariableName).Append(")!='function') {");
                if (entry4.Detected)
                {
                    this._source.Append("var ").Append(inspector.VariableName).Append("IsLast=(").Append(inspector.VariableName).Append("Index==").Append(inspector.VariableName).Append("Count-1);");
                }
                this._source.AppendLine();
                base.Accept(chunk.Body);
                if (entry3.Detected)
                {
                    this._source.Append(inspector.VariableName).Append("IsFirst=false;");
                }
                if (entry.Detected)
                {
                    this._source.Append("++").Append(inspector.VariableName).Append("Index;");
                }
                this._source.AppendLine("}}");
            }
            else
            {
                this._source.Append("for (").Append((string)chunk.Code).AppendLine(") {");
                base.Accept(chunk.Body);
                this._source.Append("}");
            }
        }
        public void ParametersInCallerBody()
        {
            var viewFolder = new InMemoryViewFolder
                                 {
                                     {"home\\index.spark", "<for each='var x in new[]{1,2,3}'><Guts>${xIndex}</Guts></for>"},
                                     {"home\\_Guts.spark", "<p><render/></p>"}
                                 };
            var loader = new ViewLoader { SyntaxProvider = new DefaultSyntaxProvider(ParserSettings.DefaultBehavior), ViewFolder = viewFolder };

            var chunks = loader.Load("home\\index.spark");

            var detectCode = new DetectCodeExpressionVisitor(null);
            var index = detectCode.Add("xIndex");
            var count = detectCode.Add("xCount");
            detectCode.Accept(chunks);

            Assert.IsTrue(index.Detected);
            Assert.IsFalse(count.Detected);
        }
        public void IterationInPartialFile()
        {
            var viewFolder = new InMemoryViewFolder
                                 {
                                     {"home\\index.spark", "<Guts items='new[]{1,2,3}'><section:each>${xIndex}</section:each></Guts>"},
                                     {"home\\_Guts.spark", "<for each='var x in items'><render:each/></for>"}
                                 };
            var loader = new ViewLoader { SyntaxProvider = new DefaultSyntaxProvider(ParserSettings.DefaultBehavior), ViewFolder = viewFolder };

            var chunks = loader.Load("home\\index.spark");

            var detectCode = new DetectCodeExpressionVisitor(null);
            var index = detectCode.Add("xIndex");
            var count = detectCode.Add("xCount");
            detectCode.Accept(chunks);

            Assert.IsTrue(index.Detected);
            Assert.IsFalse(count.Detected);
        }
Exemplo n.º 5
0
        protected override void Visit(ForEachChunk chunk)
        {
            var terms        = chunk.Code.ToString().Split(' ', '\r', '\n', '\t').ToList();
            var inIndex      = terms.IndexOf("in");
            var variableName = (inIndex < 2 ? null : terms[inIndex - 1]);

            if (variableName == null)
            {
                CodeIndent(chunk)
                .Write("foreach(")
                .WriteCode(chunk.Code)
                .WriteLine(")");
                CodeDefault();
                AppendOpenBrace();
                Accept(chunk.Body);
                AppendCloseBrace();
            }
            else
            {
                var detect      = new DetectCodeExpressionVisitor(OuterPartial);
                var autoIndex   = detect.Add(variableName + "Index");
                var autoCount   = detect.Add(variableName + "Count");
                var autoIsFirst = detect.Add(variableName + "IsFirst");
                var autoIsLast  = detect.Add(variableName + "IsLast");
                detect.Accept(chunk.Body);

                if (autoIsLast.Detected)
                {
                    autoIndex.Detected = true;
                    autoCount.Detected = true;
                }

                AppendOpenBrace();
                if (autoIndex.Detected)
                {
                    DeclareVariable(variableName + "Index");
                    _source.WriteLine("int {0}Index = 0;", variableName);
                }
                if (autoIsFirst.Detected)
                {
                    DeclareVariable(variableName + "IsFirst");
                    _source.WriteLine("bool {0}IsFirst = true;", variableName);
                }
                if (autoCount.Detected)
                {
                    DeclareVariable(variableName + "Count");
                    var collectionCode = string.Join(" ", terms.ToArray(), inIndex + 1, terms.Count - inIndex - 1);
                    _source.WriteLine("int {0}Count = global::Spark.Compiler.CollectionUtility.Count({1});", variableName, collectionCode);
                }


                CodeIndent(chunk)
                .Write("foreach(")
                .WriteCode(chunk.Code)
                .WriteLine(")");
                CodeDefault();

                AppendOpenBrace();
                DeclareVariable(variableName);

                CodeHidden();
                if (autoIsLast.Detected)
                {
                    DeclareVariable(variableName + "IsLast");
                    _source.WriteLine("bool {0}IsLast = ({0}Index == {0}Count - 1);", variableName);
                }
                CodeDefault();

                Accept(chunk.Body);

                CodeHidden();
                if (autoIndex.Detected)
                {
                    _source.WriteLine("++{0}Index;", variableName);
                }
                if (autoIsFirst.Detected)
                {
                    _source.WriteLine("{0}IsFirst = false;", variableName);
                }
                CodeDefault();

                AppendCloseBrace();

                AppendCloseBrace();
            }
        }
Exemplo n.º 6
0
        protected override void Visit(ForEachChunk chunk)
        {
            List <string> list = chunk.Code.ToString().Split(new char[] { ' ', '\r', '\n', '\t' }).ToList <string>();
            int           num  = list.FindIndex(new Predicate <string>(GeneratedCodeVisitor.IsIn));
            int           num2 = list.FindIndex(new Predicate <string>(GeneratedCodeVisitor.IsInOrAs));
            string        name = (num2 < 1) ? null : list[num2 - 1];

            if (name == null)
            {
                this.CodeIndent(chunk).Write("For Each ").WriteLine((string)chunk.Code).AddIndent();
                this.CodeDefault();
                this.PushScope();
                base.Accept(chunk.Body);
                this._source.RemoveIndent().WriteLine("Next");
                this.PopScope();
            }
            else
            {
                DetectCodeExpressionVisitor       visitor = new DetectCodeExpressionVisitor(base.OuterPartial);
                DetectCodeExpressionVisitor.Entry entry   = visitor.Add(name + "Index");
                DetectCodeExpressionVisitor.Entry entry2  = visitor.Add(name + "Count");
                DetectCodeExpressionVisitor.Entry entry3  = visitor.Add(name + "IsFirst");
                DetectCodeExpressionVisitor.Entry entry4  = visitor.Add(name + "IsLast");
                visitor.Accept(chunk.Body);
                if (entry4.Detected)
                {
                    entry.Detected  = true;
                    entry2.Detected = true;
                }
                this.AppendOpenScope();
                if (entry.Detected)
                {
                    this.DeclareVariable(name + "Index");
                    this._source.WriteLine("Dim {0}Index As Integer = 0", new object[] { name });
                }
                if (entry3.Detected)
                {
                    this.DeclareVariable(name + "IsFirst");
                    this._source.WriteLine("Dim {0}IsFirst As Boolean = True", new object[] { name });
                }
                if (entry2.Detected)
                {
                    this.DeclareVariable(name + "Count");
                    string str2 = string.Join(" ", list.ToArray(), num + 1, (list.Count - num) - 1);
                    this._source.WriteLine("Dim {0}Count As Integer = Global.Spark.Compiler.CollectionUtility.Count({1})", new object[] { name, str2 });
                }
                this.CodeIndent(chunk).Write("For Each ").WriteLine((string)chunk.Code).AddIndent();
                this.CodeDefault();
                this.PushScope();
                this.DeclareVariable(name);
                this.CodeHidden();
                if (entry4.Detected)
                {
                    this.DeclareVariable(name + "IsLast");
                    this._source.WriteLine("Dim {0}IsLast As Boolean = ({0}Index = {0}Count - 1)", new object[] { name });
                }
                this.CodeDefault();
                base.Accept(chunk.Body);
                this.CodeHidden();
                if (entry.Detected)
                {
                    this._source.WriteLine("{0}Index = {0}Index + 1", new object[] { name });
                }
                if (entry3.Detected)
                {
                    this._source.WriteLine("{0}IsFirst = False", new object[] { name });
                }
                this.CodeDefault();
                this.PopScope();
                this._source.RemoveIndent().WriteLine("Next");
                this.AppendCloseScope();
            }
        }
Exemplo n.º 7
0
        protected override void Visit(ForEachChunk chunk)
        {
            var forEach = new ForEachInspector(chunk.Code);

            if (!forEach.Recognized)
            {
                _source.Write("for ").Write(chunk.Code).WriteLine(":");
                _source.Indent++;
                _variables.PushScope();
                Accept(chunk.Body);
                _source.WriteLine("pass");
                _variables.PopScope();
                _source.Indent--;
                return;
            }

            _variables.PushScope();

            var detect      = new DetectCodeExpressionVisitor(OuterPartial);
            var autoIndex   = detect.Add(forEach.VariableName + "Index");
            var autoCount   = detect.Add(forEach.VariableName + "Count");
            var autoIsFirst = detect.Add(forEach.VariableName + "IsFirst");
            var autoIsLast  = detect.Add(forEach.VariableName + "IsLast");

            detect.Accept(chunk.Body);

            if (autoIsLast.Detected)
            {
                autoIndex.Detected = true;
                autoCount.Detected = true;
            }

            if (autoIndex.Detected)
            {
                _variables.Declare(forEach.VariableName + "Index");
                _source.Write(forEach.VariableName).WriteLine("Index=0");
            }
            if (autoIsFirst.Detected)
            {
                _variables.Declare(forEach.VariableName + "IsFirst");
                _source.Write(forEach.VariableName).WriteLine("IsFirst=True");
            }
            if (autoCount.Detected)
            {
                _variables.Declare(forEach.VariableName + "Count");
                _source
                .Write(forEach.VariableName).Write("Count=len([0 for ")
                .Write(chunk.Code).WriteLine("])");
            }

            _variables.Declare(forEach.VariableName);
            _source.Write("for ").Write(chunk.Code).WriteLine(":");
            _source.Indent++;
            if (autoIsLast.Detected)
            {
                _variables.Declare(forEach.VariableName + "IsLast");
                _source
                .Write(forEach.VariableName).Write("IsLast=(")
                .Write(forEach.VariableName).Write("Index==")
                .Write(forEach.VariableName).WriteLine("Count - 1)");
            }
            Accept(chunk.Body);
            if (autoIndex.Detected)
            {
                _source
                .Write(forEach.VariableName).Write("Index=")
                .Write(forEach.VariableName).WriteLine("Index+1");
            }
            if (autoIsFirst.Detected)
            {
                _source.Write(forEach.VariableName).WriteLine("IsFirst=False");
            }
            _source.WriteLine("pass");
            _source.Indent--;

            _variables.PopScope();
        }
Exemplo n.º 8
0
        protected override void Visit(ForEachChunk chunk)
        {
            var terms        = chunk.Code.ToString().Split(' ', '\r', '\n', '\t').ToList();
            var inIndex      = terms.FindIndex(IsIn);
            var inOrAsIndex  = terms.FindIndex(IsInOrAs);
            var variableName = (inOrAsIndex < 1 ? null : terms[inOrAsIndex - 1]);

            if (variableName == null)
            {
                CodeIndent(chunk)
                .Write("For Each ")
                .WriteLine(chunk.Code)
                .AddIndent();
                CodeDefault();
                PushScope();
                Accept(chunk.Body);
                _source
                .RemoveIndent()
                .WriteLine("Next");
                PopScope();
            }
            else
            {
                var detect      = new DetectCodeExpressionVisitor(OuterPartial);
                var autoIndex   = detect.Add(variableName + "Index");
                var autoCount   = detect.Add(variableName + "Count");
                var autoIsFirst = detect.Add(variableName + "IsFirst");
                var autoIsLast  = detect.Add(variableName + "IsLast");
                detect.Accept(chunk.Body);

                if (autoIsLast.Detected)
                {
                    autoIndex.Detected = true;
                    autoCount.Detected = true;
                }

                AppendOpenScope();

                if (autoIndex.Detected)
                {
                    DeclareVariable(variableName + "Index");
                    _source.WriteLine("Dim {0}Index As Integer = 0", variableName);
                }
                if (autoIsFirst.Detected)
                {
                    DeclareVariable(variableName + "IsFirst");
                    _source.WriteLine("Dim {0}IsFirst As Boolean = True", variableName);
                }
                if (autoCount.Detected)
                {
                    DeclareVariable(variableName + "Count");
                    var collectionCode = string.Join(" ", terms.ToArray(), inIndex + 1, terms.Count - inIndex - 1);
                    _source.WriteLine("Dim {0}Count As Integer = Global.Spark.Compiler.CollectionUtility.Count({1})", variableName, collectionCode);
                }

                CodeIndent(chunk)
                .Write("For Each ")
                .WriteLine(chunk.Code)
                .AddIndent();
                CodeDefault();

                PushScope();

                DeclareVariable(variableName);

                CodeHidden();
                if (autoIsLast.Detected)
                {
                    DeclareVariable(variableName + "IsLast");
                    _source.WriteLine("Dim {0}IsLast As Boolean = ({0}Index = {0}Count - 1)", variableName);
                }
                CodeDefault();

                Accept(chunk.Body);

                CodeHidden();
                if (autoIndex.Detected)
                {
                    _source.WriteLine("{0}Index = {0}Index + 1", variableName);
                }
                if (autoIsFirst.Detected)
                {
                    _source.WriteLine("{0}IsFirst = False", variableName);
                }
                CodeDefault();

                PopScope();
                _source.RemoveIndent().WriteLine("Next");

                AppendCloseScope();
            }
        }
        protected override void Visit(ForEachChunk chunk)
        {
            var inspector = new ForEachInspector(chunk.Code);

            if (inspector.Recognized)
            {
                var detect      = new DetectCodeExpressionVisitor(OuterPartial);
                var autoIndex   = detect.Add(inspector.VariableName + "Index");
                var autoCount   = detect.Add(inspector.VariableName + "Count");
                var autoIsFirst = detect.Add(inspector.VariableName + "IsFirst");
                var autoIsLast  = detect.Add(inspector.VariableName + "IsLast");
                detect.Accept(chunk.Body);
                if (autoIsLast.Detected)
                {
                    autoIndex.Detected = true;
                    autoCount.Detected = true;
                }

                string iteratorName = "__iter__" + inspector.VariableName;

                if (autoCount.Detected)
                {
                    // var itemCount=0;for(var __iter__item in coll){if(typeof(__iter__item)!='function'){++itemCount;}}
                    _source
                    .Append("var ")
                    .Append(inspector.VariableName)
                    .Append("Count=0;for(var ")
                    .Append(iteratorName)
                    .Append(" in ")
                    .Append(inspector.CollectionCode)
                    .Append("){ if(typeof(")
                    .Append(inspector.CollectionCode)
                    .Append("[")
                    .Append(iteratorName)
                    .Append("])!='function') {")
                    .Append("++")
                    .Append(inspector.VariableName)
                    .Append("Count;}}");
                }

                if (autoIndex.Detected)
                {
                    // var itemIndex=0;
                    _source.Append("var ").Append(inspector.VariableName).Append("Index=0;");
                }

                if (autoIsFirst.Detected)
                {
                    // var itemIsFirst=true;
                    _source.Append("var ").Append(inspector.VariableName).Append("IsFirst=true;");
                }

                // for(var __iter__item in coll) {
                _source
                .Append("for (var ")
                .Append(iteratorName)
                .Append(" in ")
                .Append(inspector.CollectionCode)
                .Append(") {");

                // var item=coll[__iter__item];
                _source
                .Append("var ")
                .Append(inspector.VariableName)
                .Append("=")
                .Append(inspector.CollectionCode)
                .Append("[__iter__")
                .Append(inspector.VariableName)
                .Append("];");

                // if(typeof(item)!='function') {
                _source.Append("if(typeof(")
                .Append(inspector.VariableName)
                .Append(")!='function') {");

                if (autoIsLast.Detected)
                {
                    // var itemIsLast=(itemIndex==itemCount-1);
                    _source
                    .Append("var ")
                    .Append(inspector.VariableName)
                    .Append("IsLast=(")
                    .Append(inspector.VariableName)
                    .Append("Index==")
                    .Append(inspector.VariableName)
                    .Append("Count-1);");
                }

                _source.AppendLine();

                Accept(chunk.Body);

                if (autoIsFirst.Detected)
                {
                    // itemIsFirst=false;
                    _source.Append(inspector.VariableName).Append("IsFirst=false;");
                }

                if (autoIndex.Detected)
                {
                    // ++itemIndex;
                    _source.Append("++").Append(inspector.VariableName).Append("Index;");
                }

                _source.AppendLine("}}");
            }
            else
            {
                _source.Append("for (").Append(chunk.Code).AppendLine(") {");
                Accept(chunk.Body);
                _source.Append("}");
            }
        }
Exemplo n.º 10
0
        protected override void Visit(ForEachChunk chunk)
        {
            List <string> list  = chunk.Code.ToString().Split(new char[] { ' ', '\r', '\n', '\t' }).ToList <string>();
            int           index = list.IndexOf("in");
            string        name  = (index < 2) ? null : list[index - 1];

            if (name == null)
            {
                this.CodeIndent(chunk).Write("foreach(").WriteCode(chunk.Code).WriteLine(")");
                this.CodeDefault();
                this.AppendOpenBrace();
                base.Accept(chunk.Body);
                this.AppendCloseBrace();
            }
            else
            {
                DetectCodeExpressionVisitor       visitor = new DetectCodeExpressionVisitor(base.OuterPartial);
                DetectCodeExpressionVisitor.Entry entry   = visitor.Add(name + "Index");
                DetectCodeExpressionVisitor.Entry entry2  = visitor.Add(name + "Count");
                DetectCodeExpressionVisitor.Entry entry3  = visitor.Add(name + "IsFirst");
                DetectCodeExpressionVisitor.Entry entry4  = visitor.Add(name + "IsLast");
                visitor.Accept(chunk.Body);
                if (entry4.Detected)
                {
                    entry.Detected  = true;
                    entry2.Detected = true;
                }
                this.AppendOpenBrace();
                if (entry.Detected)
                {
                    this.DeclareVariable(name + "Index");
                    this._source.WriteLine("int {0}Index = 0;", new object[] { name });
                }
                if (entry3.Detected)
                {
                    this.DeclareVariable(name + "IsFirst");
                    this._source.WriteLine("bool {0}IsFirst = true;", new object[] { name });
                }
                if (entry2.Detected)
                {
                    this.DeclareVariable(name + "Count");
                    string str2 = string.Join(" ", list.ToArray(), index + 1, (list.Count - index) - 1);
                    this._source.WriteLine("int {0}Count = global::Spark.Compiler.CollectionUtility.Count({1});", new object[] { name, str2 });
                }
                this.CodeIndent(chunk).Write("foreach(").WriteCode(chunk.Code).WriteLine(")");
                this.CodeDefault();
                this.AppendOpenBrace();
                this.DeclareVariable(name);
                this.CodeHidden();
                if (entry4.Detected)
                {
                    this.DeclareVariable(name + "IsLast");
                    this._source.WriteLine("bool {0}IsLast = ({0}Index == {0}Count - 1);", new object[] { name });
                }
                this.CodeDefault();
                base.Accept(chunk.Body);
                this.CodeHidden();
                if (entry.Detected)
                {
                    this._source.WriteLine("++{0}Index;", new object[] { name });
                }
                if (entry3.Detected)
                {
                    this._source.WriteLine("{0}IsFirst = false;", new object[] { name });
                }
                this.CodeDefault();
                this.AppendCloseBrace();
                this.AppendCloseBrace();
            }
        }