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()));
                }
            }
        }
Пример #2
0
        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()));
            }
        }