private static void Analyze(
            SyntaxNodeAnalysisContext context,
            SyntaxList <StatementSyntax> statements,
            SingleLocalDeclarationStatement localDeclaration,
            ExpressionSyntax expression)
        {
            if (expression?.IsKind(SyntaxKind.IdentifierName) == true)
            {
                var identifierName = (IdentifierNameSyntax)expression;

                string name = localDeclaration.IdentifierText;

                if (string.Equals(name, identifierName.Identifier.ValueText, StringComparison.Ordinal))
                {
                    TextSpan span = TextSpan.FromBounds(expression.Span.End, statements.Last().Span.End);

                    SyntaxNode parent = localDeclaration.Statement.Parent;

                    if (!IsLocalVariableReferenced(localDeclaration.Declarator, name, parent, span, context.SemanticModel, context.CancellationToken) &&
                        !parent.ContainsDirectives(TextSpan.FromBounds(localDeclaration.Statement.SpanStart, expression.Span.End)))
                    {
                        ReportDiagnostic(context, localDeclaration, expression);
                    }
                }
            }
        }
示例#2
0
        private static bool CanRefactor(
            ExpressionStatementSyntax expressionStatement,
            IfStatementSyntax ifStatement,
            ExpressionSyntax expression,
            SyntaxNode parent)
        {
            ExpressionSyntax expression2 = expressionStatement.Expression;

            if (expression2?.IsKind(SyntaxKind.SimpleAssignmentExpression) == true)
            {
                var assignment = (AssignmentExpressionSyntax)expression2;

                ExpressionSyntax left = assignment.Left;

                if (left?.IsMissing == false)
                {
                    ExpressionSyntax right = assignment.Right;

                    return(right?.IsMissing == false &&
                           SyntaxComparer.AreEquivalent(expression, left) &&
                           !parent.ContainsDirectives(TextSpan.FromBounds(right.Span.End, ifStatement.Span.Start)));
                }
            }

            return(false);
        }
        private static bool CanRefactor(
            LocalDeclarationStatementSyntax localDeclarationStatement,
            IfStatementSyntax ifStatement,
            ExpressionSyntax expression,
            SyntaxNode parent)
        {
            VariableDeclarationSyntax declaration = localDeclarationStatement.Declaration;

            if (declaration != null)
            {
                SeparatedSyntaxList <VariableDeclaratorSyntax> variables = declaration.Variables;

                if (variables.Count == 1)
                {
                    VariableDeclaratorSyntax declarator = variables[0];

                    ExpressionSyntax value = declarator.Initializer?.Value;

                    return(value != null &&
                           expression.IsKind(SyntaxKind.IdentifierName) &&
                           string.Equals(declarator.Identifier.ValueText, ((IdentifierNameSyntax)expression).Identifier.ValueText, StringComparison.Ordinal) &&
                           !parent.ContainsDirectives(TextSpan.FromBounds(value.Span.End, ifStatement.Span.Start)));
                }
            }

            return(false);
        }
        public static bool SpanContainsDirectives(this SyntaxNode node)
        {
            if (node == null)
            {
                throw new ArgumentNullException(nameof(node));
            }

            return(node.ContainsDirectives(node.Span));
        }
        public static bool CheckSpanDirectives(this AnalysisOptions options, SyntaxNode node, TextSpan span)
        {
            if (!options.CanContainDirectives)
            {
                if (node.Span.Contains(span))
                {
                    return(!node.ContainsDirectives(span));
                }

                foreach (SyntaxNode ancestor in node.Ancestors())
                {
                    if (ancestor.Span.Contains(span))
                    {
                        return(!ancestor.ContainsDirectives(span));
                    }
                }
            }

            return(true);
        }
        private static bool IsFixable(
            LocalDeclarationStatementSyntax localDeclarationStatement,
            IfStatementSyntax ifStatement,
            ExpressionSyntax expression,
            SyntaxNode parent)
        {
            VariableDeclaratorSyntax declarator = localDeclarationStatement
                                                  .Declaration?
                                                  .Variables
                                                  .SingleOrDefault(shouldThrow: false);

            if (declarator != null)
            {
                ExpressionSyntax value = declarator.Initializer?.Value;

                return(value != null &&
                       expression.IsKind(SyntaxKind.IdentifierName) &&
                       string.Equals(declarator.Identifier.ValueText, ((IdentifierNameSyntax)expression).Identifier.ValueText, StringComparison.Ordinal) &&
                       !parent.ContainsDirectives(TextSpan.FromBounds(value.Span.End, ifStatement.SpanStart)));
            }

            return(false);
        }
示例#7
0
        private static void Analyze(
            SyntaxNodeAnalysisContext context,
            SyntaxNode containingNode,
            SyntaxList <StatementSyntax> statements)
        {
            int count = statements.Count;

            if (count > 1)
            {
                int i = count - 1;

                while (i >= 0)
                {
                    if (!statements[i].IsKind(SyntaxKind.LocalFunctionStatement))
                    {
                        break;
                    }

                    i--;
                }

                if (i >= 1 &&
                    statements[i].IsKind(SyntaxKind.ReturnStatement))
                {
                    var returnStatement = (ReturnStatementSyntax)statements[i];

                    ExpressionSyntax expression = returnStatement.Expression;

                    if (expression?.IsMissing == false)
                    {
                        StatementSyntax statement = statements[i - 1];

                        SyntaxKind statementKind = statement.Kind();

                        if (statementKind == SyntaxKind.IfStatement)
                        {
                            var ifStatement = (IfStatementSyntax)statements[i - 1];

                            if (!ifStatement.IsSimpleIf())
                            {
                                SemanticModel     semanticModel     = context.SemanticModel;
                                CancellationToken cancellationToken = context.CancellationToken;

                                ISymbol symbol = semanticModel.GetSymbol(expression, cancellationToken);

                                if (IsLocalDeclaredInScopeOrNonRefOrOutParameterOfEnclosingSymbol(symbol, containingNode, semanticModel, cancellationToken) &&
                                    ifStatement.GetChain().All(ifOrElse => IsValueAssignedInLastStatement(ifOrElse, symbol, semanticModel, cancellationToken)) &&
                                    !containingNode.ContainsDirectives(TextSpan.FromBounds(ifStatement.SpanStart, returnStatement.Span.End)))
                                {
                                    context.ReportDiagnostic(
                                        DiagnosticDescriptors.UseReturnInsteadOfAssignment,
                                        GetLastStatementOrDefault(ifStatement));
                                }
                            }
                        }
                        else if (statementKind == SyntaxKind.SwitchStatement)
                        {
                            SemanticModel     semanticModel     = context.SemanticModel;
                            CancellationToken cancellationToken = context.CancellationToken;

                            ISymbol symbol = semanticModel.GetSymbol(expression, cancellationToken);

                            if (IsLocalDeclaredInScopeOrNonRefOrOutParameterOfEnclosingSymbol(symbol, containingNode, semanticModel, cancellationToken))
                            {
                                var switchStatement = (SwitchStatementSyntax)statements[i - 1];

                                SyntaxList <SwitchSectionSyntax> sections = switchStatement.Sections;

                                if (sections.All(section => IsValueAssignedInLastStatement(section, symbol, semanticModel, cancellationToken)) &&
                                    !containingNode.ContainsDirectives(TextSpan.FromBounds(switchStatement.SpanStart, returnStatement.Span.End)))
                                {
                                    context.ReportDiagnostic(
                                        DiagnosticDescriptors.UseReturnInsteadOfAssignment,
                                        GetLastStatementBeforeBreakStatementOrDefault(sections.First()));
                                }
                            }
                        }
                    }
                }
            }
        }
        public static void Analyze(SyntaxNodeAnalysisContext context, LocalDeclarationStatementSyntax localDeclaration)
        {
            VariableDeclarationSyntax declaration = localDeclaration.Declaration;

            if (declaration != null)
            {
                SeparatedSyntaxList <VariableDeclaratorSyntax> variables = declaration.Variables;

                if (variables.Count == 1)
                {
                    VariableDeclaratorSyntax declarator  = variables[0];
                    EqualsValueClauseSyntax  initializer = declarator.Initializer;

                    if (initializer != null)
                    {
                        ExpressionSyntax value = initializer.Value;

                        if (value != null)
                        {
                            SyntaxToken identifier = declarator.Identifier;

                            SyntaxNode parent = localDeclaration.Parent;

                            SyntaxList <StatementSyntax> statements = GetStatements(parent);

                            if (statements.Any())
                            {
                                int index = statements.IndexOf(localDeclaration);

                                if (index < statements.Count - 1)
                                {
                                    StatementSyntax nextStatement = statements[index + 1];

                                    ExpressionSyntax right = GetAssignedValue(nextStatement);

                                    if (right?.IsKind(SyntaxKind.IdentifierName) == true)
                                    {
                                        var identifierName = (IdentifierNameSyntax)right;

                                        if (identifier.ValueText == identifierName.Identifier.ValueText)
                                        {
                                            bool isReferenced = false;

                                            if (index < statements.Count - 2)
                                            {
                                                TextSpan span = TextSpan.FromBounds(statements[index + 2].SpanStart, statements.Last().Span.End);

                                                isReferenced = IsLocalVariableReferenced(context, parent, span, declarator, identifier);
                                            }

                                            if (!isReferenced &&
                                                !parent.ContainsDirectives(TextSpan.FromBounds(localDeclaration.SpanStart, nextStatement.Span.End)))
                                            {
                                                ReportDiagnostic(context, localDeclaration, declaration, identifier, initializer, right);
                                            }
                                        }
                                    }
                                    else if (nextStatement.IsKind(SyntaxKind.ForEachStatement))
                                    {
                                        var forEachStatement = (ForEachStatementSyntax)nextStatement;

                                        ExpressionSyntax expression = forEachStatement.Expression;

                                        if (expression?.IsKind(SyntaxKind.IdentifierName) == true)
                                        {
                                            var identifierName = (IdentifierNameSyntax)expression;

                                            if (identifier.ValueText == identifierName.Identifier.ValueText)
                                            {
                                                TextSpan span = TextSpan.FromBounds(expression.Span.End, statements.Last().Span.End);

                                                if (!IsLocalVariableReferenced(context, parent, span, declarator, identifier) &&
                                                    !parent.ContainsDirectives(TextSpan.FromBounds(localDeclaration.SpanStart, expression.Span.End)))
                                                {
                                                    ReportDiagnostic(context, localDeclaration, declaration, identifier, initializer, expression);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }