private IScopeData CreateBufferTable(BufferTable table) { var descriptor = new TableDescriptor(typeof(BufferTable <>)); var bufferTable = new CodeTypeDeclaration(table.Variable) { TypeAttributes = TypeAttributes.NestedPrivate }; bufferTable.BaseTypes.Add(new CodeTypeReference("IRow")); var bufferCodeDomType = new CodeTypeReference("CodeTable", new CodeTypeReference(table.Variable)); if (Scope.Current.Type != null) //select scopes have no type { Scope.Current.Type.Type.Members.Add( new CodeMemberField(bufferCodeDomType, table.Variable) { Attributes = MemberAttributes.Public | MemberAttributes.Final }); Scope.Current.Type.Constructor.Statements.Add(new CodeAssignStatement( new CodeSnippetExpression(table.Variable), new CodeObjectCreateExpression( new CodeTypeReference("BufferTable", new CodeTypeReference(table.Variable))))); } foreach (var arg in table.Args) { var domArg = VisitChild(arg); bufferTable.Members.AddRange(domArg.ParentMemberDefinitions); descriptor.Variables.Add(new VariableTypePair { Variable = arg.Variable, Primitive = TablePrimitive.FromString(arg.Type) }); } _mainType.Type.Members.Add(bufferTable); if (Scope.Current.IsCurrentScopeRegistered(table.Variable)) { Errors.Add(new VariableAlreadyExists(new Semantic.LineInfo(table.Line.Line, table.Line.CharacterPosition), table.Variable)); } Scope.Current.RegisterTable(table.Variable, descriptor, bufferCodeDomType); return(new ScopeData <TableDescriptor> { Type = descriptor, CodeDomReference = bufferCodeDomType }); }
public void Visit(BufferTable table, CommonTree tree) { Parent(tree).Children.Add(table); SetLine(table, tree); Debug.Assert(tree.Children[0].Type == AntlrParser.ID); table.Variable = tree.Children[0].Text; if (tree.Children.Count > 1) { var args = tree.Children[1] as CommonTree; foreach (var arg in args.Children) { table.Children.Add(new TableColumnArg() { Variable = arg.GetChild(0).Text, Type = arg.GetChild(1).Text }); } } }
private BufferTable FetchBufferTable(NestedSelectStatement statement, IScopeData scope, IList <CodeAssignStatement> codeAssignments, out Boolean outerLoopNeeded) { outerLoopNeeded = false; string aliasId = ((AliasBase)statement.Parent).Alias.Id; var bufferTable = new BufferTable() { Variable = aliasId }; for (int x = 0; x < statement.Args.Length; x++) //select args { var domSelectArg = VisitChild(statement.Args[x], new CodeDomArg() { Scope = scope }); if (((SelectArgsInfo)domSelectArg.Tag).IsPickStatement) { outerLoopNeeded = true; } if (((SelectArgsInfo)domSelectArg.Tag).ColumnName == null) //have to have a column name in a nested select { Errors.Add(new NoColumnName(x + 1, new Semantic.LineInfo(statement.Args[x].Line.Line, statement.Args[x].Line.CharacterPosition))); } var primitive = TablePrimitive.FromType(domSelectArg.Scope.CodeType); bufferTable.Children.Add(new TableColumnArg() { Variable = ((SelectArgsInfo)domSelectArg.Tag).DisplayColumnName, Type = primitive.TypeString }); var assignment = new CodeAssignStatement(); assignment.Left = new CodePropertyReferenceExpression(new CodeTypeReferenceExpression("resultRow"), ((SelectArgsInfo)domSelectArg.Tag).DisplayColumnName); assignment.Right = domSelectArg.CodeExpression; codeAssignments.Add(assignment); } return(bufferTable); }
public void Visit(BufferTable table) { CreateBufferTable(table); }