private static Dictionary <string, NodeSymbolInfo> FindUnusedNodes(SyntaxNodeAnalysisContext context, ParameterInfo parameterInfo, bool isIndexer = false)
        {
            UnusedParameterWalker walker = UnusedParameterWalkerCache.GetInstance(context.SemanticModel, context.CancellationToken, isIndexer);

            if (parameterInfo.Parameter != null &&
                !StringUtility.IsOneOrManyUnderscores(parameterInfo.Parameter.Identifier.ValueText))
            {
                walker.AddParameter(parameterInfo.Parameter);
            }
            else
            {
                foreach (ParameterSyntax parameter in parameterInfo.Parameters)
                {
                    if (!StringUtility.IsOneOrManyUnderscores(parameter.Identifier.ValueText))
                    {
                        walker.AddParameter(parameter);
                    }
                }
            }

            foreach (TypeParameterSyntax typeParameter in parameterInfo.TypeParameters)
            {
                walker.AddTypeParameter(typeParameter);
                walker.IsAnyTypeParameter = true;
            }

            if (walker.Nodes.Count == 0)
            {
                return(walker.Nodes);
            }

            walker.Visit(parameterInfo.Node);

            return(UnusedParameterWalkerCache.GetNodesAndFree(walker));
        }
        public static Dictionary <string, NodeSymbolInfo> GetNodesAndFree(UnusedParameterWalker walker)
        {
            Dictionary <string, NodeSymbolInfo> nodes = walker.Nodes;

            Free(walker);

            return(nodes);
        }
        public static UnusedParameterWalker GetInstance()
        {
            UnusedParameterWalker walker = _cachedInstance;

            if (walker != null)
            {
                Debug.Assert(walker.Nodes.Count == 0);
                Debug.Assert(walker.SemanticModel == null);
                Debug.Assert(walker.CancellationToken == default);

                _cachedInstance = null;
                return(walker);
            }

            return(new UnusedParameterWalker());
        }
Esempio n. 4
0
        public static UnusedParameterWalker GetInstance(SemanticModel semanticModel, CancellationToken cancellationToken, bool isIndexer = false)
        {
            UnusedParameterWalker walker = _cachedInstance;

            if (walker != null)
            {
                _cachedInstance = null;
            }
            else
            {
                walker = new UnusedParameterWalker();
            }

            walker.SetValues(semanticModel, cancellationToken, isIndexer);

            return(walker);
        }
        public static UnusedParameterWalker GetInstance(SemanticModel semanticModel, CancellationToken cancellationToken, bool isIndexer = false)
        {
            UnusedParameterWalker walker = _cachedInstance;

            if (walker != null)
            {
                _cachedInstance = null;
                walker.Reset();
            }
            else
            {
                walker = new UnusedParameterWalker();
            }

            walker.SemanticModel     = semanticModel;
            walker.CancellationToken = cancellationToken;
            walker.IsIndexer         = isIndexer;

            return(walker);
        }
Esempio n. 6
0
        private static void AnalyzeMethodDeclaration(SyntaxNodeAnalysisContext context)
        {
            var methodDeclaration = (MethodDeclarationSyntax)context.Node;

            if (methodDeclaration.ContainsDiagnostics)
            {
                return;
            }

            if (!methodDeclaration.IsParentKind(SyntaxKind.ClassDeclaration, SyntaxKind.StructDeclaration, SyntaxKind.RecordDeclaration, SyntaxKind.RecordStructDeclaration))
            {
                return;
            }

            if (methodDeclaration.Modifiers.ContainsAny(
                    SyntaxKind.AbstractKeyword,
                    SyntaxKind.VirtualKeyword,
                    SyntaxKind.OverrideKeyword,
                    SyntaxKind.PartialKeyword))
            {
                return;
            }

            ParameterInfo parameterInfo = SyntaxInfo.ParameterInfo(methodDeclaration);

            if (!parameterInfo.Success)
            {
                return;
            }

            if (ContainsOnlyThrowNewExpression(parameterInfo.Body))
            {
                return;
            }

            IMethodSymbol methodSymbol = context.SemanticModel.GetDeclaredSymbol(methodDeclaration, context.CancellationToken);

            if (methodSymbol == null)
            {
                return;
            }

            if (SymbolUtility.IsEventHandlerMethod(methodSymbol))
            {
                return;
            }

            if (!methodSymbol.ExplicitInterfaceImplementations.IsDefaultOrEmpty)
            {
                return;
            }

            if (methodSymbol.ImplementsInterfaceMember(allInterfaces: true))
            {
                return;
            }

            UnusedParameterWalker walker = null;

            try
            {
                walker = UnusedParameterWalker.GetInstance();

                walker.SetValues(context.SemanticModel, context.CancellationToken);

                FindUnusedNodes(parameterInfo, walker);

                if (walker.Nodes.Count > 0 &&
                    !MethodReferencedAsMethodGroupWalker.IsReferencedAsMethodGroup(methodDeclaration, methodSymbol, context.SemanticModel, context.CancellationToken))
                {
                    foreach (KeyValuePair <string, NodeSymbolInfo> kvp in walker.Nodes)
                    {
                        ReportDiagnostic(context, kvp.Value.Node);
                    }
                }
            }
            finally
            {
                if (walker != null)
                {
                    UnusedParameterWalker.Free(walker);
                }
            }
        }
 public static void Free(UnusedParameterWalker walker)
 {
     _cachedInstance = walker;
 }
Esempio n. 8
0
 public static void Free(UnusedParameterWalker walker)
 {
     walker.SetValues(default(SemanticModel), default(CancellationToken));
     _cachedInstance = walker;
 }