From 3e805aa93497d436a27572d1cde3de985a4b0eb6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 6 Aug 2026 06:01:03 +0000 Subject: [PATCH 1/3] chore(deps): update all dependencies --- .github/workflows/ci.yml | 22 +++++++++---------- .github/workflows/copilot-setup-steps.yml | 4 ++-- global.json | 8 +++---- .../Meziantou.Analyzer.Test.csproj | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 51899c6c..e78e5433 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,8 +32,8 @@ jobs: check_documentation: runs-on: ubuntu-latest steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 - - uses: actions/setup-dotnet@9a946fdbd5fb07b82b2f5a4466058b876ab72bb2 # v5 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + - uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6 - run: dotnet run --project src/DocumentationGenerator/DocumentationGenerator.csproj - run: git status if: failure() @@ -60,9 +60,9 @@ jobs: env: RepositoryBranch: ${{github.ref}} steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Setup .NET Core - uses: actions/setup-dotnet@9a946fdbd5fb07b82b2f5a4466058b876ab72bb2 # v5 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6 - run: dotnet run --project src/ListDotNetTypes/ListDotNetTypes.csproj -- src/Meziantou.Analyzer/Resources/ @@ -101,9 +101,9 @@ jobs: runs-on: ubuntu-latest needs: [ create_nuget ] steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Setup .NET Core (global.json) - uses: actions/setup-dotnet@9a946fdbd5fb07b82b2f5a4466058b876ab72bb2 # v5 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6 - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8 with: name: nuget @@ -134,9 +134,9 @@ jobs: roslyn-version: [ 'roslyn4.8', 'roslyn4.14', 'roslyn5.0', 'roslyn5.6', 'default' ] fail-fast: false steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Setup .NET Core (global.json) - uses: actions/setup-dotnet@9a946fdbd5fb07b82b2f5a4466058b876ab72bb2 # v5 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6 - run: dotnet test --configuration ${{ matrix.configuration }} --results-directory "${{ env.TestResultsDirectory }}" /p:RoslynVersion=${{ matrix.roslyn-version}} name: Run tests - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 @@ -154,7 +154,7 @@ jobs: contents: read id-token: write steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: fetch-depth: 2 - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8 @@ -162,7 +162,7 @@ jobs: name: nuget path: ${{ env.NuGetDirectory }} - name: Setup .NET Core - uses: actions/setup-dotnet@9a946fdbd5fb07b82b2f5a4466058b876ab72bb2 # v5 + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6 - name: NuGet login (OIDC → temp API key) if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository uses: NuGet/login@8d196754b4036150537f80ac539e15c2f1028841 # v1 @@ -197,7 +197,7 @@ jobs: permissions: contents: write steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - run: 'gh release create "${{ needs.compute_package_version.outputs.package_version }}" --generate-notes --notes "NuGet package: "' env: GH_TOKEN: ${{ github.token }} diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml index 76673ad4..081626e5 100644 --- a/.github/workflows/copilot-setup-steps.yml +++ b/.github/workflows/copilot-setup-steps.yml @@ -19,8 +19,8 @@ jobs: contents: read steps: - - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 - - uses: actions/setup-dotnet@9a946fdbd5fb07b82b2f5a4466058b876ab72bb2 # v5 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + - uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6 with: global-json-file: './global.json' diff --git a/global.json b/global.json index 7a9e541f..a905f0ca 100644 --- a/global.json +++ b/global.json @@ -1,11 +1,11 @@ { "sdk": { - "version": "10.0.301", + "version": "10.0.302", "rollForward": "latestPatch" }, "msbuild-sdks": { - "Meziantou.NET.Sdk": "1.0.127", - "Meziantou.NET.Sdk.Test": "1.0.127", - "Meziantou.NET.Sdk.Web": "1.0.127" + "Meziantou.NET.Sdk": "1.0.129", + "Meziantou.NET.Sdk.Test": "1.0.129", + "Meziantou.NET.Sdk.Web": "1.0.129" } } diff --git a/tests/Meziantou.Analyzer.Test/Meziantou.Analyzer.Test.csproj b/tests/Meziantou.Analyzer.Test/Meziantou.Analyzer.Test.csproj index ac3e9731..514e4259 100644 --- a/tests/Meziantou.Analyzer.Test/Meziantou.Analyzer.Test.csproj +++ b/tests/Meziantou.Analyzer.Test/Meziantou.Analyzer.Test.csproj @@ -1,7 +1,7 @@  - + From 672b807220c86d5c6c0ffdfb4332d4303a3668dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9rald=20Barr=C3=A9?= Date: Fri, 7 Aug 2026 07:49:33 -0400 Subject: [PATCH 2/3] refactor: use StringComparer.Ordinal for ImmutableDictionary creation --- .../Rules/AvoidComparisonWithBoolConstantAnalyzer.cs | 2 +- src/Meziantou.Analyzer/Rules/OptimizeLinqUsageAnalyzer.cs | 8 ++++---- .../Rules/OptimizeStringBuilderUsageAnalyzer.cs | 2 +- .../UseAnOverloadThatHasCancellationTokenAnalyzer.cs | 2 +- .../Rules/UseAnOverloadThatHasTimeProviderAnalyzer.cs | 2 +- .../Rules/ValidateArgumentsCorrectlyAnalyzer.cs | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Meziantou.Analyzer/Rules/AvoidComparisonWithBoolConstantAnalyzer.cs b/src/Meziantou.Analyzer/Rules/AvoidComparisonWithBoolConstantAnalyzer.cs index 1a63feb5..7e1a967c 100644 --- a/src/Meziantou.Analyzer/Rules/AvoidComparisonWithBoolConstantAnalyzer.cs +++ b/src/Meziantou.Analyzer/Rules/AvoidComparisonWithBoolConstantAnalyzer.cs @@ -73,7 +73,7 @@ private static void AnalyzeBinaryOperation(OperationAnalysisContext context) binaryOperation.OperatorKind == BinaryOperatorKind.NotEquals : binaryOperation.OperatorKind == BinaryOperatorKind.Equals; - var properties = ImmutableDictionary.Create() + var properties = ImmutableDictionary.Create(StringComparer.Ordinal) .Add("NodeToKeepSpanStart", nodeToKeep.Syntax.Span.Start.ToString(CultureInfo.InvariantCulture)) .Add("NodeToKeepSpanLength", nodeToKeep.Syntax.Span.Length.ToString(CultureInfo.InvariantCulture)) .Add("LogicalNotOperatorNeeded", logicalNotOperatorNeeded.ToString()); diff --git a/src/Meziantou.Analyzer/Rules/OptimizeLinqUsageAnalyzer.cs b/src/Meziantou.Analyzer/Rules/OptimizeLinqUsageAnalyzer.cs index 12181af9..ed711706 100755 --- a/src/Meziantou.Analyzer/Rules/OptimizeLinqUsageAnalyzer.cs +++ b/src/Meziantou.Analyzer/Rules/OptimizeLinqUsageAnalyzer.cs @@ -191,14 +191,14 @@ public void AnalyzeInvocation(OperationAnalysisContext context) private static ImmutableDictionary CreateProperties(OptimizeLinqUsageData data) { - var builder = ImmutableDictionary.CreateBuilder(); + var builder = ImmutableDictionary.CreateBuilder(StringComparer.Ordinal); builder.Add("Data", data.ToString()); return builder.ToImmutable(); } private static ImmutableDictionary CreateLinqChainProperties(OptimizeLinqUsageData data, IInvocationOperation firstOperation, IInvocationOperation lastOperation, string methodName) { - var builder = ImmutableDictionary.CreateBuilder(); + var builder = ImmutableDictionary.CreateBuilder(StringComparer.Ordinal); builder.Add("Data", data.ToString()); builder.Add("FirstOperationStart", firstOperation.Syntax.Span.Start.ToString(CultureInfo.InvariantCulture)); builder.Add("FirstOperationLength", firstOperation.Syntax.Span.Length.ToString(CultureInfo.InvariantCulture)); @@ -210,7 +210,7 @@ public void AnalyzeInvocation(OperationAnalysisContext context) private static ImmutableDictionary CreateSingleOperationProperties(OptimizeLinqUsageData data, IInvocationOperation operation) { - var builder = ImmutableDictionary.CreateBuilder(); + var builder = ImmutableDictionary.CreateBuilder(StringComparer.Ordinal); builder.Add("Data", data.ToString()); builder.Add("FirstOperationStart", operation.Syntax.Span.Start.ToString(CultureInfo.InvariantCulture)); builder.Add("FirstOperationLength", operation.Syntax.Span.Length.ToString(CultureInfo.InvariantCulture)); @@ -219,7 +219,7 @@ public void AnalyzeInvocation(OperationAnalysisContext context) private static ImmutableDictionary CreateDuplicateOrderByProperties(OptimizeLinqUsageData data, IInvocationOperation firstOperation, IInvocationOperation lastOperation, string expectedMethodName, string methodName) { - var builder = ImmutableDictionary.CreateBuilder(); + var builder = ImmutableDictionary.CreateBuilder(StringComparer.Ordinal); builder.Add("Data", data.ToString()); builder.Add("FirstOperationStart", firstOperation.Syntax.Span.Start.ToString(CultureInfo.InvariantCulture)); builder.Add("FirstOperationLength", firstOperation.Syntax.Span.Length.ToString(CultureInfo.InvariantCulture)); diff --git a/src/Meziantou.Analyzer/Rules/OptimizeStringBuilderUsageAnalyzer.cs b/src/Meziantou.Analyzer/Rules/OptimizeStringBuilderUsageAnalyzer.cs index edde5900..f43d10ea 100644 --- a/src/Meziantou.Analyzer/Rules/OptimizeStringBuilderUsageAnalyzer.cs +++ b/src/Meziantou.Analyzer/Rules/OptimizeStringBuilderUsageAnalyzer.cs @@ -116,7 +116,7 @@ public void Analyze(OperationAnalysisContext context) private static ImmutableDictionary CreateProperties(OptimizeStringBuilderUsageData data) { - return ImmutableDictionary.Create().Add("Data", data.ToString()); + return ImmutableDictionary.Create(StringComparer.Ordinal).Add("Data", data.ToString()); } private void AnalyzeAppendFormat(OperationAnalysisContext context, IInvocationOperation operation) diff --git a/src/Meziantou.Analyzer/Rules/UseAnOverloadThatHasCancellationTokenAnalyzer.cs b/src/Meziantou.Analyzer/Rules/UseAnOverloadThatHasCancellationTokenAnalyzer.cs index bbbe578d..5f424d50 100644 --- a/src/Meziantou.Analyzer/Rules/UseAnOverloadThatHasCancellationTokenAnalyzer.cs +++ b/src/Meziantou.Analyzer/Rules/UseAnOverloadThatHasCancellationTokenAnalyzer.cs @@ -233,7 +233,7 @@ public void AnalyzeLoop(OperationAnalysisContext context) private static ImmutableDictionary CreateProperties(string[] cancellationTokens, AdditionalParameterInfo parameterInfo) { - return ImmutableDictionary.Create() + return ImmutableDictionary.Create(StringComparer.Ordinal) .Add("ParameterIndex", parameterInfo.ParameterIndex.ToString(CultureInfo.InvariantCulture)) .Add("ParameterName", parameterInfo.Name) .Add("ParameterIsEnumeratorCancellation", parameterInfo.HasEnumeratorCancellationAttribute.ToString()) diff --git a/src/Meziantou.Analyzer/Rules/UseAnOverloadThatHasTimeProviderAnalyzer.cs b/src/Meziantou.Analyzer/Rules/UseAnOverloadThatHasTimeProviderAnalyzer.cs index 307f6a70..c129c7bc 100644 --- a/src/Meziantou.Analyzer/Rules/UseAnOverloadThatHasTimeProviderAnalyzer.cs +++ b/src/Meziantou.Analyzer/Rules/UseAnOverloadThatHasTimeProviderAnalyzer.cs @@ -134,7 +134,7 @@ public void AnalyzeInvocation(OperationAnalysisContext context) private static ImmutableDictionary CreateProperties(string[] cancellationTokens, AdditionalParameterInfo parameterInfo) { - return ImmutableDictionary.Create() + return ImmutableDictionary.Create(StringComparer.Ordinal) .Add("ParameterIndex", parameterInfo.ParameterIndex.ToString(CultureInfo.InvariantCulture)) .Add("ParameterName", parameterInfo.Name) .Add("Paths", string.Join(',', cancellationTokens)); diff --git a/src/Meziantou.Analyzer/Rules/ValidateArgumentsCorrectlyAnalyzer.cs b/src/Meziantou.Analyzer/Rules/ValidateArgumentsCorrectlyAnalyzer.cs index 46d4160f..b47b4cd5 100755 --- a/src/Meziantou.Analyzer/Rules/ValidateArgumentsCorrectlyAnalyzer.cs +++ b/src/Meziantou.Analyzer/Rules/ValidateArgumentsCorrectlyAnalyzer.cs @@ -88,7 +88,7 @@ internal void AnalyzeMethodDeclaration(SyntaxNodeAnalysisContext context) if (lastThrowIndex is not null && firstYieldIndex is not null && lastThrowIndex < firstYieldIndex) { - var properties = ImmutableDictionary.Create() + var properties = ImmutableDictionary.Create(StringComparer.Ordinal) .Add("Index", lastThrowIndex.Value.ToString(CultureInfo.InvariantCulture)); context.ReportDiagnostic(Rule, properties, methodSymbol); From 4a7f4c0a1ca4edbe0892696f13277fb1f897ce00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9rald=20Barr=C3=A9?= Date: Fri, 7 Aug 2026 07:52:44 -0400 Subject: [PATCH 3/3] wip --- src/DocumentationGenerator/Program.cs | 8 ++++---- tests/Meziantou.Analyzer.Test/Helpers/ProjectBuilder.cs | 4 ++-- .../Helpers/TestAnalyzerConfigOptionsProvider.cs | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/DocumentationGenerator/Program.cs b/src/DocumentationGenerator/Program.cs index 152c6bdc..8d912256 100644 --- a/src/DocumentationGenerator/Program.cs +++ b/src/DocumentationGenerator/Program.cs @@ -263,7 +263,7 @@ static string GenerateRulesTable(List diagnosticAnalyzers, L sb.Append("|Id|Category|Description|Severity|Is enabled|Code fix|Configurable|\n"); sb.Append("|--|--------|-----------|:------:|:--------:|:------:|:----------:|\n"); - foreach (var diagnostic in diagnosticAnalyzers.SelectMany(diagnosticAnalyzer => diagnosticAnalyzer.SupportedDiagnostics).DistinctBy(diag => diag.Id).OrderBy(diag => diag.Id, StringComparer.Ordinal)) + foreach (var diagnostic in diagnosticAnalyzers.SelectMany(diagnosticAnalyzer => diagnosticAnalyzer.SupportedDiagnostics).DistinctBy(diag => diag.Id, StringComparer.Ordinal).OrderBy(diag => diag.Id, StringComparer.Ordinal)) { if (!diagnostic.HelpLinkUri.Contains(diagnostic.Id, StringComparison.Ordinal)) { @@ -329,7 +329,7 @@ static string GenerateSuppressorsTable(List diagnosticSupp sb.Append("|Id|Suppressed rule|Justification|\n"); sb.Append("|--|---------------|-------------|\n"); - foreach (var suppression in diagnosticSuppressors.SelectMany(diagnosticAnalyzer => diagnosticAnalyzer.SupportedSuppressions).DistinctBy(diag => diag.Id).OrderBy(diag => diag.Id, StringComparer.Ordinal)) + foreach (var suppression in diagnosticSuppressors.SelectMany(diagnosticAnalyzer => diagnosticAnalyzer.SupportedSuppressions).DistinctBy(diag => diag.Id, StringComparer.Ordinal).OrderBy(diag => diag.Id, StringComparer.Ordinal)) { sb.Append("|`") .Append(suppression.Id) @@ -394,7 +394,7 @@ static void GenerateEditorConfig(StringBuilder sb, List anal } var first = true; - foreach (var diagnostic in analyzers.SelectMany(diagnosticAnalyzer => diagnosticAnalyzer.SupportedDiagnostics).DistinctBy(diag => diag.Id).OrderBy(diag => diag.Id, StringComparer.Ordinal)) + foreach (var diagnostic in analyzers.SelectMany(diagnosticAnalyzer => diagnosticAnalyzer.SupportedDiagnostics).DistinctBy(diag => diag.Id, StringComparer.Ordinal).OrderBy(diag => diag.Id, StringComparer.Ordinal)) { if (!first) { @@ -488,7 +488,7 @@ static IReadOnlyDictionary> GetRuleConfigurationKe if (!result.TryGetValue(ruleId, out var keys)) { - keys = []; + keys = [with(StringComparer.Ordinal)]; result.Add(ruleId, keys); } diff --git a/tests/Meziantou.Analyzer.Test/Helpers/ProjectBuilder.cs b/tests/Meziantou.Analyzer.Test/Helpers/ProjectBuilder.cs index 2ab7578f..61f05826 100755 --- a/tests/Meziantou.Analyzer.Test/Helpers/ProjectBuilder.cs +++ b/tests/Meziantou.Analyzer.Test/Helpers/ProjectBuilder.cs @@ -372,14 +372,14 @@ public ProjectBuilder WithAnalyzerConfiguration(Dictionary confi public ProjectBuilder AddAnalyzerConfiguration(string key, string value) { - AnalyzerConfiguration ??= []; + AnalyzerConfiguration ??= [with(StringComparer.Ordinal)]; AnalyzerConfiguration[key] = value; return this; } public ProjectBuilder AddAdditionalFile(string path, string content) { - AdditionalFiles ??= []; + AdditionalFiles ??= [with(StringComparer.Ordinal)]; AdditionalFiles[path] = content; return this; } diff --git a/tests/Meziantou.Analyzer.Test/Helpers/TestAnalyzerConfigOptionsProvider.cs b/tests/Meziantou.Analyzer.Test/Helpers/TestAnalyzerConfigOptionsProvider.cs index 13598b4b..407bca50 100644 --- a/tests/Meziantou.Analyzer.Test/Helpers/TestAnalyzerConfigOptionsProvider.cs +++ b/tests/Meziantou.Analyzer.Test/Helpers/TestAnalyzerConfigOptionsProvider.cs @@ -5,7 +5,7 @@ namespace Meziantou.Analyzer.Test.Helpers; internal sealed class TestAnalyzerConfigOptionsProvider(Dictionary? values) : AnalyzerConfigOptionsProvider { - private readonly Dictionary _values = values ?? []; + private readonly Dictionary _values = values ?? [with(StringComparer.Ordinal)]; public override AnalyzerConfigOptions GlobalOptions => new TestAnalyzerConfigOptions(_values); public override AnalyzerConfigOptions GetOptions(SyntaxTree tree) => new TestAnalyzerConfigOptions(_values);