private static void HandleDeclaration(SyntaxNodeAnalysisContext context) { if (context.IsExcludedFromAnalysis()) { return; } var variableDeclaration = (VariableDeclarationSyntax)context.Node; foreach (var declarator in variableDeclaration.Variables) { var value = declarator.Initializer?.Value; if (value == null || !Disposable.IsPotentiallyAssignableTo(value, context.SemanticModel, context.CancellationToken)) { continue; } if (Disposable.IsCreation(value, context.SemanticModel, context.CancellationToken) .IsEither(Result.Yes, Result.Maybe)) { if (variableDeclaration.Parent is UsingStatementSyntax || variableDeclaration.Parent is AnonymousFunctionExpressionSyntax) { return; } var block = declarator.FirstAncestorOrSelf <BlockSyntax>(); if (block == null) { return; } if (context.SemanticModel.GetDeclaredSymbolSafe(declarator, context.CancellationToken) is ILocalSymbol local) { if (IsReturned(local, block, context.SemanticModel, context.CancellationToken)) { return; } if (IsAssignedToFieldOrProperty(local, block, context.SemanticModel, context.CancellationToken)) { return; } if (IsAddedToFieldOrProperty(local, block, context.SemanticModel, context.CancellationToken)) { return; } if (IsDisposedAfter(local, value, context.SemanticModel, context.CancellationToken)) { return; } } context.ReportDiagnostic(Diagnostic.Create(Descriptor, variableDeclaration.GetLocation())); } } }
private static void HandleInvocation(SyntaxNodeAnalysisContext context) { if (context.IsExcludedFromAnalysis()) { return; } var invocation = (InvocationExpressionSyntax)context.Node; var method = context.SemanticModel.GetSymbolSafe(invocation, context.CancellationToken) as IMethodSymbol; if (method == null || method.ReturnsVoid || !Disposable.IsPotentiallyAssignableTo(method.ReturnType)) { return; } if (MustBeHandled(invocation, context.SemanticModel, context.CancellationToken)) { context.ReportDiagnostic(Diagnostic.Create(Descriptor, context.Node.GetLocation())); } }