Beispiel #1
0
        private void Analyze(SyntaxNodeAnalysisContext context)
        {
            BlockSyntax blockSyntax = (BlockSyntax)context.Node;

            if (blockSyntax.Statements == null || blockSyntax.Statements.Any())
            {
                return;
            }

            // Empty constructors are acceptable
            if (blockSyntax.Parent is ConstructorDeclarationSyntax)
            {
                return;
            }

            // Empty public or protected methods are acceptable, as it could be part of an API, or an interface implementation
            if (blockSyntax.Parent is MethodDeclarationSyntax methodSynxtax)
            {
                if (methodSynxtax.Modifiers.Any(SyntaxKind.PublicKeyword) || methodSynxtax.Modifiers.Any(SyntaxKind.ProtectedKeyword))
                {
                    return;
                }
            }

            // Empty catch blocks are a different type of code smell.
            if (blockSyntax.Parent is CatchClauseSyntax)
            {
                Diagnostic emptyCatchDiagnostic = Diagnostic.Create(CatchRule, blockSyntax.GetLocation());
                context.ReportDiagnostic(emptyCatchDiagnostic);
                return;
            }

            // ParanthesizedLambdaExpressions are acceptable () => { }, until a pre-canned static "EmptyAction" is defined.
            if (blockSyntax.Parent is ParenthesizedLambdaExpressionSyntax || blockSyntax.Parent is SimpleLambdaExpressionSyntax)
            {
                return;
            }

            // Empty lock blocks are acceptable.  lock (x) {}
            if (blockSyntax.Parent is LockStatementSyntax)
            {
                return;
            }

            Diagnostic diagnostic = Diagnostic.Create(StatementRule, blockSyntax.GetLocation());

            context.ReportDiagnostic(diagnostic);
        }
Beispiel #2
0
        private void AnalyzeStatement(SyntaxNodeAnalysisContext context)
        {
            if (GeneratedCodeAnalyzer?.IsGeneratedCode(context) == true)
            {
                return;
            }

            if (!context.Node.IsKind(SyntaxKind.IfStatement) ||
                IfElseAnalysis.IsIsolatedIf((IfStatementSyntax)context.Node))
            {
                BlockSyntax block = EmbeddedStatementAnalysis.GetBlockThatCanBeEmbeddedStatement(context.Node);

                if (block != null &&
                    !block.OpenBraceToken.IsMissing &&
                    !block.CloseBraceToken.IsMissing &&
                    block.OpenBraceToken.LeadingTrivia.All(f => f.IsWhitespaceOrEndOfLineTrivia()) &&
                    block.OpenBraceToken.TrailingTrivia.All(f => f.IsWhitespaceOrEndOfLineTrivia()) &&
                    block.CloseBraceToken.LeadingTrivia.All(f => f.IsWhitespaceOrEndOfLineTrivia()) &&
                    block.CloseBraceToken.TrailingTrivia.All(f => f.IsWhitespaceOrEndOfLineTrivia()))
                {
                    context.ReportDiagnostic(
                        DiagnosticDescriptors.RemoveBraces,
                        block.GetLocation(),
                        SyntaxHelper.GetNodeTitle(context.Node));

                    context.FadeOutBraces(DiagnosticDescriptors.RemoveBracesFadeOut, block);
                }
            }
        }
        public static void Analyze(SyntaxNodeAnalysisContext context)
        {
            SyntaxNode node = context.Node;

            if (!node.IsKind(SyntaxKind.IfStatement) ||
                !IfElseChain.IsPartOfChain((IfStatementSyntax)node))
            {
                BlockSyntax block = GetBlockThatCanBeEmbeddedStatement(node);

                if (block != null)
                {
                    SyntaxToken openBrace  = block.OpenBraceToken;
                    SyntaxToken closeBrace = block.CloseBraceToken;

                    if (!openBrace.IsMissing &&
                        !closeBrace.IsMissing &&
                        openBrace.GetLeadingAndTrailingTrivia().All(f => f.IsWhitespaceOrEndOfLineTrivia()) &&
                        closeBrace.GetLeadingAndTrailingTrivia().All(f => f.IsWhitespaceOrEndOfLineTrivia()))
                    {
                        context.ReportDiagnostic(
                            DiagnosticDescriptors.RemoveBraces,
                            block.GetLocation(),
                            GetName(node));

                        context.FadeOutBraces(DiagnosticDescriptors.RemoveBracesFadeOut, block);
                    }
                }
            }
        }
Beispiel #4
0
        private static void ReportDiagnostic(SyntaxNodeAnalysisContext context, BlockSyntax block, ExpressionSyntax expression)
        {
            context.ReportDiagnostic(
                DiagnosticDescriptors.UseExpressionBodiedMember,
                block.GetLocation());

            SyntaxNode parent = expression.Parent;

            if (parent.IsKind(SyntaxKind.ReturnStatement))
            {
                context.FadeOutToken(FadeOutDescriptor, ((ReturnStatementSyntax)parent).ReturnKeyword);
            }

            context.FadeOutBraces(FadeOutDescriptor, block);
        }
Beispiel #5
0
        private static bool AnalyzeBlock(SyntaxNodeAnalysisContext context, BlockSyntax block, bool checkTrivia = true)
        {
            if (block == null)
            {
                return(false);
            }

            SyntaxList <StatementSyntax> statements = block.Statements;

            if (statements.Count == 0)
            {
                return(false);
            }

            var returnStatement = statements[0] as ReturnStatementSyntax;

            if (returnStatement == null)
            {
                return(false);
            }

            if (returnStatement.Expression == null)
            {
                return(false);
            }

            if (checkTrivia && block
                .DescendantTrivia(descendIntoTrivia: true)
                .Any(f => !f.IsWhitespaceOrEndOfLine()))
            {
                return(false);
            }

            if (!returnStatement.IsSingleline())
            {
                return(false);
            }

            context.ReportDiagnostic(
                DiagnosticDescriptors.UseExpressionBodiedMember,
                block.GetLocation());

            DiagnosticHelper.FadeOutToken(context, returnStatement.ReturnKeyword, DiagnosticDescriptors.UseExpressionBodiedMemberFadeOut);
            DiagnosticHelper.FadeOutBraces(context, block, DiagnosticDescriptors.UseExpressionBodiedMemberFadeOut);

            return(true);
        }
Beispiel #6
0
        public static void Analyze(SyntaxNodeAnalysisContext context, BlockSyntax block)
        {
            SyntaxList <StatementSyntax> statements = block.Statements;

            if (!statements.Any() &&
                !(block.Parent is AccessorDeclarationSyntax))
            {
                int startLine = block.OpenBraceToken.GetSpanStartLine();
                int endLine   = block.CloseBraceToken.GetSpanEndLine();

                if ((endLine - startLine) != 1 &&
                    block
                    .DescendantTrivia(block.Span)
                    .All(f => f.IsWhitespaceOrEndOfLineTrivia()))
                {
                    context.ReportDiagnostic(DiagnosticDescriptors.FormatEmptyBlock, block.GetLocation());
                }
            }
        }
Beispiel #7
0
        public override void VisitBlock(BlockSyntax node)
        {
            AddEntry("", node.GetLocation());

            base.VisitBlock(node);
        }
Beispiel #8
0
        public static void Analyze(SyntaxNodeAnalysisContext context, BlockSyntax block)
        {
            if (block.IsParentKind(SyntaxKind.Block) &&
                block.Statements.Any())
            {
                context.ReportDiagnostic(DiagnosticDescriptors.RemoveRedundantBraces, block.GetLocation());

                context.FadeOutBraces(DiagnosticDescriptors.RemoveRedundantBracesFadeOut, block);
            }
        }