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/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/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); 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); 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 @@  - +