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("}"); } }
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(); } }
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(); } }