예제 #1
0
        public static void AnalyzeIfStatement(SyntaxNodeAnalysisContext context)
        {
            if (context.Node.ContainsDiagnostics)
            {
                return;
            }

            var ifStatement = (IfStatementSyntax)context.Node;

            if (!ifStatement.IsSimpleIf())
            {
                StatementsInfo statementsInfo = SyntaxInfo.StatementsInfo(ifStatement);
                if (statementsInfo.Success)
                {
                    int index = statementsInfo.Statements.IndexOf(ifStatement);

                    ReturnStatementSyntax returnStatement = FindReturnStatementBelow(statementsInfo.Statements, index);
                    if (returnStatement?.ContainsDiagnostics == false)
                    {
                        ExpressionSyntax expression = returnStatement.Expression;
                        if (expression != null &&
                            !ifStatement.SpanOrTrailingTriviaContainsDirectives() &&
                            !returnStatement.SpanOrLeadingTriviaContainsDirectives())
                        {
                            SemanticModel     semanticModel     = context.SemanticModel;
                            CancellationToken cancellationToken = context.CancellationToken;

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

                            if (IsLocalDeclaredInScopeOrNonRefOrOutParameterOfEnclosingSymbol(symbol, statementsInfo.Node, semanticModel, cancellationToken) &&
                                ifStatement
                                .GetChain()
                                .All(ifOrElse => IsSymbolAssignedInLastStatement(ifOrElse, symbol, semanticModel, cancellationToken)))
                            {
                                context.ReportDiagnostic(DiagnosticDescriptors.UseReturnInsteadOfAssignment, ifStatement);
                            }
                        }
                    }
                }
            }
        }
        public static void AnalyzeSwitchStatement(SyntaxNodeAnalysisContext context)
        {
            if (context.Node.ContainsDiagnostics)
            {
                return;
            }

            var switchStatement = (SwitchStatementSyntax)context.Node;

            StatementContainer container;

            if (StatementContainer.TryCreate(switchStatement, out container))
            {
                int index = container.Statements.IndexOf(switchStatement);

                ReturnStatementSyntax returnStatement = FindReturnStatementBelow(container.Statements, index);
                if (returnStatement != null)
                {
                    ExpressionSyntax expression = returnStatement.Expression;
                    if (expression?.ContainsDiagnostics == false &&
                        !switchStatement.SpanOrTrailingTriviaContainsDirectives() &&
                        !returnStatement.SpanOrLeadingTriviaContainsDirectives())
                    {
                        SemanticModel     semanticModel     = context.SemanticModel;
                        CancellationToken cancellationToken = context.CancellationToken;

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

                        if (IsLocalDeclaredInScopeOrNonRefOrOutParameterOfEnclosingSymbol(symbol, container.Node, semanticModel, cancellationToken) &&
                            switchStatement
                            .Sections
                            .All(section => IsValueAssignedInLastStatement(section, symbol, semanticModel, cancellationToken)))
                        {
                            context.ReportDiagnostic(DiagnosticDescriptors.UseReturnInsteadOfAssignment, switchStatement);
                        }
                    }
                }
            }
        }
예제 #3
0
        public static void AnalyzeIfStatement(SyntaxNodeAnalysisContext context)
        {
            if (context.Node.ContainsDiagnostics)
            {
                return;
            }

            var ifStatement = (IfStatementSyntax)context.Node;

            if (ifStatement.IsSimpleIf())
            {
                return;
            }

            StatementListInfo statementsInfo = SyntaxInfo.StatementListInfo(ifStatement);

            if (!statementsInfo.Success)
            {
                return;
            }

            int index = statementsInfo.IndexOf(ifStatement);

            ReturnStatementSyntax returnStatement = FindReturnStatementBelow(statementsInfo.Statements, index);

            if (returnStatement == null)
            {
                return;
            }

            if (returnStatement.ContainsDiagnostics)
            {
                return;
            }

            ExpressionSyntax expression = returnStatement.Expression;

            if (expression == null)
            {
                return;
            }

            if (ifStatement.SpanOrTrailingTriviaContainsDirectives())
            {
                return;
            }

            if (returnStatement.SpanOrLeadingTriviaContainsDirectives())
            {
                return;
            }

            SemanticModel     semanticModel     = context.SemanticModel;
            CancellationToken cancellationToken = context.CancellationToken;

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

            if (!IsLocalDeclaredInScopeOrNonRefOrOutParameterOfEnclosingSymbol(symbol, statementsInfo.Parent, semanticModel, cancellationToken))
            {
                return;
            }

            foreach (IfStatementOrElseClause ifOrElse in ifStatement.AsCascade())
            {
                if (!IsSymbolAssignedInLastStatement(ifOrElse, symbol, semanticModel, cancellationToken))
                {
                    return;
                }
            }

            context.ReportDiagnostic(DiagnosticDescriptors.UseReturnInsteadOfAssignment, ifStatement);
        }
예제 #4
0
        public static void AnalyzeSwitchStatement(SyntaxNodeAnalysisContext context)
        {
            if (context.Node.ContainsDiagnostics)
            {
                return;
            }

            var switchStatement = (SwitchStatementSyntax)context.Node;

            StatementListInfo statementsInfo = SyntaxInfo.StatementListInfo(switchStatement);

            if (!statementsInfo.Success)
            {
                return;
            }

            int index = statementsInfo.IndexOf(switchStatement);

            ReturnStatementSyntax returnStatement = FindReturnStatementBelow(statementsInfo.Statements, index);

            if (returnStatement == null)
            {
                return;
            }

            ExpressionSyntax expression = returnStatement.Expression;

            if (expression == null)
            {
                return;
            }

            if (expression.ContainsDiagnostics)
            {
                return;
            }

            if (switchStatement.SpanOrTrailingTriviaContainsDirectives())
            {
                return;
            }

            if (returnStatement.SpanOrLeadingTriviaContainsDirectives())
            {
                return;
            }

            SemanticModel     semanticModel     = context.SemanticModel;
            CancellationToken cancellationToken = context.CancellationToken;

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

            if (!IsLocalDeclaredInScopeOrNonRefOrOutParameterOfEnclosingSymbol(symbol, statementsInfo.Parent, semanticModel, cancellationToken))
            {
                return;
            }

            if (!switchStatement
                .Sections
                .All(section => IsValueAssignedInLastStatement(section, symbol, semanticModel, cancellationToken)))
            {
                return;
            }

            context.ReportDiagnostic(DiagnosticDescriptors.UseReturnInsteadOfAssignment, switchStatement);
        }
        public static void AnalyzeSwitchStatement(SyntaxNodeAnalysisContext context)
        {
            var switchStatement = (SwitchStatementSyntax)context.Node;

            StatementListInfo statementsInfo = SyntaxInfo.StatementListInfo(switchStatement);

            if (!statementsInfo.Success)
            {
                return;
            }

            ReturnStatementSyntax returnStatement = FindReturnStatementBelow(statementsInfo.Statements, switchStatement);

            ExpressionSyntax expression = returnStatement?.Expression;

            if (expression == null)
            {
                return;
            }

            if (switchStatement.SpanOrTrailingTriviaContainsDirectives())
            {
                return;
            }

            if (returnStatement.SpanOrLeadingTriviaContainsDirectives())
            {
                return;
            }

            SemanticModel     semanticModel     = context.SemanticModel;
            CancellationToken cancellationToken = context.CancellationToken;

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

            if (symbol == null)
            {
                return;
            }

            if (!IsLocalDeclaredInScopeOrNonRefOrOutParameterOfEnclosingSymbol(symbol, statementsInfo.Parent, semanticModel, cancellationToken))
            {
                return;
            }

            foreach (SwitchSectionSyntax section in switchStatement.Sections)
            {
                SyntaxList <StatementSyntax> statements = section.GetStatements();

                if (statements.Count <= 1)
                {
                    return;
                }

                if (!statements.Last().IsKind(SyntaxKind.BreakStatement))
                {
                    return;
                }

                if (!IsSymbolAssignedInStatement(symbol, statements[statements.Count - 2], semanticModel, cancellationToken))
                {
                    return;
                }
            }

            context.ReportDiagnostic(DiagnosticDescriptors.UseReturnInsteadOfAssignment, switchStatement);
        }
        private static void AnalyzeSwitchStatement(SyntaxNodeAnalysisContext context)
        {
            var switchStatement = (SwitchStatementSyntax)context.Node;

            StatementListInfo statementsInfo = SyntaxInfo.StatementListInfo(switchStatement);

            if (!statementsInfo.Success)
            {
                return;
            }

            ReturnStatementSyntax returnStatement = FindReturnStatementBelow(statementsInfo.Statements, switchStatement);

            ExpressionSyntax expression = returnStatement?.Expression;

            if (expression == null)
            {
                return;
            }

            if (switchStatement.SpanOrTrailingTriviaContainsDirectives())
            {
                return;
            }

            if (returnStatement.SpanOrLeadingTriviaContainsDirectives())
            {
                return;
            }

            SemanticModel     semanticModel     = context.SemanticModel;
            CancellationToken cancellationToken = context.CancellationToken;

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

            if (symbol == null)
            {
                return;
            }

            if (!IsLocalDeclaredInScopeOrNonRefOrOutParameterOfEnclosingSymbol(symbol, statementsInfo.Parent, semanticModel, cancellationToken))
            {
                return;
            }

            foreach (SwitchSectionSyntax section in switchStatement.Sections)
            {
                SyntaxList <StatementSyntax> statements = section.GetStatements();

                if (!statements.Any())
                {
                    return;
                }

                switch (statements.Last().Kind())
                {
                case SyntaxKind.ThrowStatement:
                {
                    continue;
                }

                case SyntaxKind.BreakStatement:
                {
                    if (statements.Count == 1 ||
                        !IsSymbolAssignedInStatement(symbol, statements.LastButOne(), semanticModel, cancellationToken))
                    {
                        return;
                    }

                    break;
                }

                default:
                {
                    return;
                }
                }
            }

            DiagnosticHelpers.ReportDiagnostic(context, DiagnosticDescriptors.UnnecessaryAssignment, switchStatement);
        }
        private static void AnalyzeIfStatement(SyntaxNodeAnalysisContext context)
        {
            var ifStatement = (IfStatementSyntax)context.Node;

            if (ifStatement.IsSimpleIf())
            {
                return;
            }

            StatementListInfo statementsInfo = SyntaxInfo.StatementListInfo(ifStatement);

            if (!statementsInfo.Success)
            {
                return;
            }

            ReturnStatementSyntax returnStatement = FindReturnStatementBelow(statementsInfo.Statements, ifStatement);

            ExpressionSyntax expression = returnStatement?.Expression;

            if (expression == null)
            {
                return;
            }

            if (ifStatement.SpanOrTrailingTriviaContainsDirectives())
            {
                return;
            }

            if (returnStatement.SpanOrLeadingTriviaContainsDirectives())
            {
                return;
            }

            SemanticModel     semanticModel     = context.SemanticModel;
            CancellationToken cancellationToken = context.CancellationToken;

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

            if (symbol == null)
            {
                return;
            }

            if (!IsLocalDeclaredInScopeOrNonRefOrOutParameterOfEnclosingSymbol(symbol, statementsInfo.Parent, semanticModel, cancellationToken))
            {
                return;
            }

            foreach (IfStatementOrElseClause ifOrElse in ifStatement.AsCascade())
            {
                StatementSyntax statement = ifOrElse.Statement;

                if (statement.IsKind(SyntaxKind.Block))
                {
                    statement = ((BlockSyntax)statement).Statements.LastOrDefault();
                }

                if (!statement.IsKind(SyntaxKind.ThrowStatement) &&
                    !IsSymbolAssignedInStatement(symbol, statement, semanticModel, cancellationToken))
                {
                    return;
                }
            }

            DiagnosticHelpers.ReportDiagnostic(context, DiagnosticDescriptors.UnnecessaryAssignment, ifStatement);
        }