public static ContainsContinueStatementWalker GetInstance() { ContainsContinueStatementWalker walker = _cachedInstance; if (walker != null) { _cachedInstance = null; return(walker); } return(new ContainsContinueStatementWalker()); }
private static void AnalyzeWhileStatement(SyntaxNodeAnalysisContext context) { var whileStatement = (WhileStatementSyntax)context.Node; ExpressionSyntax condition = whileStatement.Condition; if (condition.IsMissing) { return; } if (!condition.IsSingleLine()) { return; } StatementSyntax statement = whileStatement.Statement; if (!(statement is BlockSyntax block)) { return; } SyntaxList <StatementSyntax> innerStatements = block.Statements; if (innerStatements.Count <= 1) { return; } ExpressionSyntax incrementedExpression = GetIncrementedExpression(innerStatements.Last()); if (!incrementedExpression.IsKind(SyntaxKind.IdentifierName)) { return; } SyntaxList <StatementSyntax> outerStatements = SyntaxInfo.StatementListInfo(whileStatement).Statements; int index = outerStatements.IndexOf(whileStatement); if (index <= 0) { return; } SingleLocalDeclarationStatementInfo localInfo = GetLocalInfo(outerStatements[index - 1]); if (!localInfo.Success) { return; } if (index > 1) { SingleLocalDeclarationStatementInfo localInfo2 = GetLocalInfo(outerStatements[index - 2]); if (localInfo2.Success) { ExpressionSyntax incrementedExpression2 = GetIncrementedExpression(innerStatements[innerStatements.Count - 2]); if (incrementedExpression2 is IdentifierNameSyntax identifierName2 && string.Equals(localInfo2.Identifier.ValueText, identifierName2.Identifier.ValueText, StringComparison.Ordinal)) { return; } } } var identifierName = (IdentifierNameSyntax)incrementedExpression; if (!string.Equals(localInfo.Identifier.ValueText, identifierName.Identifier.ValueText, StringComparison.Ordinal)) { return; } if (ContainsContinueStatement()) { return; } SemanticModel semanticModel = context.SemanticModel; CancellationToken cancellationToken = context.CancellationToken; ISymbol symbol = semanticModel.GetDeclaredSymbol(localInfo.Declarator, cancellationToken); if (symbol?.Kind != SymbolKind.Local) { return; } if (IsLocalVariableReferencedAfterWhileStatement()) { return; } DiagnosticHelpers.ReportDiagnostic(context, DiagnosticDescriptors.UseForStatementInsteadOfWhileStatement, whileStatement.WhileKeyword); bool ContainsContinueStatement() { ContainsContinueStatementWalker walker = ContainsContinueStatementWalker.GetInstance(); walker.ContainsContinueStatement = false; bool containsContinueStatement = false; foreach (StatementSyntax innerStatement in innerStatements) { walker.Visit(innerStatement); if (walker.ContainsContinueStatement) { containsContinueStatement = true; break; } } ContainsContinueStatementWalker.Free(walker); return(containsContinueStatement); } bool IsLocalVariableReferencedAfterWhileStatement() { ContainsLocalOrParameterReferenceWalker walker = ContainsLocalOrParameterReferenceWalker.GetInstance(symbol, semanticModel, cancellationToken); walker.VisitList(outerStatements, index + 1); return(ContainsLocalOrParameterReferenceWalker.GetResultAndFree(walker)); } }
public static void Free(ContainsContinueStatementWalker walker) { _cachedInstance = walker; }