Skip to content

Commit dd487b5

Browse files
authored
Merge pull request #2486 from sharwell/sa1210-casing
Fall back to case sensitive comparisons if case-insensitive is a match
2 parents 01816d6 + 58c7c46 commit dd487b5

5 files changed

Lines changed: 56 additions & 7 deletions

File tree

StyleCop.Analyzers/StyleCop.Analyzers.CodeFixes/OrderingRules/UsingCodeFixProvider.UsingsSorter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -413,10 +413,10 @@ private int CompareUsings(UsingDirectiveSyntax left, UsingDirectiveSyntax right)
413413
{
414414
if ((left.Alias != null) && (right.Alias != null))
415415
{
416-
return CultureInfo.InvariantCulture.CompareInfo.Compare(left.Alias.Name.Identifier.ValueText, right.Alias.Name.Identifier.ValueText, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreWidth);
416+
return NameSyntaxHelpers.Compare(left.Alias.Name, right.Alias.Name);
417417
}
418418

419-
return CultureInfo.InvariantCulture.CompareInfo.Compare(left.Name.ToNormalizedString(), right.Name.ToNormalizedString(), CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreWidth);
419+
return NameSyntaxHelpers.Compare(left.Name, right.Name);
420420
}
421421

422422
private bool IsSeparatedSystemUsing(UsingDirectiveSyntax syntax)

StyleCop.Analyzers/StyleCop.Analyzers.Test/OrderingRules/SA1210UnitTests.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,35 @@ namespace Bar
114114
await this.VerifyCSharpFixAsync(testCode, fixedTestCode).ConfigureAwait(false);
115115
}
116116

117+
[Fact]
118+
[WorkItem(2336, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/2336")]
119+
public async Task TestUsingDirectivesCaseSensitivityAsync()
120+
{
121+
var testCode = @"namespace First
122+
{
123+
using Second;
124+
using second;
125+
}
126+
127+
namespace Second { }
128+
namespace second { }";
129+
130+
var fixedTestCode = @"namespace First
131+
{
132+
using second;
133+
using Second;
134+
}
135+
136+
namespace Second { }
137+
namespace second { }";
138+
139+
DiagnosticResult expected = this.CSharpDiagnostic().WithLocation(3, 5);
140+
141+
await this.VerifyCSharpDiagnosticAsync(testCode, expected, CancellationToken.None).ConfigureAwait(false);
142+
await this.VerifyCSharpDiagnosticAsync(fixedTestCode, EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false);
143+
await this.VerifyCSharpFixAsync(testCode, fixedTestCode).ConfigureAwait(false);
144+
}
145+
117146
[Fact]
118147
public async Task TestInvalidOrderedUsingDirectivesWithInlineCommentsAsync()
119148
{

StyleCop.Analyzers/StyleCop.Analyzers/Helpers/NameSyntaxHelpers.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
namespace StyleCop.Analyzers.Helpers
55
{
6+
using System.Globalization;
67
using System.Text;
78
using Microsoft.CodeAnalysis;
89
using Microsoft.CodeAnalysis.CSharp;
@@ -44,6 +45,22 @@ internal static string ToUnaliasedString(this NameSyntax nameSyntax)
4445
return StringBuilderPool.ReturnAndFree(sb);
4546
}
4647

48+
internal static int Compare(NameSyntax first, NameSyntax second)
49+
{
50+
string left = first.ToNormalizedString();
51+
string right = second.ToNormalizedString();
52+
53+
// First compare without considering case
54+
int result = CultureInfo.InvariantCulture.CompareInfo.Compare(left, right, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreWidth);
55+
if (result == 0)
56+
{
57+
// Compare case if they matched
58+
result = CultureInfo.InvariantCulture.CompareInfo.Compare(left, right, CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreWidth);
59+
}
60+
61+
return result;
62+
}
63+
4764
private static void BuildName(NameSyntax nameSyntax, StringBuilder builder, bool includeAlias)
4865
{
4966
if (nameSyntax.IsKind(SyntaxKind.IdentifierName))

StyleCop.Analyzers/StyleCop.Analyzers/OrderingRules/SA1210UsingDirectivesMustBeOrderedAlphabeticallyByNamespace.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ private static void CheckIncorrectlyOrderedUsingsAndReportDiagnostic(SyntaxNodeA
115115
{
116116
if (previousUsingDirective != null)
117117
{
118-
if (CultureInfo.InvariantCulture.CompareInfo.Compare(previousUsingDirective.Name.ToNormalizedString(), directive.Name.ToNormalizedString(), CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreWidth) > 0)
118+
if (NameSyntaxHelpers.Compare(previousUsingDirective.Name, directive.Name) > 0)
119119
{
120120
context.ReportDiagnostic(Diagnostic.Create(Descriptor, previousUsingDirective.GetLocation()));
121121
}

StyleCop.Analyzers/StyleCop.Analyzers/OrderingRules/SA1217UsingStaticDirectivesMustBeOrderedAlphabetically.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,15 @@ private static void CheckUsingDeclarations(SyntaxNodeAnalysisContext context, Sy
8181
{
8282
if (lastStaticUsingDirective != null)
8383
{
84-
var firstName = lastStaticUsingDirective.Name.ToNormalizedString();
85-
var secondName = usingDirective.Name.ToNormalizedString();
84+
var firstName = lastStaticUsingDirective.Name;
85+
var secondName = usingDirective.Name;
8686

87-
if (CultureInfo.InvariantCulture.CompareInfo.Compare(firstName, secondName, CompareOptions.IgnoreCase | CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreWidth) > 0)
87+
if (NameSyntaxHelpers.Compare(firstName, secondName) > 0)
8888
{
89-
context.ReportDiagnostic(Diagnostic.Create(Descriptor, lastStaticUsingDirective.GetLocation(), new[] { firstName, secondName }));
89+
context.ReportDiagnostic(Diagnostic.Create(
90+
Descriptor,
91+
lastStaticUsingDirective.GetLocation(),
92+
new[] { firstName.ToNormalizedString(), secondName.ToNormalizedString() }));
9093
return;
9194
}
9295
}

0 commit comments

Comments
 (0)