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("}");
            }
        }
コード例 #2
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();
            }
        }
コード例 #3
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();
            }
        }