Ejemplo n.º 1
0
        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()));
            }
        }
Ejemplo n.º 2
0
        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;
                    }
                }
            }
        }