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()); }
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); }
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; }
public static void Free(UnusedParameterWalker walker) { walker.SetValues(default(SemanticModel), default(CancellationToken)); _cachedInstance = walker; }