Beispiel #1
0
        public static IEnumerable <SelectStatement> GetSelectsUsingParameterInWhere(this IEnumerable <SelectStatement> selects, string parameter)
        {
            if (!selects.Any() || string.IsNullOrWhiteSpace(parameter))
            {
                yield break;
            }

            foreach (var select in selects)
            {
                if (select.QueryExpression is QuerySpecification query)
                {
                    if (query.FromClause == null || query.WhereClause == null)
                    {
                        continue;
                    }

                    var variableVisitor = new VariableReferenceVisitor();
                    query.WhereClause.Accept(variableVisitor);

                    if (variableVisitor.Statements.Any(v => parameter.StringEquals(v.Name)))
                    {
                        yield return(select);
                    }
                }
            }

            yield break;
        }
        void ProcessBlock(BlockStatement node)
        {
            for (int i = 0; i < node.Statements.Count - 1; i++)
            {
                FixedStatement           @fixed             = null;
                List <VariableReference> variableReferences = new List <VariableReference>();

                Statement statement = node.Statements[i];

                @fixed = GetFixedStatement(statement, variableReferences);

                if (@fixed == null)
                {
                    continue;
                }

                foreach (VariableReference variable in variableReferences)
                {
                    methodContext.RemoveVariable(variable);
                }

                // remove the first statement.
                node.Statements.RemoveAt(i);
                // append the fixed block
                node.AddStatementAt(i, @fixed);

                ExpressionStatement expressionStmt = node.Statements[i + 1] as ExpressionStatement;

                int len = node.Statements.Count;

                VariableReference fixedVariable = null;

                VariableReferenceVisitor varibleVisitor = new VariableReferenceVisitor();
                varibleVisitor.Visit(@fixed.Expression);

                fixedVariable = varibleVisitor.Variable;

                for (int stmtIndex = i + 1; stmtIndex < len; stmtIndex++)
                {
                    varibleVisitor = new VariableReferenceVisitor();

                    varibleVisitor.Visit(node.Statements[stmtIndex]);

                    VariableReference variable = varibleVisitor.Variable;

                    if (variable != null && !variables.Contains(variable))
                    {
                        variables.Add(variable);
                    }

                    if (node.Statements[stmtIndex].CodeNodeType == CodeNodeType.ExpressionStatement)
                    {
                        expressionStmt = node.Statements[stmtIndex] as ExpressionStatement;

                        if (variable != null &&
                            variable == fixedVariable &&
                            expressionStmt.Expression.CodeNodeType == CodeNodeType.BinaryExpression &&
                            (expressionStmt.Expression as BinaryExpression).IsAssignmentExpression &&
                            (expressionStmt.Expression as BinaryExpression).Right.CodeNodeType == CodeNodeType.LiteralExpression &&
                            ((expressionStmt.Expression as BinaryExpression).Right as LiteralExpression).Value == null)
                        {
                            node.Statements.RemoveAt(stmtIndex);
                            stmtIndex--;
                            len--;
                            break;
                        }
                    }
                    @fixed.Body.AddStatement(node.Statements[stmtIndex]);
                    node.Statements.RemoveAt(stmtIndex);
                    stmtIndex--;
                    len--;
                }

                ProcessBlock(@fixed.Body);

                break;
            }
        }
        void ProcessBlock (BlockStatement node)
        {
            for (int i = 0; i < node.Statements.Count - 1; i++)
            {
                FixedStatement @fixed = null;
                List<VariableReference> variableReferences = new List<VariableReference>();

                Statement statement = node.Statements[i];

                @fixed = GetFixedStatement(statement, variableReferences);

                if (@fixed == null)
                {
                    continue;
                }

				foreach (VariableReference variable in variableReferences)
				{
					methodContext.RemoveVariable(variable);
				}
                
                // remove the first statement.
                node.Statements.RemoveAt(i);
                // append the fixed block
                node.AddStatementAt(i, @fixed);

                ExpressionStatement expressionStmt = node.Statements[i + 1] as ExpressionStatement;

                int len = node.Statements.Count;

                VariableReference fixedVariable = null;

                VariableReferenceVisitor varibleVisitor = new VariableReferenceVisitor();
                varibleVisitor.Visit(@fixed.Expression);

                fixedVariable = varibleVisitor.Variable;
               
                for (int stmtIndex = i + 1; stmtIndex < len; stmtIndex++)
                {
                    varibleVisitor = new VariableReferenceVisitor();

                    varibleVisitor.Visit(node.Statements[stmtIndex]);

                    VariableReference variable = varibleVisitor.Variable;

                    if (variable != null && !variables.Contains(variable))
                    {
                        variables.Add(variable);
                    }

                    if (node.Statements[stmtIndex].CodeNodeType == CodeNodeType.ExpressionStatement)
                    {
                        expressionStmt = node.Statements[stmtIndex] as ExpressionStatement;

                        if (variable != null 
                            && variable == fixedVariable
                            && expressionStmt.Expression.CodeNodeType == CodeNodeType.BinaryExpression 
                            && (expressionStmt.Expression as BinaryExpression).IsAssignmentExpression
							&& (expressionStmt.Expression as BinaryExpression).Right.CodeNodeType == CodeNodeType.LiteralExpression
							&& ((expressionStmt.Expression as BinaryExpression).Right as LiteralExpression).Value == null)
                        {
							node.Statements.RemoveAt(stmtIndex);
							stmtIndex--;
							len--;
							break;
						}
                    }
                    @fixed.Body.AddStatement(node.Statements[stmtIndex]);
					node.Statements.RemoveAt(stmtIndex);
					stmtIndex--;
					len--;
                }

				ProcessBlock(@fixed.Body);

                break;
            }
        }