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)); }
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); }
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); }