diff --git a/StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp11/OrderingRules/SA1206CSharp11CodeFixProviderUnitTests.cs b/StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp11/OrderingRules/SA1206CSharp11CodeFixProviderUnitTests.cs index b542f8de0..3f462b134 100644 --- a/StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp11/OrderingRules/SA1206CSharp11CodeFixProviderUnitTests.cs +++ b/StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp11/OrderingRules/SA1206CSharp11CodeFixProviderUnitTests.cs @@ -3,9 +3,25 @@ namespace StyleCop.Analyzers.Test.CSharp11.OrderingRules { + using System.Threading; + using System.Threading.Tasks; using StyleCop.Analyzers.Test.CSharp10.OrderingRules; + using Xunit; + using static StyleCop.Analyzers.Test.Verifiers.StyleCopCodeFixVerifier< + StyleCop.Analyzers.OrderingRules.SA1206DeclarationKeywordsMustFollowOrder, + StyleCop.Analyzers.OrderingRules.SA1206CodeFixProvider>; public class SA1206CSharp11CodeFixProviderUnitTests : SA1206CSharp10CodeFixProviderUnitTests { + [Fact] + [WorkItem(3589, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3589")] + public async Task VerifyFileKeywordReorderingInClassDeclarationAsync() + { + var testCode = $"static unsafe {{|#0:file|}} class TestClass {{}}"; + var fixedTestCode = $"file static unsafe class TestClass {{}}"; + + var expected = Diagnostic().WithLocation(0).WithArguments("file", "unsafe"); + await VerifyCSharpFixAsync(testCode, expected, fixedTestCode, CancellationToken.None).ConfigureAwait(false); + } } } diff --git a/StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp11/StyleCop.Analyzers.Test.CSharp11.csproj b/StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp11/StyleCop.Analyzers.Test.CSharp11.csproj index 42ff82649..7a51f08ac 100644 --- a/StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp11/StyleCop.Analyzers.Test.CSharp11.csproj +++ b/StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp11/StyleCop.Analyzers.Test.CSharp11.csproj @@ -17,7 +17,7 @@ - + diff --git a/StyleCop.Analyzers/StyleCop.Analyzers/Helpers/ModifierOrderHelper.cs b/StyleCop.Analyzers/StyleCop.Analyzers/Helpers/ModifierOrderHelper.cs index f73a68e33..9992daa59 100644 --- a/StyleCop.Analyzers/StyleCop.Analyzers/Helpers/ModifierOrderHelper.cs +++ b/StyleCop.Analyzers/StyleCop.Analyzers/Helpers/ModifierOrderHelper.cs @@ -7,6 +7,7 @@ namespace StyleCop.Analyzers.OrderingRules { using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; + using StyleCop.Analyzers.Lightup; internal static class ModifierOrderHelper { @@ -21,7 +22,7 @@ internal enum ModifierType None, /// - /// Represents any of access modifiers, i.e , , , . + /// Represents any of access modifiers, i.e , , , , . /// Access, @@ -46,6 +47,7 @@ internal static ModifierType GetModifierType(SyntaxToken modifier) case SyntaxKind.ProtectedKeyword: case SyntaxKind.InternalKeyword: case SyntaxKind.PrivateKeyword: + case SyntaxKindEx.FileKeyword: result = ModifierType.Access; break; diff --git a/StyleCop.Analyzers/StyleCop.Analyzers/Lightup/SyntaxKindEx.cs b/StyleCop.Analyzers/StyleCop.Analyzers/Lightup/SyntaxKindEx.cs index d4f3cff8f..e0d65e7a7 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 FileKeyword = (SyntaxKind)8449; public const SyntaxKind NullableKeyword = (SyntaxKind)8486; public const SyntaxKind EnableKeyword = (SyntaxKind)8487; public const SyntaxKind WarningsKeyword = (SyntaxKind)8488;