コード例 #1
0
        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
            });
        }
コード例 #2
0
ファイル: BridgeVisitor.cs プロジェクト: jeason0813/pickaxe
        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
                    });
                }
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
 public void Visit(BufferTable table)
 {
     CreateBufferTable(table);
 }