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)); } }