private void AnalyzeForLoopSection(ForLoopSection section, [NotNull] IOperation operation,
                                           OperationAnalysisContext context)
        {
            var statementWalker = new StatementWalker(section);

            AnalyzeVisitOperation(operation, statementWalker, context);
        }
        private void AnalyzeCodeBlock(OperationBlockAnalysisContext context)
        {
            var statementWalker = new StatementWalker();

            statementWalker.VisitBlocks(context.OperationBlocks);

            context.CancellationToken.ThrowIfCancellationRequested();

            if (statementWalker.StatementCount > 7)
            {
                ReportMember(context, statementWalker.StatementCount);
            }
        }
        private void AnalyzeVisitOperation([NotNull] IOperation operation, [NotNull] StatementWalker statementWalker,
                                           OperationAnalysisContext context)
        {
            statementWalker.Visit(operation);

            context.CancellationToken.ThrowIfCancellationRequested();

            if (statementWalker.IdentifiersAssigned.Count > 1)
            {
                string   identifiers = FormatIdentifierList(statementWalker.IdentifiersAssigned.ToList());
                Location location    = GetLocation(operation);
                context.ReportDiagnostic(Diagnostic.Create(Rule, location, identifiers));
            }
        }
        private static void AnalyzeCodeBlock(CodeBlockAnalysisContext context, int maxStatementCount)
        {
            if (context.OwningSymbol is INamedTypeSymbol || context.OwningSymbol.IsSynthesized())
            {
                return;
            }

            var statementWalker = new StatementWalker(context.CancellationToken);

            statementWalker.Visit(context.CodeBlock);

            if (statementWalker.StatementCount > maxStatementCount)
            {
                ReportAtContainingSymbol(statementWalker.StatementCount, maxStatementCount, context);
            }
        }
        private void AnalyzeStatement(OperationAnalysisContext context)
        {
            if (!context.Operation.IsStatement())
            {
                return;
            }

            if (context.Operation is IForLoopOperation forLoopOperation)
            {
                AnalyzeForLoop(forLoopOperation, context);
            }
            else
            {
                var statementWalker = new StatementWalker(ForLoopSection.None);
                AnalyzeVisitOperation(context.Operation, statementWalker, context);
            }
        }