From 6407b0e10663040bab29bb7b491886322b3b2fae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20St=C3=BChmer?= Date: Tue, 4 Aug 2026 22:00:34 +0200 Subject: [PATCH 1/2] feat(analyzer): build the analyzer against four Roslyn API versions Splits NetEvolve.Defaults.Analyzer.csproj into a packaging-only shell and four Roslyn-version-specific sibling projects (4.4.0, 4.7.0, 4.14.0, 5.6.0), sharing their compile settings via NetEvolve.Defaults.Analyzer.Build.props. Each variant is packed into a version-qualified analyzers/dotnet/roslynX.Y/cs folder, matching the versioned analyzer layout supported by the .NET SDK (8.0.400+). The unit test project now compiles against the Roslyn5_6 variant, since the packaging shell no longer contains any compilable source. --- Defaults.slnx | 4 ++ .../IsPackableProjectDiagnosticAnalyzer.cs | 6 +- .../OldProjectSupportDiagnosticAnalyzer.cs | 2 +- .../NetEvolve.Defaults.Analyzer.Build.props | 57 +++++++++++++++++++ ...Evolve.Defaults.Analyzer.Roslyn4_14.csproj | 12 ++++ ...tEvolve.Defaults.Analyzer.Roslyn4_4.csproj | 13 +++++ ...tEvolve.Defaults.Analyzer.Roslyn4_7.csproj | 12 ++++ ...tEvolve.Defaults.Analyzer.Roslyn5_6.csproj | 14 +++++ .../NetEvolve.Defaults.Analyzer.csproj | 45 ++++++++------- ...Evolve.Defaults.Analyzer.Tests.Unit.csproj | 2 +- 10 files changed, 142 insertions(+), 25 deletions(-) create mode 100644 src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.Build.props create mode 100644 src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.Roslyn4_14.csproj create mode 100644 src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.Roslyn4_4.csproj create mode 100644 src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.Roslyn4_7.csproj create mode 100644 src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.Roslyn5_6.csproj diff --git a/Defaults.slnx b/Defaults.slnx index 647bb0c..7ec36b4 100644 --- a/Defaults.slnx +++ b/Defaults.slnx @@ -18,6 +18,10 @@ + + + + diff --git a/src/NetEvolve.Defaults.Analyzer/Diagnostics/IsPackableProjectDiagnosticAnalyzer.cs b/src/NetEvolve.Defaults.Analyzer/Diagnostics/IsPackableProjectDiagnosticAnalyzer.cs index 9e1c32f..d509d9a 100644 --- a/src/NetEvolve.Defaults.Analyzer/Diagnostics/IsPackableProjectDiagnosticAnalyzer.cs +++ b/src/NetEvolve.Defaults.Analyzer/Diagnostics/IsPackableProjectDiagnosticAnalyzer.cs @@ -51,7 +51,7 @@ internal sealed class IsPackableProjectDiagnosticAnalyzer : DiagnosticAnalyzer ); public override ImmutableArray SupportedDiagnostics => - [ + ImmutableArray.Create( _ruleNED0001, _ruleNED0002, _ruleNED0003, @@ -60,8 +60,8 @@ internal sealed class IsPackableProjectDiagnosticAnalyzer : DiagnosticAnalyzer _ruleNED0006, _ruleNED0007, _ruleNED0008, - _ruleNED0009, - ]; + _ruleNED0009 + ); public override void Initialize(AnalysisContext context) { diff --git a/src/NetEvolve.Defaults.Analyzer/Diagnostics/OldProjectSupportDiagnosticAnalyzer.cs b/src/NetEvolve.Defaults.Analyzer/Diagnostics/OldProjectSupportDiagnosticAnalyzer.cs index 00e42aa..a1c5246 100644 --- a/src/NetEvolve.Defaults.Analyzer/Diagnostics/OldProjectSupportDiagnosticAnalyzer.cs +++ b/src/NetEvolve.Defaults.Analyzer/Diagnostics/OldProjectSupportDiagnosticAnalyzer.cs @@ -15,7 +15,7 @@ internal sealed class OldProjectSupportDiagnosticAnalyzer : DiagnosticAnalyzer customTags: WellKnownDiagnosticTags.CompilationEnd ); - public override ImmutableArray SupportedDiagnostics => [_ruleOLD0001]; + public override ImmutableArray SupportedDiagnostics => ImmutableArray.Create(_ruleOLD0001); public override void Initialize(AnalysisContext context) { diff --git a/src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.Build.props b/src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.Build.props new file mode 100644 index 0000000..ead23f2 --- /dev/null +++ b/src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.Build.props @@ -0,0 +1,57 @@ + + + + netstandard2.0 + NetEvolve.Defaults.Analyzer + NetEvolve.Defaults.Analyzer + latest + enable + enable + true + true + false + en + + NetEvolve.Defaults.Analyzer provides several diagnostic analyzers, to improve the nuget package quality and consistency. + + $(NoWarn);RS1036 + + + + + + + + + + + + + + + + + + + + True + True + Strings.resx + + + ResXFileCodeGenerator + Strings.Designer.cs + + + + + + + + diff --git a/src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.Roslyn4_14.csproj b/src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.Roslyn4_14.csproj new file mode 100644 index 0000000..f58b268 --- /dev/null +++ b/src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.Roslyn4_14.csproj @@ -0,0 +1,12 @@ + + + 4.14.0 + + + obj\$(MSBuildProjectName)\ + bin\$(MSBuildProjectName)\ + + + + + diff --git a/src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.Roslyn4_4.csproj b/src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.Roslyn4_4.csproj new file mode 100644 index 0000000..70d323f --- /dev/null +++ b/src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.Roslyn4_4.csproj @@ -0,0 +1,13 @@ + + + + 4.4.0 + + + obj\$(MSBuildProjectName)\ + bin\$(MSBuildProjectName)\ + + + + + diff --git a/src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.Roslyn4_7.csproj b/src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.Roslyn4_7.csproj new file mode 100644 index 0000000..5ac5ca4 --- /dev/null +++ b/src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.Roslyn4_7.csproj @@ -0,0 +1,12 @@ + + + 4.7.0 + + + obj\$(MSBuildProjectName)\ + bin\$(MSBuildProjectName)\ + + + + + diff --git a/src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.Roslyn5_6.csproj b/src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.Roslyn5_6.csproj new file mode 100644 index 0000000..0ce6fe3 --- /dev/null +++ b/src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.Roslyn5_6.csproj @@ -0,0 +1,14 @@ + + + + 5.6.0 + + + obj\$(MSBuildProjectName)\ + bin\$(MSBuildProjectName)\ + + + + + diff --git a/src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.csproj b/src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.csproj index 5fbd1d5..c06b765 100644 --- a/src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.csproj +++ b/src/NetEvolve.Defaults.Analyzer/NetEvolve.Defaults.Analyzer.csproj @@ -8,7 +8,7 @@ en true - true + true false true true @@ -18,34 +18,39 @@ $(TargetsForTfmSpecificContentInPackage);_AddAnalyzersToOutput NetEvolve.Defaults + + + - - - - - - - True - True - Strings.resx - - - ResXFileCodeGenerator - Strings.Designer.cs - - - - - + + + + + - + + + + diff --git a/tests/NetEvolve.Defaults.Analyzer.Tests.Unit/NetEvolve.Defaults.Analyzer.Tests.Unit.csproj b/tests/NetEvolve.Defaults.Analyzer.Tests.Unit/NetEvolve.Defaults.Analyzer.Tests.Unit.csproj index 6566497..6d7679a 100644 --- a/tests/NetEvolve.Defaults.Analyzer.Tests.Unit/NetEvolve.Defaults.Analyzer.Tests.Unit.csproj +++ b/tests/NetEvolve.Defaults.Analyzer.Tests.Unit/NetEvolve.Defaults.Analyzer.Tests.Unit.csproj @@ -15,6 +15,6 @@ - + From 0e883019dafd1dc39b815f1ed0a773713466c4a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20St=C3=BChmer?= Date: Tue, 4 Aug 2026 22:07:55 +0200 Subject: [PATCH 2/2] test(analyzer): run the analyzer unit tests against three Roslyn variants Multi-targets the unit test project across net8.0/net9.0/net10.0 and maps each target framework to a different Roslyn variant project (4.7.0, 4.14.0, 5.6.0 respectively), so the analyzer is actually exercised against multiple Roslyn API versions instead of only the latest one. The 4.4.0 variant stays build-verified only, same as its baseline fallback role in the Build.props. --- ...NetEvolve.Defaults.Analyzer.Tests.Unit.csproj | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/tests/NetEvolve.Defaults.Analyzer.Tests.Unit/NetEvolve.Defaults.Analyzer.Tests.Unit.csproj b/tests/NetEvolve.Defaults.Analyzer.Tests.Unit/NetEvolve.Defaults.Analyzer.Tests.Unit.csproj index 6d7679a..cf1bc51 100644 --- a/tests/NetEvolve.Defaults.Analyzer.Tests.Unit/NetEvolve.Defaults.Analyzer.Tests.Unit.csproj +++ b/tests/NetEvolve.Defaults.Analyzer.Tests.Unit/NetEvolve.Defaults.Analyzer.Tests.Unit.csproj @@ -1,12 +1,22 @@ - $(NetEvolve_TestTargetFrameworks) + net8.0;net9.0;net10.0 enable enable $(NoWarn);VSTHRD200; + + <_RoslynVariant>4_4 + <_RoslynApiVersion>4.4.* + <_RoslynVariant Condition=" '$(TargetFramework)' == 'net8.0' ">4_7 + <_RoslynApiVersion Condition=" '$(TargetFramework)' == 'net8.0' ">4.7.* + <_RoslynVariant Condition=" '$(TargetFramework)' == 'net9.0' ">4_14 + <_RoslynApiVersion Condition=" '$(TargetFramework)' == 'net9.0' ">4.14.* + <_RoslynVariant Condition=" '$(TargetFramework)' == 'net10.0' ">5_6 + <_RoslynApiVersion Condition=" '$(TargetFramework)' == 'net10.0' ">5.6.* + - + @@ -15,6 +25,6 @@ - +