private static void HandleInvocation(SyntaxNodeAnalysisContext context) { if (context.IsExcludedFromAnalysis()) { return; } var invocation = context.Node as InvocationExpressionSyntax; if (invocation == null || invocation.FirstAncestorOrSelf <AnonymousFunctionExpressionSyntax>() != null) { return; } var call = context.SemanticModel.GetSymbolSafe(invocation, context.CancellationToken) as IMethodSymbol; if (call != KnownSymbol.IDisposable.Dispose || call?.Parameters.Length != 0) { return; } if (Disposable.IsPotentiallyCachedOrInjected(invocation, context.SemanticModel, context.CancellationToken)) { context.ReportDiagnostic(Diagnostic.Create(Descriptor, invocation.FirstAncestorOrSelf <StatementSyntax>()?.GetLocation() ?? invocation.GetLocation())); } }
private static void HandleUsing(SyntaxNodeAnalysisContext context) { if (context.IsExcludedFromAnalysis()) { return; } var usingStatement = (UsingStatementSyntax)context.Node; if (usingStatement.Expression is InvocationExpressionSyntax || usingStatement.Expression is IdentifierNameSyntax) { if (Disposable.IsPotentiallyCachedOrInjected(usingStatement.Expression, context.SemanticModel, context.CancellationToken)) { context.ReportDiagnostic(Diagnostic.Create(Descriptor, usingStatement.Expression.GetLocation())); return; } } if (usingStatement.Declaration != null) { foreach (var variableDeclarator in usingStatement.Declaration.Variables) { if (variableDeclarator.Initializer == null) { continue; } var value = variableDeclarator.Initializer.Value; if (Disposable.IsPotentiallyCachedOrInjected(value, context.SemanticModel, context.CancellationToken)) { context.ReportDiagnostic(Diagnostic.Create(Descriptor, value.GetLocation())); return; } } } }