Example #1
0
        public void Visit(ProcedureDefinition statement)
        {
            var argList = new List <CodeParameterDeclarationExpression>();

            foreach (var arg in statement.Args)
            {
                var variableType = TablePrimitive.FromString(arg.Type).Type;
                var codeParam    = new CodeParameterDeclarationExpression(variableType, arg.Variable);
                Scope.Current.RegisterPrimitive(codeParam.Name, variableType, codeParam.Type);
                Scope.Current.Type.Type.Members.Add(new CodeMemberField()
                {
                    Name = codeParam.Name, Type = codeParam.Type, Attributes = MemberAttributes.Public | MemberAttributes.Final
                });

                var assignment = new CodeAssignStatement(new CodeVariableReferenceExpression("_" + Scope.Current.ScopeIdentifier + "." + codeParam.Name), new CodeVariableReferenceExpression(codeParam.Name));
                _mainType.Constructor.Statements.Add(assignment);

                argList.Add(codeParam);
            }

            _mainType.Type.Name = statement.Name;
            _mainType.Constructor.Parameters.Clear();
            _mainType.Constructor.BaseConstructorArgs.Clear();
            _mainType.Constructor.Parameters.AddRange(argList.ToArray());
            _mainType.Constructor.BaseConstructorArgs.Add(new CodeArrayCreateExpression(new CodeTypeReference(typeof(string[])), 0));

            //visit block
            var blockArgs = VisitChild(statement.Block);

            _codeStack.Peek().ParentStatements.AddRange(blockArgs.ParentStatements);
        }
        public void Visit(TableColumnArg arg)
        {
            var field = new CodeMemberField();

            field.Name       = arg.Variable;
            field.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            field.Type       = new CodeTypeReference(TablePrimitive.FromString(arg.Type).Type);
            _codeStack.Peek().ParentMemberDefinitions.Add(field);
        }
        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
            });
        }
Example #4
0
        public void Visit(VariableAssignmentStatement statement)
        {
            var leftArgs  = VisitChild(statement.Left);
            var rightArgs = VisitChild(statement.Right);

            Type leftType  = leftArgs.Scope.CodeDomReference.GenerateType();
            Type rightType = rightArgs.Scope.CodeDomReference.GenerateType();

            if (leftType != rightType && leftType != null)
            {
                var leftPrimitive = TablePrimitive.FromType(leftType);
                rightArgs.CodeExpression = leftPrimitive.ToNative(rightArgs.CodeExpression);
            }

            var assignment = new CodeAssignStatement(leftArgs.CodeExpression, rightArgs.CodeExpression);

            _codeStack.Peek().Scope = rightArgs.Scope;
            _codeStack.Peek().ParentStatements.Add(assignment);
        }
        private void BuildIRowReaderImplementation(CodeTypeDeclaration type, TableColumnArg[] tableArgs)
        {
            var method = new CodeMemberMethod();

            method.Name       = "Load";
            method.Attributes = MemberAttributes.Public | MemberAttributes.Final;
            method.Parameters.Add(new CodeParameterDeclarationExpression(typeof(string[]), "columns"));

            for (int x = 0; x < tableArgs.Length; x++)
            {
                var            varType = TablePrimitive.FromString(tableArgs[x].Type);
                var            left    = new CodeFieldReferenceExpression(null, tableArgs[x].Variable);
                CodeExpression right   = new CodeIndexerExpression(new CodeTypeReferenceExpression("columns"), new CodeSnippetExpression(x.ToString()));
                right = varType.ToNative(right);

                method.Statements.Add(new CodeAssignStatement(left, right));
            }

            type.Members.Add(method);
        }
        private CodeExpression DoBoolean(CodeDomArg leftArgs, CodeDomArg rightArgs, CodeBinaryOperatorType operation)
        {
            Type leftType = null;

            if (leftArgs.Scope != null)
            {
                leftType = leftArgs.Scope.CodeDomReference.GenerateType();
            }

            Type rightType = null;

            if (rightArgs.Scope != null)
            {
                rightType = rightArgs.Scope.CodeDomReference.GenerateType();
            }

            if (leftType != null && rightType != null && leftType != rightType)
            {
                if (leftType == typeof(string) || leftType == typeof(object))
                {
                    var primitive = TablePrimitive.FromType(rightType);
                    leftArgs.CodeExpression = primitive.ToNative(leftArgs.CodeExpression);
                }
                else if (rightType == typeof(string))
                {
                    var primitive = TablePrimitive.FromType(leftType);
                    rightArgs.CodeExpression = primitive.ToNative(rightArgs.CodeExpression);
                }
            }

            if (leftArgs.Tag != null)
            {
                _codeStack.Peek().Tag = leftArgs.Tag;
            }
            if (rightArgs.Tag != null)
            {
                _codeStack.Peek().Tag = rightArgs.Tag;
            }

            return(new CodeBinaryOperatorExpression(leftArgs.CodeExpression, operation, rightArgs.CodeExpression));
        }
Example #7
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);
        }
Example #8
0
        private void DoBoolean(BooleanExpression expression, CodeBinaryOperatorType operation)
        {
            var leftArgs = VisitChild(expression.Left, new CodeDomArg()
            {
                Scope = _codeStack.Peek().Scope
            });
            var rightArgs = VisitChild(expression.Right, new CodeDomArg()
            {
                Scope = _codeStack.Peek().Scope
            });

            Type leftType  = Type.GetType(leftArgs.Scope.CodeDomReference.BaseType);
            Type rightType = Type.GetType(rightArgs.Scope.CodeDomReference.BaseType);

            if (leftType != rightType)
            {
                if (leftType == typeof(string))
                {
                    var primitive = TablePrimitive.FromType(rightType);
                    leftArgs.CodeExpression = primitive.ToNative(leftArgs.CodeExpression);
                }
                else if (rightType == typeof(string))
                {
                    var primitive = TablePrimitive.FromType(leftType);
                    rightArgs.CodeExpression = primitive.ToNative(rightArgs.CodeExpression);
                }
            }

            if (leftArgs.Tag != null)
            {
                _codeStack.Peek().Tag = leftArgs.Tag;
            }
            if (rightArgs.Tag != null)
            {
                _codeStack.Peek().Tag = rightArgs.Tag;
            }

            _codeStack.Peek().CodeExpression = new CodeBinaryOperatorExpression(leftArgs.CodeExpression, operation, rightArgs.CodeExpression);
        }
        public void Visit(MsSqlTable table)
        {
            var descriptor = new TableDescriptor(typeof(MsSqlTable <>));
            var sqlTable   = new CodeTypeDeclaration(table.Variable)
            {
                TypeAttributes = TypeAttributes.NestedPrivate
            };

            sqlTable.BaseTypes.Add(new CodeTypeReference("IRow"));

            var sqlTableCodeDomType = new CodeTypeReference("MsSqlTable", new CodeTypeReference(table.Variable));

            Scope.Current.Type.Type.Members.Add(
                new CodeMemberField(sqlTableCodeDomType, table.Variable)
            {
                Attributes = MemberAttributes.Public | MemberAttributes.Final
            });

            Scope.Current.Type.Constructor.Statements.Add(new CodeAssignStatement(
                                                              new CodeSnippetExpression(table.Variable),
                                                              new CodeObjectCreateExpression(
                                                                  new CodeTypeReference("MsSqlTable", new CodeTypeReference(table.Variable)))));

            var codeExpressions = new List <CodeExpression>();

            foreach (var arg in table.Args)
            {
                var domArg = VisitChild(arg);
                sqlTable.Members.AddRange(domArg.ParentMemberDefinitions);
                codeExpressions.Add(new CodePrimitiveExpression(arg.Variable));
                descriptor.Variables.Add(new VariableTypePair {
                    Variable = arg.Variable, Primitive = TablePrimitive.FromString(arg.Type)
                });
            }

            _mainType.Type.Members.Add(sqlTable);

            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, sqlTableCodeDomType);

            //Init Code
            CodeMemberMethod method = new CodeMemberMethod();

            method.Name       = "Init_" + sqlTable.Name;
            method.Attributes = MemberAttributes.Private;

            _mainType.Type.Members.Add(method);

            var assignment = new CodeAssignStatement(new CodeVariableReferenceExpression("_" + Scope.Current.ScopeIdentifier + "." + table.Variable + ".ConnectionString"), new CodePrimitiveExpression(table.ConnectionString));

            method.Statements.Add(assignment);

            assignment = new CodeAssignStatement(new CodeVariableReferenceExpression("_" + Scope.Current.ScopeIdentifier + "." + table.Variable + ".Table"), new CodePrimitiveExpression(table.Table));
            method.Statements.Add(assignment);

            assignment = new CodeAssignStatement(new CodeVariableReferenceExpression("_" + Scope.Current.ScopeIdentifier + "." + table.Variable + ".FieldNames"),
                                                 new CodeArrayCreateExpression(new CodeTypeReference(typeof(string)), codeExpressions.ToArray()));
            method.Statements.Add(assignment);

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

            _codeStack.Peek().ParentStatements.Add(methodcall);
            _codeStack.Peek().CodeExpression = methodcall;
        }
        public void Visit(FileTable table)
        {
            var descriptor = new TableDescriptor(typeof(FileTable <>));
            var fileTable  = new CodeTypeDeclaration(table.Variable)
            {
                TypeAttributes = TypeAttributes.NestedPrivate
            };

            fileTable.BaseTypes.Add(new CodeTypeReference("IRowWriter"));
            fileTable.BaseTypes.Add(new CodeTypeReference("IRowReader"));

            //field
            var fileTableCodeDomType = new CodeTypeReference("FileTable", new CodeTypeReference(table.Variable));

            Scope.Current.Type.Type.Members.Add(
                new CodeMemberField(fileTableCodeDomType, table.Variable)
            {
                Attributes = MemberAttributes.Public | MemberAttributes.Final
            });

            var locationArg = VisitChild(table.Location);

            //constructor
            Scope.Current.Type.Constructor.Statements.Add(new CodeAssignStatement(
                                                              new CodeSnippetExpression(table.Variable),
                                                              new CodeObjectCreateExpression(
                                                                  new CodeTypeReference("FileTable", new CodeTypeReference(table.Variable)))));

            BuildIRowWriterImplementation(fileTable, table.Args);
            BuildIRowReaderImplementation(fileTable, table.Args);

            foreach (var arg in table.Args)
            {
                var domArg = VisitChild(arg);
                fileTable.Members.AddRange(domArg.ParentMemberDefinitions);
                descriptor.Variables.Add(new VariableTypePair {
                    Variable = arg.Variable, Primitive = TablePrimitive.FromString(arg.Type)
                });
            }

            _mainType.Type.Members.Add(fileTable);

            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, fileTableCodeDomType);

            //Init Code
            CodeMemberMethod method = new CodeMemberMethod();

            method.Name       = "Init_" + fileTable.Name;
            method.Attributes = MemberAttributes.Private;

            _mainType.Type.Members.Add(method);
            var assignment = new CodeAssignStatement(new CodeVariableReferenceExpression("_" + Scope.Current.ScopeIdentifier + "." + table.Variable + ".Location"), locationArg.CodeExpression);

            method.Statements.Add(assignment);

            assignment = new CodeAssignStatement(new CodeVariableReferenceExpression("_" + Scope.Current.ScopeIdentifier + "." + table.Variable + ".FieldTerminator"), new CodePrimitiveExpression(table.FieldTerminator));
            method.Statements.Add(assignment);

            assignment = new CodeAssignStatement(new CodeVariableReferenceExpression("_" + Scope.Current.ScopeIdentifier + "." + table.Variable + ".RowTerminator"), new CodePrimitiveExpression(table.RowTerminator));
            method.Statements.Add(assignment);

            method.Statements.Add(new CodeMethodInvokeExpression(new CodeVariableReferenceExpression("_" + Scope.Current.ScopeIdentifier + "." + table.Variable), "Load"));

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

            _codeStack.Peek().ParentStatements.Add(methodcall);
            _codeStack.Peek().CodeExpression = methodcall;
        }