Skip to content

Commit ea800e2

Browse files
committed
Update SA1201 for file-scoped namespaces
1 parent e202aeb commit ea800e2

2 files changed

Lines changed: 49 additions & 5 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp10/OrderingRules/SA1201CSharp10UnitTests.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,51 @@
33

44
namespace StyleCop.Analyzers.Test.CSharp10.OrderingRules
55
{
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
using Microsoft.CodeAnalysis.Testing;
69
using StyleCop.Analyzers.Test.CSharp9.OrderingRules;
10+
using Xunit;
11+
using static StyleCop.Analyzers.Test.Verifiers.StyleCopCodeFixVerifier<
12+
StyleCop.Analyzers.OrderingRules.SA1201ElementsMustAppearInTheCorrectOrder,
13+
StyleCop.Analyzers.OrderingRules.ElementOrderCodeFixProvider>;
714

815
public class SA1201CSharp10UnitTests : SA1201CSharp9UnitTests
916
{
17+
[Fact]
18+
public async Task TestOuterOrderCorrectOrderWithFileScopedNamespaceAsync()
19+
{
20+
string testCode = @"namespace Foo;
21+
22+
public delegate void bar();
23+
public enum TestEnum { }
24+
public interface IFoo { }
25+
public struct FooStruct { }
26+
public class FooClass { }
27+
";
28+
29+
await VerifyCSharpDiagnosticAsync(testCode, DiagnosticResult.EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false);
30+
}
31+
32+
[Fact]
33+
public async Task TestOuterOrderWrongOrderWithFileScopedNamespaceAsync()
34+
{
35+
string testCode = @"
36+
namespace Foo;
37+
38+
public enum TestEnum { }
39+
public delegate void {|#0:bar|}();
40+
public interface IFoo { }
41+
public class FooClass { }
42+
public struct {|#1:FooStruct|} { }
43+
";
44+
var expected = new[]
45+
{
46+
Diagnostic().WithLocation(0).WithArguments("delegate", "enum"),
47+
Diagnostic().WithLocation(1).WithArguments("struct", "class"),
48+
};
49+
50+
await VerifyCSharpDiagnosticAsync(testCode, expected, CancellationToken.None).ConfigureAwait(false);
51+
}
1052
}
1153
}

StyleCop.Analyzers/StyleCop.Analyzers/OrderingRules/SA1201ElementsMustAppearInTheCorrectOrder.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ internal class SA1201ElementsMustAppearInTheCorrectOrder : DiagnosticAnalyzer
123123

124124
// extern alias and usings are missing here because the compiler itself is enforcing the right order.
125125
private static readonly ImmutableArray<SyntaxKind> OuterOrder = ImmutableArray.Create(
126+
SyntaxKindEx.FileScopedNamespaceDeclaration,
126127
SyntaxKind.NamespaceDeclaration,
127128
SyntaxKind.DelegateDeclaration,
128129
SyntaxKind.EnumDeclaration,
@@ -149,6 +150,7 @@ internal class SA1201ElementsMustAppearInTheCorrectOrder : DiagnosticAnalyzer
149150
private static readonly Dictionary<SyntaxKind, string> MemberNames = new Dictionary<SyntaxKind, string>
150151
{
151152
[SyntaxKind.NamespaceDeclaration] = "namespace",
153+
[SyntaxKindEx.FileScopedNamespaceDeclaration] = "namespace",
152154
[SyntaxKind.DelegateDeclaration] = "delegate",
153155
[SyntaxKind.EnumDeclaration] = "enum",
154156
[SyntaxKind.InterfaceDeclaration] = "interface",
@@ -172,7 +174,7 @@ internal class SA1201ElementsMustAppearInTheCorrectOrder : DiagnosticAnalyzer
172174
};
173175

174176
private static readonly Action<SyntaxNodeAnalysisContext, StyleCopSettings> CompilationUnitAction = HandleCompilationUnit;
175-
private static readonly Action<SyntaxNodeAnalysisContext, StyleCopSettings> NamespaceDeclarationAction = HandleNamespaceDeclaration;
177+
private static readonly Action<SyntaxNodeAnalysisContext, StyleCopSettings> BaseNamespaceDeclarationAction = HandleBaseNamespaceDeclaration;
176178
private static readonly Action<SyntaxNodeAnalysisContext, StyleCopSettings> TypeDeclarationAction = HandleTypeDeclaration;
177179

178180
/// <inheritdoc/>
@@ -186,7 +188,7 @@ public override void Initialize(AnalysisContext context)
186188
context.EnableConcurrentExecution();
187189

188190
context.RegisterSyntaxNodeAction(CompilationUnitAction, SyntaxKind.CompilationUnit);
189-
context.RegisterSyntaxNodeAction(NamespaceDeclarationAction, SyntaxKind.NamespaceDeclaration);
191+
context.RegisterSyntaxNodeAction(BaseNamespaceDeclarationAction, SyntaxKinds.BaseNamespaceDeclaration);
190192
context.RegisterSyntaxNodeAction(TypeDeclarationAction, SyntaxKinds.TypeDeclaration);
191193
}
192194

@@ -218,7 +220,7 @@ private static void HandleCompilationUnit(SyntaxNodeAnalysisContext context, Sty
218220
HandleMemberList(context, elementOrder, kindIndex, compilationUnit.Members, OuterOrder);
219221
}
220222

221-
private static void HandleNamespaceDeclaration(SyntaxNodeAnalysisContext context, StyleCopSettings settings)
223+
private static void HandleBaseNamespaceDeclaration(SyntaxNodeAnalysisContext context, StyleCopSettings settings)
222224
{
223225
var elementOrder = settings.OrderingRules.ElementOrder;
224226
int kindIndex = elementOrder.IndexOf(OrderingTrait.Kind);
@@ -227,9 +229,9 @@ private static void HandleNamespaceDeclaration(SyntaxNodeAnalysisContext context
227229
return;
228230
}
229231

230-
var compilationUnit = (NamespaceDeclarationSyntax)context.Node;
232+
var baseNamespaceDeclaration = (BaseNamespaceDeclarationSyntaxWrapper)context.Node;
231233

232-
HandleMemberList(context, elementOrder, kindIndex, compilationUnit.Members, OuterOrder);
234+
HandleMemberList(context, elementOrder, kindIndex, baseNamespaceDeclaration.Members, OuterOrder);
233235
}
234236

235237
private static void HandleMemberList(SyntaxNodeAnalysisContext context, ImmutableArray<OrderingTrait> elementOrder, int kindIndex, SyntaxList<MemberDeclarationSyntax> members, ImmutableArray<SyntaxKind> order)

0 commit comments

Comments
 (0)