Пример #1
0
        public void Visit(SelectAll all)
        {
            all.Parent.Parent.Children.Remove(all.Parent);

            var tableMatches = Scope.Current.FindAll();

            if (tableMatches.Length == 0) //only has a dynamic object and we can't tell the property names till runtime. Compile error.
            {
                Errors.Add(new SelectNoColumnsFound(new Semantic.LineInfo(all.Line.Line, all.Line.CharacterPosition)));
            }

            foreach (var match in tableMatches)
            {
                var tableReferance = new TableMemberReference {
                    Member       = match.TableVariable.Variable,
                    RowReference = new TableVariableRowReference {
                        Id = match.TableAlias
                    },
                    Line = all.Line
                };

                var arg = new SelectArg();
                arg.Children.Add(tableReferance);
                all.Parent.Parent.Children.Add(arg);
            }
        }
        public void Visit(TableMemberReference variable)
        {
            _codeStack.Peek().Scope = new ScopeData <Type> {
                Type = typeof(string), CodeDomReference = new CodeTypeReference(typeof(string))
            };
            var rowArgs = VisitChild(variable.RowReference);

            if (Scope.Current.IsTableRowRegistered(variable.RowReference.Id))
            {
                var descriptor = Scope.Current.GetTableDescriptor(variable.RowReference.Id);
                if (!descriptor.Type.Variables.Any(x => x.Variable == variable.Member)) //error don't know member
                {
                    Errors.Add(new NoTableMember(new Semantic.LineInfo(variable.Line.Line, variable.Line.CharacterPosition), variable.Member));
                }
                else
                {
                    var member = descriptor.Type.Variables.Where(x => x.Variable == variable.Member).Single();
                    _codeStack.Peek().Scope = new ScopeData <Type> {
                        Type = member.Primitive.Type, CodeDomReference = new CodeTypeReference(member.Primitive.Type)
                    };
                }
            }

            _codeStack.Peek()
            .ParentStatements.Add(new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("result"),
                                                                 "AddColumn",
                                                                 new CodePrimitiveExpression(variable.Member)));

            var expression = new CodeFieldReferenceExpression(rowArgs.CodeExpression, variable.Member);

            _codeStack.Peek().CodeExpression = expression;
        }
Пример #3
0
 public void Visit(TableMemberReference variable, CommonTree tree)
 {
     Parent(tree).Children.Add(variable);
     variable.RowReference = new TableVariableRowReference()
     {
         Id = tree.GetChild(0).Text, Parent = variable
     };
     SetLine(variable.RowReference, tree.GetChild(0));
     variable.Member = tree.GetChild(1).Text;
     SetLine(variable, tree.GetChild(1));
 }
Пример #4
0
        public void Visit(TableMemberReference variable)
        {
            var selectInfo = new SelectArgsInfo();

            _codeStack.Peek().Scope = new ScopeData <Type> {
                Type = typeof(string), CodeDomReference = new CodeTypeReference(typeof(string))
            };
            var rowArgs = VisitChild(variable.RowReference);

            var expression = new CodeFieldReferenceExpression(rowArgs.CodeExpression, variable.Member);

            _codeStack.Peek().CodeExpression = expression;

            if (Scope.Current.IsTableRowRegistered(variable.RowReference.Id))
            {
                var descriptor   = Scope.Current.GetTableDescriptor(variable.RowReference.Id);
                var dynamicAlias = Scope.Current.AliasType <DynamicObject>();
                if (dynamicAlias.Length > 0) //alias is a dynamic type so we get it from there
                {
                    _codeStack.Peek().CodeExpression = new CodeIndexerExpression(rowArgs.CodeExpression, new CodePrimitiveExpression(variable.Member));
                    _codeStack.Peek().Scope          = new ScopeData <Type> {
                        Type = typeof(string), CodeDomReference = new CodeTypeReference(typeof(string))
                    };
                }
                else if (!descriptor.Type.Variables.Any(x => x.Variable == variable.Member)) //error don't know member
                {
                    Errors.Add(new NoTableMember(new Semantic.LineInfo(variable.Line.Line, variable.Line.CharacterPosition), variable.Member));
                }
                else
                {
                    var members = descriptor.Type.Variables.Where(x => x.Variable == variable.Member).ToList();

                    if (members.Count > 1)
                    {
                        var selectMatches = members.Select(x => new SelectMatch()
                        {
                            TableVariable = x
                        }).ToArray();
                        Errors.Add(new AmbiguousSelectVariable(selectMatches, new Semantic.LineInfo(variable.Line.Line, variable.Line.CharacterPosition)));
                    }
                    else
                    {
                        var member = members.Single();
                        _codeStack.Peek().Scope = new ScopeData <Type> {
                            Type = member.Primitive.Type, CodeDomReference = new CodeTypeReference(member.Primitive.Type)
                        };
                    }
                }
            }

            selectInfo.ColumnName = variable.Member;
            _codeStack.Peek().Tag = selectInfo;
        }
Пример #5
0
        public void Visit(SelectAll all)
        {
            all.Parent.Parent.Children.Remove(all.Parent);

            var tableMatches = Scope.Current.FindAll();

            foreach (var match in tableMatches)
            {
                var tableReferance = new TableMemberReference {
                    Member       = match.TableVariable.Variable,
                    RowReference = new TableVariableRowReference {
                        Id = match.TableAlias
                    }
                };

                var arg = new SelectArg();
                arg.Children.Add(tableReferance);
                all.Parent.Parent.Children.Add(arg);
            }
        }
        public void Visit(SelectStatement statement)
        {
            using (Scope.PushSelect())
            {
                if (statement.From == null)
                {
                    GenerateSelectOnly(statement);
                    return;
                }

                var fromDomArg = VisitChild(statement.From);
                var rowType    = fromDomArg.Scope.CodeDomReference.TypeArguments[0];

                CodeMemberMethod method = new CodeMemberMethod();
                method.Name       = "Select_" + fromDomArg.MethodIdentifier;
                method.Attributes = MemberAttributes.Private;
                method.ReturnType = new CodeTypeReference("Table", new CodeTypeReference("ResultRow"));
                GenerateCallStatement(method.Statements, statement.Line.Line);

                _mainType.Type.Members.Add(method);

                var methodStatements = new CodeStatementCollection();

                methodStatements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference("RuntimeTable", new CodeTypeReference("ResultRow")),
                                                                          "result",
                                                                          new CodeObjectCreateExpression(new CodeTypeReference("RuntimeTable", new CodeTypeReference("ResultRow")))));


                var selectArgAssignments = new List <CodeAssignStatement>();
                if (statement.Args.Length > 0) //visit first one in case select *
                {
                    VisitChild(statement.Args[0], new CodeDomArg()
                    {
                        Scope = fromDomArg.Scope
                    });
                }

                var outerLoopNeeded = false;

                //Needed for both
                for (int x = 0; x < statement.Args.Length; x++) //select args
                {
                    var domSelectArg = VisitChild(statement.Args[x], new CodeDomArg()
                    {
                        Scope = fromDomArg.Scope
                    });
                    if (((SelectArgsInfo)domSelectArg.Tag).IsPickStatement)
                    {
                        outerLoopNeeded = true;
                    }

                    var assignment = new CodeAssignStatement();
                    assignment.Left  = new CodeIndexerExpression(new CodeTypeReferenceExpression("resultRow"), new CodeSnippetExpression(x.ToString()));
                    assignment.Right = domSelectArg.CodeExpression;

                    methodStatements.Add(new CodeMethodInvokeExpression(new CodeTypeReferenceExpression("result"), "AddColumn", new CodePrimitiveExpression(((SelectArgsInfo)domSelectArg.Tag).DisplayColumnName)));
                    selectArgAssignments.Add(assignment);
                }


                methodStatements.Add(new CodeVariableDeclarationStatement(fromDomArg.Scope.CodeDomReference,
                                                                          "fromTable",
                                                                          fromDomArg.CodeExpression));

                if (statement.Where != null)
                {
                    var domWhereArgs = VisitChild(statement.Where, new CodeDomArg()
                    {
                        Scope = fromDomArg.Scope
                    });
                    methodStatements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("fromTable"), domWhereArgs.CodeExpression));
                }

                //outside iterator
                methodStatements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference("IEnumerator", rowType),
                                                                          "x",
                                                                          new CodeMethodInvokeExpression(
                                                                              new CodeMethodReferenceExpression(new CodeTypeReferenceExpression("fromTable"), "GetEnumerator",
                                                                                                                null))));


                //foreach loops

                var outerLoop = new CodeIterationStatement();
                outerLoop.InitStatement      = new CodeSnippetStatement();
                outerLoop.IncrementStatement = new CodeSnippetStatement();
                outerLoop.TestExpression     = new CodeMethodInvokeExpression(
                    new CodeMethodReferenceExpression(new CodeTypeReferenceExpression("x"), "MoveNext",
                                                      null));

                outerLoop.Statements.Add(new CodeVariableDeclarationStatement(rowType,
                                                                              "row",
                                                                              new CodePropertyReferenceExpression(new CodeTypeReferenceExpression("x"), "Current")));

                var codeLoop = outerLoop;
                if (outerLoopNeeded)
                {
                    var        aliases = Scope.Current.AliasType <DownloadPage>();
                    CodeDomArg args    = null;
                    if (aliases.Length == 0)
                    {
                        //register error we could't find a download table and we are trying to access pick statements.
                        //create fake codedomargs
                        args = new CodeDomArg()
                        {
                            CodeExpression = new CodePrimitiveExpression("DownloadTable")
                        };
                    }
                    else
                    {
                        var reference = new TableMemberReference()
                        {
                            Member = "nodes", RowReference = new TableVariableRowReference()
                            {
                                Id = aliases[0]
                            }
                        };
                        args = VisitChild(reference);
                    }

                    //Needed only for DownloadRow
                    outerLoop.Statements.Add(
                        new CodeVariableDeclarationStatement(
                            new CodeTypeReference("IEnumerator", new CodeTypeReference("HtmlElement")),
                            "y",
                            new CodeMethodInvokeExpression(
                                new CodeMethodReferenceExpression(
                                    args.CodeExpression, "GetEnumerator", null))));


                    //Needed only for DownloadRow
                    codeLoop = new CodeIterationStatement();
                    codeLoop.InitStatement      = new CodeSnippetStatement();
                    codeLoop.IncrementStatement = new CodeSnippetStatement();
                    codeLoop.TestExpression     = new CodeMethodInvokeExpression(
                        new CodeMethodReferenceExpression(new CodeTypeReferenceExpression("y"), "MoveNext",
                                                          null));

                    //Needed only for DownloadRow
                    codeLoop.Statements.Add(new CodeVariableDeclarationStatement(
                                                new CodeTypeReference("HtmlElement"),
                                                "node",
                                                new CodePropertyReferenceExpression(new CodeTypeReferenceExpression("y"), "Current")));

                    outerLoop.Statements.Add(codeLoop);
                }

                //Needed for both.
                codeLoop.Statements.Add(new CodeVariableDeclarationStatement(
                                            new CodeTypeReference("ResultRow"),
                                            "resultRow",
                                            new CodeObjectCreateExpression(new CodeTypeReference("ResultRow"), new CodeSnippetExpression(statement.Args.Length.ToString()))));

                codeLoop.Statements.AddRange(selectArgAssignments.ToArray());

                var addResults = new CodeMethodInvokeExpression(
                    new CodeMethodReferenceExpression(new CodeTypeReferenceExpression("result"), "Add"),
                    new CodeArgumentReferenceExpression("resultRow"));
                codeLoop.Statements.Add(addResults);


                methodStatements.Add(outerLoop);

                if (outerLoopNeeded)
                {
                    var aliases = Scope.Current.AliasType <DownloadPage>();
                    outerLoop.Statements.Add(new CodeMethodInvokeExpression(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("row"), aliases[0]), "Clear"));
                }

                var callSelect = new CodeExpressionStatement(new CodeMethodInvokeExpression(null, "OnSelect", new CodeVariableReferenceExpression("result")));
                methodStatements.Add(callSelect);
                methodStatements.Add(new CodeMethodReturnStatement(new CodeTypeReferenceExpression("result")));
                method.Statements.AddRange(methodStatements);

                var methodcall = new CodeMethodInvokeExpression(
                    new CodeMethodReferenceExpression(null, method.Name));

                _codeStack.Peek().Tag            = new Action(() => method.Statements.Remove(callSelect));
                _codeStack.Peek().CodeExpression = methodcall;
                _codeStack.Peek().Scope          = new ScopeData <TableDescriptor>()
                {
                    CodeDomReference = method.ReturnType
                };
                _codeStack.Peek().ParentStatements.Add(methodcall);
            }
        }
Пример #7
0
        public void Visit(NestedSelectStatement statement)
        {
            BufferTable      bufferTable;
            CodeMemberMethod method   = new CodeMemberMethod();
            var  methodStatements     = new CodeStatementCollection();
            var  selectArgAssignments = new List <CodeAssignStatement>();
            bool outerLoopNeeded;

            if (statement.From == null)
            {
                SelectOnly(statement);
                return;
            }

            using (Scope.PushSelect())
            {
                var fromDomArg = VisitChild(statement.From);
                var rowType    = fromDomArg.Scope.CodeDomReference.TypeArguments[0];

                method.Name       = "Nested_Select_" + fromDomArg.MethodIdentifier;
                method.Attributes = MemberAttributes.Private;
                GenerateCallStatement(method.Statements, statement.Line.Line);

                _mainType.Type.Members.Add(method);

                //create type
                bufferTable = FetchBufferTable(statement, fromDomArg.Scope, selectArgAssignments, out outerLoopNeeded);

                methodStatements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference("CodeTable", new CodeTypeReference(bufferTable.Variable)),
                                                                          "result",
                                                                          new CodeObjectCreateExpression(new CodeTypeReference("BufferTable", new CodeTypeReference(bufferTable.Variable)))));

                methodStatements.Add(new CodeVariableDeclarationStatement(fromDomArg.Scope.CodeDomReference,
                                                                          "fromTable",
                                                                          fromDomArg.CodeExpression));

                if (statement.Where != null)
                {
                    var domWhereArgs = VisitChild(statement.Where, new CodeDomArg()
                    {
                        Scope = fromDomArg.Scope
                    });
                    methodStatements.Add(new CodeAssignStatement(new CodeVariableReferenceExpression("fromTable"), domWhereArgs.CodeExpression));
                }

                //outside iterator
                methodStatements.Add(new CodeVariableDeclarationStatement(new CodeTypeReference("IEnumerator", rowType),
                                                                          "x",
                                                                          new CodeMethodInvokeExpression(
                                                                              new CodeMethodReferenceExpression(new CodeTypeReferenceExpression("fromTable"), "GetEnumerator",
                                                                                                                null))));


                //foreach loops

                var outerLoop = new CodeIterationStatement();
                outerLoop.InitStatement      = new CodeSnippetStatement();
                outerLoop.IncrementStatement = new CodeSnippetStatement();
                outerLoop.TestExpression     = new CodeMethodInvokeExpression(
                    new CodeMethodReferenceExpression(new CodeTypeReferenceExpression("x"), "MoveNext",
                                                      null));

                outerLoop.Statements.Add(new CodeVariableDeclarationStatement(rowType,
                                                                              "row",
                                                                              new CodePropertyReferenceExpression(new CodeTypeReferenceExpression("x"), "Current")));

                var codeLoop = outerLoop;
                if (outerLoopNeeded)
                {
                    var        aliases = Scope.Current.AliasType <DownloadPage>();
                    CodeDomArg args    = null;
                    if (aliases.Length == 0)
                    {
                        //register error we could't find a download table and we are trying to access pick statements.
                        //create fake codedomargs
                        args = new CodeDomArg()
                        {
                            CodeExpression = new CodePrimitiveExpression("DownloadTable")
                        };
                    }
                    else
                    {
                        var reference = new TableMemberReference()
                        {
                            Member = "nodes", RowReference = new TableVariableRowReference()
                            {
                                Id = aliases[0]
                            }
                        };
                        args = VisitChild(reference);
                    }

                    //Needed only for DownloadRow
                    outerLoop.Statements.Add(
                        new CodeVariableDeclarationStatement(
                            new CodeTypeReference("IEnumerator", new CodeTypeReference("HtmlElement")),
                            "y",
                            new CodeMethodInvokeExpression(
                                new CodeMethodReferenceExpression(
                                    args.CodeExpression, "GetEnumerator", null))));


                    //Needed only for DownloadRow
                    codeLoop = new CodeIterationStatement();
                    codeLoop.InitStatement      = new CodeSnippetStatement();
                    codeLoop.IncrementStatement = new CodeSnippetStatement();
                    codeLoop.TestExpression     = new CodeMethodInvokeExpression(
                        new CodeMethodReferenceExpression(new CodeTypeReferenceExpression("y"), "MoveNext",
                                                          null));

                    //Needed only for DownloadRow
                    codeLoop.Statements.Add(new CodeVariableDeclarationStatement(
                                                new CodeTypeReference("HtmlElement"),
                                                "node",
                                                new CodePropertyReferenceExpression(new CodeTypeReferenceExpression("y"), "Current")));

                    outerLoop.Statements.Add(codeLoop);
                }

                //Needed for both.
                codeLoop.Statements.Add(new CodeVariableDeclarationStatement(
                                            new CodeTypeReference(bufferTable.Variable),
                                            "resultRow",
                                            new CodeObjectCreateExpression(new CodeTypeReference(bufferTable.Variable))));

                codeLoop.Statements.AddRange(selectArgAssignments.ToArray());

                var addResults = new CodeMethodInvokeExpression(
                    new CodeMethodReferenceExpression(new CodeTypeReferenceExpression("result"), "Add"),
                    new CodeArgumentReferenceExpression("resultRow"));
                codeLoop.Statements.Add(addResults);


                methodStatements.Add(outerLoop);

                if (outerLoopNeeded)
                {
                    var aliases = Scope.Current.AliasType <DownloadPage>();
                    outerLoop.Statements.Add(new CodeMethodInvokeExpression(new CodePropertyReferenceExpression(new CodeVariableReferenceExpression("row"), aliases[0]), "Clear"));
                }
            }

            var scope = CreateBufferTable(bufferTable);

            method.ReturnType = scope.CodeDomReference;
            var methodcall = new CodeMethodInvokeExpression(
                new CodeMethodReferenceExpression(null, method.Name));

            methodStatements.Add(new CodeMethodReturnStatement(new CodeTypeReferenceExpression("result")));
            method.Statements.AddRange(methodStatements);

            _codeStack.Peek().CodeExpression = methodcall;
            _codeStack.Peek().Scope          = new ScopeData <TableDescriptor>()
            {
                CodeDomReference = method.ReturnType
            };
        }