From e40ab1f4ba206ef415bb1764ab2a5babc0d28479 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Hellander?= Date: Sun, 26 Mar 2023 09:35:09 +0200 Subject: [PATCH] Update SA1206 to handle c# 11 modifier "required" #3527 --- .../SA1206CSharp11CodeFixProviderUnitTests.cs | 32 +++++++++++++++++++ .../Verifiers/GenericAnalyzerTest.cs | 17 ++++------ .../Helpers/ModifierOrderHelper.cs | 1 + .../Lightup/SyntaxKindEx.cs | 1 + 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp11/OrderingRules/SA1206CSharp11CodeFixProviderUnitTests.cs b/StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp11/OrderingRules/SA1206CSharp11CodeFixProviderUnitTests.cs index 3f462b134..53cefd548 100644 --- a/StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp11/OrderingRules/SA1206CSharp11CodeFixProviderUnitTests.cs +++ b/StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp11/OrderingRules/SA1206CSharp11CodeFixProviderUnitTests.cs @@ -6,6 +6,7 @@ namespace StyleCop.Analyzers.Test.CSharp11.OrderingRules using System.Threading; using System.Threading.Tasks; using StyleCop.Analyzers.Test.CSharp10.OrderingRules; + using StyleCop.Analyzers.Test.Verifiers; using Xunit; using static StyleCop.Analyzers.Test.Verifiers.StyleCopCodeFixVerifier< StyleCop.Analyzers.OrderingRules.SA1206DeclarationKeywordsMustFollowOrder, @@ -23,5 +24,36 @@ public async Task VerifyFileKeywordReorderingInClassDeclarationAsync() var expected = Diagnostic().WithLocation(0).WithArguments("file", "unsafe"); await VerifyCSharpFixAsync(testCode, expected, fixedTestCode, CancellationToken.None).ConfigureAwait(false); } + + [Fact] + [WorkItem(3527, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3527")] + public async Task VerifyRequiredKeywordReorderingInPropertiesAndFieldsAsync() + { + var testCode = @" +internal struct SomeStruct +{ + required {|#0:public|} int Prop { get; set; } + required {|#1:public|} int Field; +}"; + + var fixedCode = @" +internal struct SomeStruct +{ + public required int Prop { get; set; } + public required int Field; +}"; + + await new CSharpTest() + { + ReferenceAssemblies = GenericAnalyzerTest.ReferenceAssembliesNet70, + TestCode = testCode, + FixedCode = fixedCode, + ExpectedDiagnostics = + { + Diagnostic().WithLocation(0).WithArguments("public", "required"), + Diagnostic().WithLocation(1).WithArguments("public", "required"), + }, + }.RunAsync(CancellationToken.None).ConfigureAwait(false); + } } } diff --git a/StyleCop.Analyzers/StyleCop.Analyzers.Test/Verifiers/GenericAnalyzerTest.cs b/StyleCop.Analyzers/StyleCop.Analyzers.Test/Verifiers/GenericAnalyzerTest.cs index 814092bc0..d3cd7a567 100644 --- a/StyleCop.Analyzers/StyleCop.Analyzers.Test/Verifiers/GenericAnalyzerTest.cs +++ b/StyleCop.Analyzers/StyleCop.Analyzers.Test/Verifiers/GenericAnalyzerTest.cs @@ -7,7 +7,6 @@ namespace StyleCop.Analyzers.Test.Verifiers { using System; using System.Collections.Immutable; - using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis; @@ -23,6 +22,8 @@ internal static class GenericAnalyzerTest internal static readonly ReferenceAssemblies ReferenceAssembliesNet60; + internal static readonly ReferenceAssemblies ReferenceAssembliesNet70; + private static readonly Lazy ExportProviderFactory; static GenericAnalyzerTest() @@ -44,15 +45,11 @@ static GenericAnalyzerTest() ReferenceAssembliesNet50 = ReferenceAssemblies.Net.Net50.AddPackages(ImmutableArray.Create( new PackageIdentity("Microsoft.CodeAnalysis.CSharp", codeAnalysisTestVersion))); - ReferenceAssembliesNet60 = - new ReferenceAssemblies( - "net6.0", - new PackageIdentity( - "Microsoft.NETCore.App.Ref", - "6.0.0"), - Path.Combine("ref", "net6.0")) - .AddPackages(ImmutableArray.Create( - new PackageIdentity("Microsoft.CodeAnalysis.CSharp", codeAnalysisTestVersion))); + ReferenceAssembliesNet60 = ReferenceAssemblies.Net.Net60.AddPackages(ImmutableArray.Create( + new PackageIdentity("Microsoft.CodeAnalysis.CSharp", codeAnalysisTestVersion))); + + ReferenceAssembliesNet70 = ReferenceAssemblies.Net.Net70.AddPackages(ImmutableArray.Create( + new PackageIdentity("Microsoft.CodeAnalysis.CSharp", codeAnalysisTestVersion))); ExportProviderFactory = new Lazy( () => diff --git a/StyleCop.Analyzers/StyleCop.Analyzers/Helpers/ModifierOrderHelper.cs b/StyleCop.Analyzers/StyleCop.Analyzers/Helpers/ModifierOrderHelper.cs index 9992daa59..d4f3f39a4 100644 --- a/StyleCop.Analyzers/StyleCop.Analyzers/Helpers/ModifierOrderHelper.cs +++ b/StyleCop.Analyzers/StyleCop.Analyzers/Helpers/ModifierOrderHelper.cs @@ -69,6 +69,7 @@ internal static ModifierType GetModifierType(SyntaxToken modifier) case SyntaxKind.AsyncKeyword: case SyntaxKind.PartialKeyword: case SyntaxKind.RefKeyword: + case SyntaxKindEx.RequiredKeyword: result = ModifierType.Other; break; } diff --git a/StyleCop.Analyzers/StyleCop.Analyzers/Lightup/SyntaxKindEx.cs b/StyleCop.Analyzers/StyleCop.Analyzers/Lightup/SyntaxKindEx.cs index e0d65e7a7..677453d6f 100644 --- a/StyleCop.Analyzers/StyleCop.Analyzers/Lightup/SyntaxKindEx.cs +++ b/StyleCop.Analyzers/StyleCop.Analyzers/Lightup/SyntaxKindEx.cs @@ -14,6 +14,7 @@ internal static class SyntaxKindEx public const SyntaxKind NotKeyword = (SyntaxKind)8440; public const SyntaxKind ManagedKeyword = (SyntaxKind)8445; public const SyntaxKind UnmanagedKeyword = (SyntaxKind)8446; + public const SyntaxKind RequiredKeyword = (SyntaxKind)8447; public const SyntaxKind FileKeyword = (SyntaxKind)8449; public const SyntaxKind NullableKeyword = (SyntaxKind)8486; public const SyntaxKind EnableKeyword = (SyntaxKind)8487;