private void AnalyzeSyntaxNode(SyntaxNodeAnalysisContext context)
        {
            if (GeneratedCodeAnalyzer?.IsGeneratedCode(context) == true)
            {
                return;
            }

            var elseClause = (ElseClauseSyntax)context.Node;

            StatementSyntax statement = elseClause.Statement;

            if (statement != null)
            {
                if (!statement.IsKind(SyntaxKind.Block) &&
                    !statement.IsKind(SyntaxKind.IfStatement) &&
                    elseClause.ElseKeyword.GetSpanStartLine() == statement.GetSpanStartLine())
                {
                    context.ReportDiagnostic(
                        DiagnosticDescriptors.FormatEmbeddedStatementOnSeparateLine,
                        statement.GetLocation());
                }

                if (statement.IsKind(SyntaxKind.Block))
                {
                    var block = (BlockSyntax)statement;

                    if (block.Statements.Count == 0)
                    {
                        if (elseClause.ElseKeyword.TrailingTrivia.IsWhitespaceOrEndOfLine() &&
                            block.OpenBraceToken.LeadingTrivia.IsWhitespaceOrEndOfLine() &&
                            block.OpenBraceToken.TrailingTrivia.IsWhitespaceOrEndOfLine() &&
                            block.CloseBraceToken.LeadingTrivia.IsWhitespaceOrEndOfLine())
                        {
                            context.ReportDiagnostic(
                                DiagnosticDescriptors.RemoveEmptyElseClause,
                                elseClause.GetLocation());
                        }
                    }
                    else if (block.Statements.Count == 1)
                    {
                        if (block.Statements[0].IsKind(SyntaxKind.IfStatement))
                        {
                            var ifStatement = (IfStatementSyntax)block.Statements[0];

                            if (ifStatement.Else == null)
                            {
                                context.ReportDiagnostic(
                                    DiagnosticDescriptors.SimplifyElseClauseContainingIfStatement,
                                    block.GetLocation());

                                DiagnosticHelper.FadeOutBraces(
                                    context,
                                    block,
                                    DiagnosticDescriptors.SimplifyElseClauseContainingIfStatementFadeOut);
                            }
                        }
                    }
                }
            }
        }
        private static void Analyze(SyntaxNodeAnalysisContext context, SyntaxList <StatementSyntax> statements)
        {
            if (statements.Count <= 1)
            {
                return;
            }

            int previousEndLine = statements[0].GetSpanEndLine();

            for (int i = 1; i < statements.Count; i++)
            {
                StatementSyntax statement = statements[i];

                if (!statement.IsKind(SyntaxKind.Block, SyntaxKind.EmptyStatement) &&
                    statement.GetSpanStartLine() == previousEndLine)
                {
                    DiagnosticHelpers.ReportDiagnostic(
                        context,
                        DiagnosticDescriptors.AddNewLineBeforeStatement,
                        Location.Create(statement.SyntaxTree, statement.Span.WithLength(0)));
                }

                previousEndLine = statement.GetSpanEndLine();
            }
        }
Beispiel #3
0
        private void AnalyzeSyntaxNode(SyntaxNodeAnalysisContext context)
        {
            if (GeneratedCodeAnalyzer?.IsGeneratedCode(context) == true)
            {
                return;
            }

            var elseClause = (ElseClauseSyntax)context.Node;

            StatementSyntax statement = elseClause.Statement;

            if (statement != null)
            {
                if (!statement.IsKind(SyntaxKind.Block) &&
                    !statement.IsKind(SyntaxKind.IfStatement) &&
                    elseClause.ElseKeyword.GetSpanStartLine() == statement.GetSpanStartLine())
                {
                    context.ReportDiagnostic(
                        DiagnosticDescriptors.FormatEmbeddedStatementOnSeparateLine,
                        statement.GetLocation());
                }

                if (statement.IsKind(SyntaxKind.Block))
                {
                    var block = (BlockSyntax)statement;

                    if (block.Statements.Count == 0)
                    {
                        if (elseClause
                            .DescendantTrivia(elseClause.Span)
                            .All(f => f.IsWhitespaceOrEndOfLineTrivia()))
                        {
                            context.ReportDiagnostic(
                                DiagnosticDescriptors.RemoveEmptyElseClause,
                                elseClause.GetLocation());
                        }
                    }
                    else if (block.Statements.Count == 1)
                    {
                        if (block.Statements[0].IsKind(SyntaxKind.IfStatement))
                        {
                            var ifStatement = (IfStatementSyntax)block.Statements[0];

                            if (ifStatement.Else == null &&
                                CheckTrivia(elseClause, ifStatement))
                            {
                                context.ReportDiagnostic(
                                    DiagnosticDescriptors.MergeElseClauseWithNestedIfStatement,
                                    block.GetLocation());

                                context.FadeOutBraces(
                                    DiagnosticDescriptors.MergeElseClauseWithNestedIfStatementFadeOut,
                                    block);
                            }
                        }
                    }
                }
            }
        }
Beispiel #4
0
        private static void AnalyzeEmbeddedStatement(SyntaxNodeAnalysisContext context)
        {
            SyntaxToken token = GetToken(context.Node);

            if (token.IsMissing)
            {
                return;
            }

            StatementSyntax statement = GetStatement(context.Node);

            if (statement.IsKind(SyntaxKind.Block))
            {
                return;
            }

            if (statement.IsKind(SyntaxKind.EmptyStatement))
            {
                return;
            }

            if (token.GetSpanStartLine() == statement.GetSpanStartLine())
            {
                context.ReportDiagnostic(
                    DiagnosticDescriptors.FormatEmbeddedStatementOnSeparateLine,
                    statement.GetLocation());
            }
            else
            {
                var parentStatement = (StatementSyntax)context.Node;

                var block = parentStatement.Parent as BlockSyntax;
                if (block == null)
                {
                    return;
                }

                int index = block.Statements.IndexOf(parentStatement);

                if (index == block.Statements.Count - 1)
                {
                    return;
                }

                int diff = block.Statements[index + 1].GetSpanStartLine() - statement.GetSpanEndLine();

                if (diff < 2)
                {
                    context.ReportDiagnostic(
                        DiagnosticDescriptors.AddEmptyLineAfterEmbeddedStatement,
                        statement.GetLocation());
                }
            }
        }
Beispiel #5
0
        private static void Analyze(SyntaxNodeAnalysisContext context, SyntaxList <StatementSyntax> statements)
        {
            if (statements.Count > 1)
            {
                int previousEndLine = statements[0].GetSpanEndLine();

                for (int i = 1; i < statements.Count; i++)
                {
                    StatementSyntax statement = statements[i];

                    if (!statement.IsKind(SyntaxKind.Block, SyntaxKind.EmptyStatement) &&
                        statement.GetSpanStartLine() == previousEndLine)
                    {
                        context.ReportDiagnostic(DiagnosticDescriptors.FormatEachStatementOnSeparateLine, statement);
                    }

                    previousEndLine = statement.GetSpanEndLine();
                }
            }
        }
Beispiel #6
0
        private void AnalyzeStatement(SyntaxNodeAnalysisContext context, StatementSyntax statement, SyntaxToken openBrace, SyntaxToken closeBrace)
        {
            var block = (BlockSyntax)statement.Parent;

            SyntaxList <StatementSyntax> statements = block.Statements;

            int index = statements.IndexOf(statement);

            Debug.Assert(index != -1, "");

            if (index != -1 &&
                index < statements.Count - 1)
            {
                int startLine = openBrace.GetSpanStartLine();

                int endLine = closeBrace.GetSpanEndLine();

                if (startLine < endLine)
                {
                    StatementSyntax nextStatement = statements[index + 1];

                    if (nextStatement.GetSpanStartLine() - endLine == 1)
                    {
                        SyntaxTrivia trivia = closeBrace
                                              .TrailingTrivia
                                              .FirstOrDefault(f => f.IsEndOfLineTrivia());

                        if (trivia.IsEndOfLineTrivia())
                        {
                            context.ReportDiagnostic(
                                DiagnosticDescriptors.AddEmptyLineAfterClosingBrace,
                                trivia);
                        }
                    }
                }
            }
        }