private static void Handle(SyntaxNodeAnalysisContext context)
        {
            if (context.ContainingSymbol is IMethodSymbol method &&
                context.Node is MethodDeclarationSyntax methodDeclaration &&
                Disposable.IsAssignableFrom(method.ReturnType, context.Compilation))
            {
                using var walker = ReturnValueWalker.Borrow(methodDeclaration, ReturnValueSearch.RecursiveInside, context.SemanticModel, context.CancellationToken);
                if (walker.TryFirst(x => IsCreated(x), out _) &&
                    walker.TryFirst(x => IsCachedOrInjected(x) && !IsNop(x), out _))
                {
                    context.ReportDiagnostic(Diagnostic.Create(Descriptors.IDISP015DoNotReturnCachedAndCreated, methodDeclaration.Identifier.GetLocation()));
                }
            }

            bool IsCreated(ExpressionSyntax expression)
            {
                return(Disposable.IsCreation(expression, context.SemanticModel, context.CancellationToken) == Result.Yes);
            }

            bool IsCachedOrInjected(ExpressionSyntax expression)
            {
                return(Disposable.IsCachedOrInjected(expression, expression, context.SemanticModel, context.CancellationToken));
            }

            bool IsNop(ExpressionSyntax expression)
            {
                return(Disposable.IsNop(expression, context.SemanticModel, context.CancellationToken));
            }
        }