public static void Free(UnnecessaryUsageOfEnumeratorWalker walker) { walker.SetValues(default(VariableDeclaratorSyntax), default(SemanticModel), default(CancellationToken)); _cachedInstance = walker; }
private static void AnalyzeUsingStatement(SyntaxNodeAnalysisContext context) { var usingStatement = (UsingStatementSyntax)context.Node; VariableDeclaratorSyntax declarator = usingStatement.Declaration?.Variables.SingleOrDefault(shouldThrow: false); if (declarator == null) { return; } if (!(usingStatement.Statement?.SingleNonBlockStatementOrDefault() is WhileStatementSyntax whileStatement)) { return; } SimpleMemberInvocationExpressionInfo invocationInfo = SyntaxInfo.SimpleMemberInvocationExpressionInfo(whileStatement.Condition); if (!invocationInfo.Success) { return; } if (invocationInfo.Arguments.Any()) { return; } if (!string.Equals(invocationInfo.NameText, WellKnownMemberNames.MoveNextMethodName, StringComparison.Ordinal)) { return; } if (!string.Equals((invocationInfo.Expression as IdentifierNameSyntax)?.Identifier.ValueText, declarator.Identifier.ValueText, StringComparison.Ordinal)) { return; } SimpleMemberInvocationExpressionInfo invocationInfo2 = SyntaxInfo.SimpleMemberInvocationExpressionInfo(declarator.Initializer.Value); if (!invocationInfo2.Success) { return; } if (invocationInfo2.Arguments.Any()) { return; } if (!string.Equals(invocationInfo2.NameText, WellKnownMemberNames.GetEnumeratorMethodName, StringComparison.Ordinal)) { return; } UnnecessaryUsageOfEnumeratorWalker walker = UnnecessaryUsageOfEnumeratorWalker.GetInstance(); walker.SetValues(declarator, context.SemanticModel, context.CancellationToken); walker.Visit(whileStatement.Statement); bool?isFixable = walker.IsFixable; UnnecessaryUsageOfEnumeratorWalker.Free(walker); if (isFixable == true) { DiagnosticHelpers.ReportDiagnostic(context, DiagnosticDescriptors.UnnecessaryExplicitUseOfEnumerator, usingStatement.UsingKeyword); } }