diff --git a/src/xunit.analyzers.tests/Analyzers/X1000/X1015_MemberDataShouldReferenceValidMemberTests.cs b/src/xunit.analyzers.tests/Analyzers/X1000/X1015_MemberDataShouldReferenceValidMemberTests.cs index 3d62f5ec..ef56fa9c 100644 --- a/src/xunit.analyzers.tests/Analyzers/X1000/X1015_MemberDataShouldReferenceValidMemberTests.cs +++ b/src/xunit.analyzers.tests/Analyzers/X1000/X1015_MemberDataShouldReferenceValidMemberTests.cs @@ -24,6 +24,12 @@ public void MissingRemoteDataSource_ByNameAndType_Triggers() { } [{|#3:MemberData(nameof(MissingRemoteDataSource_ByNameofAndType_Triggers), MemberType = typeof(OtherClass))|}] public void MissingRemoteDataSource_ByNameofAndType_Triggers() { } + + public TheoryData NonStatic => null; + + [{|#4:MemberData("BogusName")|}] + [{|#5:MemberData(nameof(NonStatic))|}] + public void MissingDataSource_DoesNotStopAnalysisOfSubsequentAttributes(int _) { } } public abstract class BaseClassWithTestWithoutData @@ -43,19 +49,19 @@ public class SubClassWithTestData : BaseClassWithTestWithoutData public record TestRecord { [Theory] - [{|#4:MemberData("BogusName")|}] + [{|#6:MemberData("BogusName")|}] public void MissingLocalDataSource_InRecord_Triggers(int _) { } } public record class TestRecordClass { [Theory] - [{|#5:MemberData("BogusName")|}] + [{|#7:MemberData("BogusName")|}] public void MissingLocalDataSource_InRecordClass_Triggers(int _) { } } public record struct TestRecordStruct { [Theory] - [{|#6:MemberData("BogusName")|}] + [{|#8:MemberData("BogusName")|}] public void MissingLocalDataSource_InRecordStruct_Triggers(int _) { } } """; @@ -65,9 +71,11 @@ public void MissingLocalDataSource_InRecordStruct_Triggers(int _) { } Verify.Diagnostic("xUnit1015").WithLocation(1).WithArguments("BogusName", "TestClass"), Verify.Diagnostic("xUnit1015").WithLocation(2).WithArguments("BogusName", "OtherClass"), Verify.Diagnostic("xUnit1015").WithLocation(3).WithArguments("MissingRemoteDataSource_ByNameofAndType_Triggers", "OtherClass"), - Verify.Diagnostic("xUnit1015").WithLocation(4).WithArguments("BogusName", "TestRecord"), - Verify.Diagnostic("xUnit1015").WithLocation(5).WithArguments("BogusName", "TestRecordClass"), - Verify.Diagnostic("xUnit1015").WithLocation(6).WithArguments("BogusName", "TestRecordStruct"), + Verify.Diagnostic("xUnit1015").WithLocation(4).WithArguments("BogusName", "TestClass"), + Verify.Diagnostic("xUnit1017").WithLocation(5), + Verify.Diagnostic("xUnit1015").WithLocation(6).WithArguments("BogusName", "TestRecord"), + Verify.Diagnostic("xUnit1015").WithLocation(7).WithArguments("BogusName", "TestRecordClass"), + Verify.Diagnostic("xUnit1015").WithLocation(8).WithArguments("BogusName", "TestRecordStruct"), }; await Verify.VerifyAnalyzer(LanguageVersion.CSharp10, [source1, source2], expected); diff --git a/src/xunit.analyzers/X1000/MemberDataShouldReferenceValidMember.cs b/src/xunit.analyzers/X1000/MemberDataShouldReferenceValidMember.cs index 83b37634..074baf52 100644 --- a/src/xunit.analyzers/X1000/MemberDataShouldReferenceValidMember.cs +++ b/src/xunit.analyzers/X1000/MemberDataShouldReferenceValidMember.cs @@ -103,14 +103,14 @@ public override void AnalyzeCompilation( if (declaredMemberTypeSymbol.DeclaredAccessibility is not Accessibility.Public and not Accessibility.Internal) { ReportTypeMustBePublicOrInternal(context, attributeSyntax, declaredMemberTypeSymbol); - return; + continue; } // We can't close an open generic in Native AOT if (declaredMemberTypeSymbol is INamedTypeSymbol namedMemberType && namedMemberType.IsGenericType && namedMemberType.TypeArguments.Any(t => t.Kind == SymbolKind.TypeParameter)) { ReportOpenGenericMemberType(context, attributeSyntax); - return; + continue; } } @@ -120,11 +120,11 @@ public override void AnalyzeCompilation( { case 0: ReportMissingMember(context, attributeSyntax, memberName, declaredMemberTypeSymbol); - return; + continue; case > 1: ReporterOverloadedMember(context, attributeSyntax, memberName, declaredMemberTypeSymbol, xunitContext.HasV3AotReferences); - return; + continue; } var memberSymbol = memberSymbols[0]; @@ -139,7 +139,7 @@ public override void AnalyzeCompilation( if (memberReturnType is null) { ReportIncorrectMemberType(context, attributeSyntax); - return; + continue; } // Make sure they use nameof() instead of a string constant for the member name