public static UnnecessaryUsageOfEnumeratorWalker GetInstance()
        {
            UnnecessaryUsageOfEnumeratorWalker walker = _cachedInstance;

            if (walker != null)
            {
                _cachedInstance = null;
                return(walker);
            }

            return(new UnnecessaryUsageOfEnumeratorWalker());
        }
Exemplo n.º 2
0
        public static UnnecessaryUsageOfEnumeratorWalker GetInstance()
        {
            UnnecessaryUsageOfEnumeratorWalker walker = _cachedInstance;

            if (walker != null)
            {
                Debug.Assert(walker._symbol == null);
                Debug.Assert(walker._variableDeclarator == null);
                Debug.Assert(walker._semanticModel == null);
                Debug.Assert(walker._cancellationToken == default);

                _cachedInstance = null;
                return(walker);
            }

            return(new UnnecessaryUsageOfEnumeratorWalker());
        }
Exemplo n.º 3
0
        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);
            }
        }
 public static void Free(UnnecessaryUsageOfEnumeratorWalker walker)
 {
     _cachedInstance = walker;
 }