diff --git a/src/NSubstitute.Analyzers.Shared/DiagnosticAnalyzers/AbstractNonSubstitutableMemberArgumentMatcherAnalyzer.cs b/src/NSubstitute.Analyzers.Shared/DiagnosticAnalyzers/AbstractNonSubstitutableMemberArgumentMatcherAnalyzer.cs index dd90247d..35ebece4 100644 --- a/src/NSubstitute.Analyzers.Shared/DiagnosticAnalyzers/AbstractNonSubstitutableMemberArgumentMatcherAnalyzer.cs +++ b/src/NSubstitute.Analyzers.Shared/DiagnosticAnalyzers/AbstractNonSubstitutableMemberArgumentMatcherAnalyzer.cs @@ -20,7 +20,7 @@ internal abstract class AbstractNonSubstitutableMemberArgumentMatcherAnalyzer : OperationKind.SimpleAssignment); private static readonly ImmutableHashSet IgnoredAncestors = - ImmutableHashSet.Create(OperationKind.VariableDeclarator, OperationKind.VariableDeclaration); + ImmutableHashSet.Create(OperationKind.VariableDeclarator, OperationKind.VariableDeclaration, OperationKind.Return); private static readonly ImmutableHashSet DynamicOperations = ImmutableHashSet.Create(OperationKind.DynamicInvocation, OperationKind.DynamicIndexerAccess, OperationKind.DynamicMemberReference); diff --git a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberArgumentMatcherAnalyzerTests/NonSubstitutableMemberArgumentMatcherDiagnosticVerifier.cs b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberArgumentMatcherAnalyzerTests/NonSubstitutableMemberArgumentMatcherDiagnosticVerifier.cs index 50207999..597a7d97 100644 --- a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberArgumentMatcherAnalyzerTests/NonSubstitutableMemberArgumentMatcherDiagnosticVerifier.cs +++ b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberArgumentMatcherAnalyzerTests/NonSubstitutableMemberArgumentMatcherDiagnosticVerifier.cs @@ -135,6 +135,10 @@ public abstract class NonSubstitutableMemberArgumentMatcherDiagnosticVerifier : [MemberData(nameof(CorrectlyUsedArgTestCasesWithoutDelegates))] public abstract Task ReportsDiagnostics_WhenAssigningInvalidArgMatchersToMemberPrecededByWithAnyArgsLikeMethod(string receivedMethod, string arg); + [CombinatoryTheory] + [MemberData(nameof(CorrectlyUsedArgTestCasesWithoutDelegates))] + public abstract Task ReportsNoDiagnostics_WhenUsedDirectlyWithReturnStatement(string arg); + public static IEnumerable MisusedArgTestCases { get diff --git a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberArgumentMatcherAnalyzerTests/NonSubstitutableMemberArgumentMatcherTests.cs b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberArgumentMatcherAnalyzerTests/NonSubstitutableMemberArgumentMatcherTests.cs index 16789ad2..4223ed3d 100644 --- a/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberArgumentMatcherAnalyzerTests/NonSubstitutableMemberArgumentMatcherTests.cs +++ b/tests/NSubstitute.Analyzers.Tests.CSharp/DiagnosticAnalyzerTests/NonSubstitutableMemberArgumentMatcherAnalyzerTests/NonSubstitutableMemberArgumentMatcherTests.cs @@ -1000,6 +1000,36 @@ public void Test() {receivedMethod}[1] = {arg}; }} }} +}}"; + await VerifyNoDiagnostic(source); + } + + public override async Task ReportsNoDiagnostics_WhenUsedDirectlyWithReturnStatement(string arg) + { + var source = $@"using System; +using NSubstitute; +using NSubstitute.ReceivedExtensions; + +namespace MyNamespace +{{ + public interface IFoo + {{ + int Bar(int? x); + }} + + public class FooTests + {{ + public void Test() + {{ + var substitute = Substitute.For(); + substitute.Received(1).Bar(MatchesArg()); + }} + + private int? MatchesArg() + {{ + return {arg}; + }} + }} }}"; await VerifyNoDiagnostic(source); } diff --git a/tests/NSubstitute.Analyzers.Tests.Shared/DiagnosticAnalyzers/INonSubstitutableMemberArgumentMatcherDiagnosticVerifier.cs b/tests/NSubstitute.Analyzers.Tests.Shared/DiagnosticAnalyzers/INonSubstitutableMemberArgumentMatcherDiagnosticVerifier.cs index 6cd49e65..289c83f2 100644 --- a/tests/NSubstitute.Analyzers.Tests.Shared/DiagnosticAnalyzers/INonSubstitutableMemberArgumentMatcherDiagnosticVerifier.cs +++ b/tests/NSubstitute.Analyzers.Tests.Shared/DiagnosticAnalyzers/INonSubstitutableMemberArgumentMatcherDiagnosticVerifier.cs @@ -59,4 +59,6 @@ public interface INonSubstitutableMemberArgumentMatcherDiagnosticVerifier Task ReportsDiagnostics_WhenAssigningArgMatchersToNonSubstitutableMember_InWhenLikeMethod(string whenMethod, string arg); Task ReportsNoDiagnostics_WhenAssigningArgMatchersToSubstitutableMember_InWhenLikeMethod(string whenMethod, string arg); + + Task ReportsNoDiagnostics_WhenUsedDirectlyWithReturnStatement(string arg); } \ No newline at end of file diff --git a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberArgumentMatcherAnalyzerTests/NonSubstitutableMemberArgumentMatcherDiagnosticVerifier.cs b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberArgumentMatcherAnalyzerTests/NonSubstitutableMemberArgumentMatcherDiagnosticVerifier.cs index 2281280d..8131db6a 100644 --- a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberArgumentMatcherAnalyzerTests/NonSubstitutableMemberArgumentMatcherDiagnosticVerifier.cs +++ b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberArgumentMatcherAnalyzerTests/NonSubstitutableMemberArgumentMatcherDiagnosticVerifier.cs @@ -139,6 +139,10 @@ public abstract class NonSubstitutableMemberArgumentMatcherDiagnosticVerifier : [Fact] public abstract Task ReportsNoDiagnostic_WhenOverloadCannotBeInferred(); + [CombinatoryTheory] + [MemberData(nameof(CorrectlyUsedArgTestCasesWithoutDelegates))] + public abstract Task ReportsNoDiagnostics_WhenUsedDirectlyWithReturnStatement(string arg); + public static IEnumerable MisusedArgTestCases { get { return MisusedArgs.Select(argArray => argArray.Select(arg => arg).ToArray()); } diff --git a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberArgumentMatcherAnalyzerTests/NonSubstitutableMemberArgumentMatcherTests.cs b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberArgumentMatcherAnalyzerTests/NonSubstitutableMemberArgumentMatcherTests.cs index c66ab0bf..1cc2789c 100644 --- a/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberArgumentMatcherAnalyzerTests/NonSubstitutableMemberArgumentMatcherTests.cs +++ b/tests/NSubstitute.Analyzers.Tests.VisualBasic/DiagnosticAnalyzersTests/NonSubstitutableMemberArgumentMatcherAnalyzerTests/NonSubstitutableMemberArgumentMatcherTests.cs @@ -1017,4 +1017,30 @@ End Namespace await VerifyNoDiagnostic(source); } + + public override async Task ReportsNoDiagnostics_WhenUsedDirectlyWithReturnStatement(string arg) + { + var source = @"Imports System +Imports NSubstitute +Imports NSubstitute.ReceivedExtensions + +Namespace MyNamespace + Interface IFoo + Function Bar(ByVal x As Integer?) As Integer + End Interface + + Public Class FooTests + Public Sub Test() + Dim substitute = NSubstitute.Substitute.[For](Of IFoo)() + substitute.Received(1).Bar(MatchesArg()) + End Sub + + Private Function MatchesArg() As Integer? + Return Arg.Any(Of Integer)() + End Function + End Class +End Namespace +"; + await VerifyNoDiagnostic(source); + } } \ No newline at end of file