From cdb49d04dccc6b3d1b12ae2d5ba44a138fe2b2e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20St=C3=BChmer?= Date: Tue, 4 Aug 2026 17:41:16 +0200 Subject: [PATCH 1/4] feat: add NetEvolve.Analyzer as recommended global package Registers NetEvolve.Analyzer as a global package reference and adds it to the list of recommended analyzers surfaced for projects missing analyzer packages. --- Directory.Packages.props | 1 + .../buildMultiTargeting/SupportMissingAnalyzers.targets | 1 + 2 files changed, 2 insertions(+) diff --git a/Directory.Packages.props b/Directory.Packages.props index 5d34a6b..6b15dd9 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -10,6 +10,7 @@ + diff --git a/src/NetEvolve.Defaults/buildMultiTargeting/SupportMissingAnalyzers.targets b/src/NetEvolve.Defaults/buildMultiTargeting/SupportMissingAnalyzers.targets index b811641..b0a6c3a 100644 --- a/src/NetEvolve.Defaults/buildMultiTargeting/SupportMissingAnalyzers.targets +++ b/src/NetEvolve.Defaults/buildMultiTargeting/SupportMissingAnalyzers.targets @@ -4,6 +4,7 @@ + From 21071dd99cedc8c763d2859839c95cec02467bc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20St=C3=BChmer?= Date: Tue, 4 Aug 2026 22:23:08 +0200 Subject: [PATCH 2/4] chore(deps): update netevolve.analyzer to 0.14.1 --- Directory.Packages.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 6b15dd9..8e824c4 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -10,7 +10,7 @@ - + From 6f106a37a3934141a58d997b8a5748c20ececdbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20St=C3=BChmer?= Date: Tue, 4 Aug 2026 22:40:57 +0200 Subject: [PATCH 3/4] test: update assertions in SupportMissingAnalyzersTests for consistency --- .../SupportMissingAnalyzersTests.cs | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/tests/NetEvolve.Defaults.Tests.Unit/SupportMissingAnalyzersTests.cs b/tests/NetEvolve.Defaults.Tests.Unit/SupportMissingAnalyzersTests.cs index 97024a6..baf7f7c 100644 --- a/tests/NetEvolve.Defaults.Tests.Unit/SupportMissingAnalyzersTests.cs +++ b/tests/NetEvolve.Defaults.Tests.Unit/SupportMissingAnalyzersTests.cs @@ -13,17 +13,18 @@ public async Task RecommendedPackage_ContainsExpectedFixedList() var recommended = evaluated.GetItemIncludes("RecommendedPackage"); - await Assert.That(recommended).Contains("Meziantou.Analyzer"); - await Assert.That(recommended).Contains("Microsoft.CodeAnalysis.BannedApiAnalyzers"); - await Assert.That(recommended).Contains("Microsoft.CodeAnalysis.NetAnalyzers"); - await Assert.That(recommended).Contains("Microsoft.VisualStudio.Threading.Analyzers"); - await Assert.That(recommended).Contains("NetEvolve.Defaults"); - await Assert.That(recommended).Contains("Roslynator.Analyzers"); - await Assert.That(recommended).Contains("Roslynator.Formatting.Analyzers"); - await Assert.That(recommended).Contains("Roslynator.CodeAnalysis.Analyzers"); - await Assert.That(recommended).Contains("Roslynator.CodeFixes"); - await Assert.That(recommended).Contains("Roslynator.Refactorings"); - await Assert.That(recommended).Contains("SonarAnalyzer.CSharp"); - await Assert.That(recommended.Count).IsEqualTo(11); + _ = await Assert.That(recommended).Contains("Meziantou.Analyzer"); + _ = await Assert.That(recommended).Contains("Microsoft.CodeAnalysis.BannedApiAnalyzers"); + _ = await Assert.That(recommended).Contains("Microsoft.CodeAnalysis.NetAnalyzers"); + _ = await Assert.That(recommended).Contains("Microsoft.VisualStudio.Threading.Analyzers"); + _ = await Assert.That(recommended).Contains("NetEvolve.Analyzer"); + _ = await Assert.That(recommended).Contains("NetEvolve.Defaults"); + _ = await Assert.That(recommended).Contains("Roslynator.Analyzers"); + _ = await Assert.That(recommended).Contains("Roslynator.Formatting.Analyzers"); + _ = await Assert.That(recommended).Contains("Roslynator.CodeAnalysis.Analyzers"); + _ = await Assert.That(recommended).Contains("Roslynator.CodeFixes"); + _ = await Assert.That(recommended).Contains("Roslynator.Refactorings"); + _ = await Assert.That(recommended).Contains("SonarAnalyzer.CSharp"); + _ = await Assert.That(recommended.Count).IsEqualTo(12); } } From c20be89e8f2df1ca321ac94ed88709998355a9e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20St=C3=BChmer?= Date: Tue, 4 Aug 2026 23:34:48 +0200 Subject: [PATCH 4/4] chore(deps): update netevolve.analyzer to 0.14.2 Also thread a CancellationToken through AnalyzerTestHelper.GetDiagnosticsAsync to satisfy the updated analyzer's async lifetime rule. --- Directory.Packages.props | 2 +- .../AnalyzerTestHelper.cs | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 8e824c4..14928d3 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -10,7 +10,7 @@ - + diff --git a/tests/NetEvolve.Defaults.Analyzer.Tests.Unit/AnalyzerTestHelper.cs b/tests/NetEvolve.Defaults.Analyzer.Tests.Unit/AnalyzerTestHelper.cs index d5024f0..12fd3b6 100644 --- a/tests/NetEvolve.Defaults.Analyzer.Tests.Unit/AnalyzerTestHelper.cs +++ b/tests/NetEvolve.Defaults.Analyzer.Tests.Unit/AnalyzerTestHelper.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; +using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; @@ -16,10 +17,13 @@ internal static class AnalyzerTestHelper internal static async Task> GetDiagnosticsAsync( DiagnosticAnalyzer analyzer, IReadOnlyDictionary? globalOptions = null, - string source = DefaultSource + string source = DefaultSource, + CancellationToken cancellationToken = default ) { - var syntaxTree = CSharpSyntaxTree.ParseText(source); + cancellationToken.ThrowIfCancellationRequested(); + + var syntaxTree = CSharpSyntaxTree.ParseText(source, cancellationToken: cancellationToken); var compilation = CSharpCompilation.Create( "AnalyzerTestAssembly", [syntaxTree], @@ -32,11 +36,11 @@ internal static async Task> GetDiagnosticsAsync( ); var analyzerOptions = new AnalyzerOptions([], optionsProvider); +#pragma warning disable S8949 // The overload accepting a 'CancellationToken' should be used var withAnalyzers = compilation.WithAnalyzers([analyzer], analyzerOptions); +#pragma warning restore S8949 // The overload accepting a 'CancellationToken' should be used - var diagnostics = await withAnalyzers.GetAnalyzerDiagnosticsAsync().ConfigureAwait(false); - - return diagnostics; + return await withAnalyzers.GetAnalyzerDiagnosticsAsync(cancellationToken).ConfigureAwait(false); } private sealed class TestAnalyzerConfigOptionsProvider(AnalyzerConfigOptions globalOptions)