public void Visit(ExpandExpression expression) { var fromDomArgs = VisitChild(expression.From); var toDomArgs = VisitChild(expression.To); var expressionArgs = VisitChild(expression.Expression); CodeMemberMethod method = new CodeMemberMethod(); method.Name = "Expand_" + fromDomArgs.MethodIdentifier; method.Attributes = MemberAttributes.Private; method.ReturnType = new CodeTypeReference("Table", new CodeTypeReference("Expand")); method.Statements.Add(new CodeVariableDeclarationStatement(method.ReturnType, "expandTable", new CodeObjectCreateExpression(new CodeTypeReference("RuntimeTable", new CodeTypeReference("Expand"))))); method.Statements.Add(new CodeVariableDeclarationStatement(typeof(int), "x")); var loop = new CodeIterationStatement(); loop.InitStatement = new CodeAssignStatement( new CodeVariableReferenceExpression("x"), fromDomArgs.CodeExpression); loop.TestExpression = new CodeBinaryOperatorExpression(new CodeVariableReferenceExpression("x"), CodeBinaryOperatorType.LessThanOrEqual, toDomArgs.CodeExpression); loop.IncrementStatement = new CodeAssignStatement(new CodeVariableReferenceExpression("x"), new CodeBinaryOperatorExpression( new CodeVariableReferenceExpression("x"), CodeBinaryOperatorType.Add, new CodePrimitiveExpression(1))); loop.Statements.Add(new CodeVariableDeclarationStatement("Expand", "expand", new CodeObjectCreateExpression("Expand"))); loop.Statements.Add(new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeVariableReferenceExpression("expand"), "value"), expressionArgs.CodeExpression)); loop.Statements.Add(new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("expandTable"), "Add", new CodeVariableReferenceExpression("expand"))); method.Statements.Add(loop); method.Statements.Add(new CodeMethodReturnStatement(new CodeVariableReferenceExpression("expandTable"))); _mainType.Type.Members.Add(method); var methodcall = new CodeMethodInvokeExpression( new CodeMethodReferenceExpression(null, method.Name)); _codeStack.Peek().CodeExpression = methodcall; _codeStack.Peek().Scope = new ScopeData<TableDescriptor> { Type = Expand.Columns, CodeDomReference = method.ReturnType }; }
public void Visit(ExpandExpression expression, CommonTree tree) { Parent(tree).Children.Add(expression); SetLine(expression, tree); VisitChildren(tree); if (tree.ChildCount < 3) //if no expand expression we just add the default iteration variable { var iterationVariable = new ExpandIterationVariable(); expression.Children.Add(iterationVariable); } }