Exemple #1
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 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));
        }
Exemple #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);
        }
Exemple #4
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);
        }