From 6ddcd4ea0b47f8dda2210574e556ecc99a952765 Mon Sep 17 00:00:00 2001 From: Michael Render Date: Sat, 13 Jan 2024 03:27:29 -0500 Subject: [PATCH 1/7] Allow static virtual members in CA1000 --- .../DoNotDeclareStaticMembersOnGenericTypes.cs | 6 ++++++ ...tDeclareStaticMembersOnGenericTypesTests.cs | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/NetAnalyzers/Core/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypes.cs b/src/NetAnalyzers/Core/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypes.cs index 1ed4d01824..8cdca261f7 100644 --- a/src/NetAnalyzers/Core/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypes.cs +++ b/src/NetAnalyzers/Core/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypes.cs @@ -55,6 +55,12 @@ public override void Initialize(AnalysisContext context) return; } + // Virtual members on generic types can't be called directly, so they don't suffer the problem this analyzer exists to prevent. + if (symbol.IsAbstract || symbol.IsVirtual) + { + return; + } + symbolAnalysisContext.ReportDiagnostic(symbol.CreateDiagnostic(Rule, symbol.Name)); }, SymbolKind.Method, SymbolKind.Property); } diff --git a/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs b/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs index 86adc7049b..bed15fbf14 100644 --- a/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs +++ b/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs @@ -428,6 +428,24 @@ public override int GetHashCode() "); } + [Fact, WorkItem(7126, "https://github.com/dotnet/roslyn-analyzers/issues/7126")] + public async Task CSharp_CA1000_ShouldNotGenerate_VirtualMember() + { + await VerifyCS.VerifyAnalyzerAsync(@" +public interface ITestInterface +{ + static abstract string AbstractMember { get; } + + static virtual string VirtualMember => """"; +} +", +DiagnosticResult.CompilerError("CS8703").WithSpan(4, 28, 4, 42).WithArguments("abstract", "7.3", "11.0"), +DiagnosticResult.CompilerError("CS8919").WithSpan(4, 45, 4, 48), +DiagnosticResult.CompilerError("CS8703").WithSpan(6, 27, 6, 40).WithArguments("virtual", "7.3", "11.0"), +DiagnosticResult.CompilerError("CS8919").WithSpan(6, 44, 6, 46) +); + } + private static DiagnosticResult GetCSharpResultAt(int line, int column) #pragma warning disable RS0030 // Do not use banned APIs => VerifyCS.Diagnostic().WithLocation(line, column); From 51d49eb4a6c66d649c7b8a34d70c7511923244c9 Mon Sep 17 00:00:00 2001 From: Michael Render Date: Mon, 15 Jan 2024 10:19:39 -0500 Subject: [PATCH 2/7] Ad ifdef in test instead of expecting a failure --- .../DoNotDeclareStaticMembersOnGenericTypesTests.cs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs b/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs index bed15fbf14..60e1080310 100644 --- a/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs +++ b/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs @@ -432,18 +432,15 @@ public override int GetHashCode() public async Task CSharp_CA1000_ShouldNotGenerate_VirtualMember() { await VerifyCS.VerifyAnalyzerAsync(@" +#if NET7_OR_GREATER public interface ITestInterface { static abstract string AbstractMember { get; } static virtual string VirtualMember => """"; } -", -DiagnosticResult.CompilerError("CS8703").WithSpan(4, 28, 4, 42).WithArguments("abstract", "7.3", "11.0"), -DiagnosticResult.CompilerError("CS8919").WithSpan(4, 45, 4, 48), -DiagnosticResult.CompilerError("CS8703").WithSpan(6, 27, 6, 40).WithArguments("virtual", "7.3", "11.0"), -DiagnosticResult.CompilerError("CS8919").WithSpan(6, 44, 6, 46) -); +#endif +"); } private static DiagnosticResult GetCSharpResultAt(int line, int column) From c8da915d460d95ffbb0a8ffee2e2a8c43e1d0090 Mon Sep 17 00:00:00 2001 From: Michael Render Date: Mon, 15 Jan 2024 10:28:08 -0500 Subject: [PATCH 3/7] remove unnecessary generic --- .../DoNotDeclareStaticMembersOnGenericTypesTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs b/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs index 60e1080310..80d595442c 100644 --- a/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs +++ b/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs @@ -433,7 +433,7 @@ public async Task CSharp_CA1000_ShouldNotGenerate_VirtualMember() { await VerifyCS.VerifyAnalyzerAsync(@" #if NET7_OR_GREATER -public interface ITestInterface +public interface ITestInterface { static abstract string AbstractMember { get; } From 1f37f3296a7a4ef9a5f50d5c1ef346ea1011dee2 Mon Sep 17 00:00:00 2001 From: Michael Render Date: Mon, 15 Jan 2024 13:07:00 -0500 Subject: [PATCH 4/7] Bring back generic --- .../DoNotDeclareStaticMembersOnGenericTypesTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs b/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs index 80d595442c..60e1080310 100644 --- a/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs +++ b/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs @@ -433,7 +433,7 @@ public async Task CSharp_CA1000_ShouldNotGenerate_VirtualMember() { await VerifyCS.VerifyAnalyzerAsync(@" #if NET7_OR_GREATER -public interface ITestInterface +public interface ITestInterface { static abstract string AbstractMember { get; } From 9d0b9994f52729b4ca47768399081f9888a9fe2d Mon Sep 17 00:00:00 2001 From: Michael Render Date: Mon, 15 Jan 2024 13:07:29 -0500 Subject: [PATCH 5/7] use generic type --- .../DoNotDeclareStaticMembersOnGenericTypesTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs b/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs index 60e1080310..223a69cdf6 100644 --- a/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs +++ b/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft. All Rights Reserved. Licensed under the MIT license. See License.txt in the project root for license information. +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the MIT license. See License.txt in the project root for license information. using System.Threading.Tasks; using Microsoft.CodeAnalysis.Testing; @@ -435,7 +435,7 @@ await VerifyCS.VerifyAnalyzerAsync(@" #if NET7_OR_GREATER public interface ITestInterface { - static abstract string AbstractMember { get; } + static abstract T AbstractMember { get; } static virtual string VirtualMember => """"; } From 594681330a49e16c2923b0a5b5042df4a55b9252 Mon Sep 17 00:00:00 2001 From: Michael Render Date: Mon, 15 Jan 2024 23:36:57 -0500 Subject: [PATCH 6/7] Specify C# 11 and protect against .NET 7 warnings --- ...DeclareStaticMembersOnGenericTypesTests.cs | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs b/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs index 223a69cdf6..34b59eb7f1 100644 --- a/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs +++ b/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs @@ -431,16 +431,28 @@ public override int GetHashCode() [Fact, WorkItem(7126, "https://github.com/dotnet/roslyn-analyzers/issues/7126")] public async Task CSharp_CA1000_ShouldNotGenerate_VirtualMember() { - await VerifyCS.VerifyAnalyzerAsync(@" -#if NET7_OR_GREATER + string code = @" public interface ITestInterface { static abstract T AbstractMember { get; } static virtual string VirtualMember => """"; } -#endif -"); +"; + await new VerifyCS.Test + { + LanguageVersion = CodeAnalysis.CSharp.LanguageVersion.CSharp11, + TestState = + { + Sources = { code } + }, + ExpectedDiagnostics = + { + // Warnings requiring .NET 7+ + DiagnosticResult.CompilerError("CS8919").WithSpan(4, 40, 4, 43), + DiagnosticResult.CompilerError("CS8919").WithSpan(6, 44, 6, 46), + } + }.RunAsync(); } private static DiagnosticResult GetCSharpResultAt(int line, int column) From 9358402645832f4dc24fb73a7f1b8774a5fd3cb8 Mon Sep 17 00:00:00 2001 From: Michael Render Date: Mon, 15 Jan 2024 23:52:39 -0500 Subject: [PATCH 7/7] Specify .NET 6 --- .../DoNotDeclareStaticMembersOnGenericTypesTests.cs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs b/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs index 34b59eb7f1..a6ab41cc60 100644 --- a/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs +++ b/src/NetAnalyzers/UnitTests/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/DoNotDeclareStaticMembersOnGenericTypesTests.cs @@ -444,13 +444,8 @@ public interface ITestInterface LanguageVersion = CodeAnalysis.CSharp.LanguageVersion.CSharp11, TestState = { - Sources = { code } - }, - ExpectedDiagnostics = - { - // Warnings requiring .NET 7+ - DiagnosticResult.CompilerError("CS8919").WithSpan(4, 40, 4, 43), - DiagnosticResult.CompilerError("CS8919").WithSpan(6, 44, 6, 46), + Sources = { code }, + ReferenceAssemblies = ReferenceAssemblies.Net.Net60 } }.RunAsync(); }