Skip to content

Commit d208f0a

Browse files
committed
Update SA1209 to support file-scoped namespaces
Fixes #3439
1 parent a9ec12f commit d208f0a

2 files changed

Lines changed: 42 additions & 4 deletions

File tree

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,46 @@
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.SA1209UsingAliasDirectivesMustBePlacedAfterOtherUsingDirectives,
13+
StyleCop.Analyzers.OrderingRules.UsingCodeFixProvider>;
714

815
public class SA1209CSharp10UnitTests : SA1209CSharp9UnitTests
916
{
17+
[Fact]
18+
[WorkItem(3439, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3439")]
19+
public async Task TestWhenUsingAliasDirectivesAreNotPlacedCorrectlyInFileScopedNamespaceAsync()
20+
{
21+
var testCodeNamespace = @"namespace Test;
22+
23+
using System.Net;
24+
using System.Threading;
25+
[|using L = System.Linq;|]
26+
using System.IO;
27+
using P = System.Threading.Tasks;
28+
29+
class A
30+
{
31+
}
32+
";
33+
var fixedTestCodeNamespace = @"namespace Test;
34+
using System.IO;
35+
using System.Net;
36+
using System.Threading;
37+
using L = System.Linq;
38+
using P = System.Threading.Tasks;
39+
40+
class A
41+
{
42+
}
43+
";
44+
45+
await VerifyCSharpFixAsync(testCodeNamespace, DiagnosticResult.EmptyDiagnosticResults, fixedTestCodeNamespace, CancellationToken.None).ConfigureAwait(false);
46+
}
1047
}
1148
}

StyleCop.Analyzers/StyleCop.Analyzers/OrderingRules/SA1209UsingAliasDirectivesMustBePlacedAfterOtherUsingDirectives.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ namespace StyleCop.Analyzers.OrderingRules
1010
using Microsoft.CodeAnalysis.CSharp.Syntax;
1111
using Microsoft.CodeAnalysis.Diagnostics;
1212
using StyleCop.Analyzers.Helpers;
13+
using StyleCop.Analyzers.Lightup;
1314

1415
/// <summary>
1516
/// A using-alias directive is positioned before a regular using directive.
@@ -37,7 +38,7 @@ internal class SA1209UsingAliasDirectivesMustBePlacedAfterOtherUsingDirectives :
3738
new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, AnalyzerCategory.OrderingRules, DiagnosticSeverity.Warning, AnalyzerConstants.EnabledByDefault, Description, HelpLink);
3839

3940
private static readonly Action<SyntaxNodeAnalysisContext> CompilationUnitAction = HandleCompilationUnit;
40-
private static readonly Action<SyntaxNodeAnalysisContext> NamespaceDeclarationAction = HandleNamespaceDeclaration;
41+
private static readonly Action<SyntaxNodeAnalysisContext> BaseNamespaceDeclarationAction = HandleBaseNamespaceDeclaration;
4142

4243
/// <inheritdoc/>
4344
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } =
@@ -50,7 +51,7 @@ public override void Initialize(AnalysisContext context)
5051
context.EnableConcurrentExecution();
5152

5253
context.RegisterSyntaxNodeAction(CompilationUnitAction, SyntaxKind.CompilationUnit);
53-
context.RegisterSyntaxNodeAction(NamespaceDeclarationAction, SyntaxKind.NamespaceDeclaration);
54+
context.RegisterSyntaxNodeAction(BaseNamespaceDeclarationAction, SyntaxKinds.BaseNamespaceDeclaration);
5455
}
5556

5657
private static void HandleCompilationUnit(SyntaxNodeAnalysisContext context)
@@ -60,9 +61,9 @@ private static void HandleCompilationUnit(SyntaxNodeAnalysisContext context)
6061
ProcessUsingsAndReportDiagnostic(compilationUnit.Usings, context);
6162
}
6263

63-
private static void HandleNamespaceDeclaration(SyntaxNodeAnalysisContext context)
64+
private static void HandleBaseNamespaceDeclaration(SyntaxNodeAnalysisContext context)
6465
{
65-
var namespaceDeclaration = (NamespaceDeclarationSyntax)context.Node;
66+
var namespaceDeclaration = (BaseNamespaceDeclarationSyntaxWrapper)context.Node;
6667

6768
ProcessUsingsAndReportDiagnostic(namespaceDeclaration.Usings, context);
6869
}

0 commit comments

Comments
 (0)