Skip to content

Commit 74dc1fd

Browse files
authored
Merge pull request #2501 from vweijsters/fix-1935
Allow underscore digit in enum members for SA1300
2 parents c26075e + abc548a commit 74dc1fd

File tree

3 files changed

+42
-3
lines changed

3 files changed

+42
-3
lines changed

StyleCop.Analyzers/StyleCop.Analyzers.CodeFixes/NamingRules/RenameToUpperCaseCodeFixProvider.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ public override async Task RegisterCodeFixesAsync(CodeFixContext context)
5555
foreach (var diagnostic in context.Diagnostics)
5656
{
5757
var token = root.FindToken(diagnostic.Location.SourceSpan.Start);
58-
var baseName = char.ToUpper(token.ValueText[0]) + token.ValueText.Substring(1);
58+
var tokenText = token.ValueText.TrimStart('_');
59+
var baseName = char.ToUpper(tokenText[0]) + tokenText.Substring(1);
5960
var newName = baseName;
6061
var memberSyntax = RenameHelper.GetParentDeclaration(token);
6162

StyleCop.Analyzers/StyleCop.Analyzers.Test/NamingRules/SA1300UnitTests.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -973,6 +973,39 @@ public interface IInterface
973973
await this.VerifyCSharpFixAsync(testCode, fixedCode).ConfigureAwait(false);
974974
}
975975

976+
[Fact]
977+
[WorkItem(1935, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/1935")]
978+
public async Task TestUnderscoreExclusionAsync()
979+
{
980+
var testCode = @"public enum TestEnum
981+
{
982+
_12clock,
983+
_12Clock,
984+
_tick,
985+
_Tock,
986+
}
987+
";
988+
989+
var fixedCode = @"public enum TestEnum
990+
{
991+
_12clock,
992+
_12Clock,
993+
Tick,
994+
Tock,
995+
}
996+
";
997+
998+
DiagnosticResult[] expected =
999+
{
1000+
this.CSharpDiagnostic().WithLocation(5, 5).WithArguments("_tick"),
1001+
this.CSharpDiagnostic().WithLocation(6, 5).WithArguments("_Tock"),
1002+
};
1003+
1004+
await this.VerifyCSharpDiagnosticAsync(testCode, expected, CancellationToken.None).ConfigureAwait(false);
1005+
await this.VerifyCSharpDiagnosticAsync(fixedCode, EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false);
1006+
await this.VerifyCSharpFixAsync(testCode, fixedCode, cancellationToken: CancellationToken.None).ConfigureAwait(false);
1007+
}
1008+
9761009
protected override IEnumerable<DiagnosticAnalyzer> GetCSharpDiagnosticAnalyzers()
9771010
{
9781011
yield return new SA1300ElementMustBeginWithUpperCaseLetter();

StyleCop.Analyzers/StyleCop.Analyzers/NamingRules/SA1300ElementMustBeginWithUpperCaseLetter.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ private static void HandleEnumDeclaration(SyntaxNodeAnalysisContext context)
123123

124124
private static void HandleEnumMemberDeclaration(SyntaxNodeAnalysisContext context)
125125
{
126-
CheckElementNameToken(context, ((EnumMemberDeclarationSyntax)context.Node).Identifier);
126+
CheckElementNameToken(context, ((EnumMemberDeclarationSyntax)context.Node).Identifier, true);
127127
}
128128

129129
private static void HandleStructDeclaration(SyntaxNodeAnalysisContext context)
@@ -198,7 +198,7 @@ private static void HandlePropertyDeclaration(SyntaxNodeAnalysisContext context)
198198
CheckElementNameToken(context, propertyDeclaration.Identifier);
199199
}
200200

201-
private static void CheckElementNameToken(SyntaxNodeAnalysisContext context, SyntaxToken identifier)
201+
private static void CheckElementNameToken(SyntaxNodeAnalysisContext context, SyntaxToken identifier, bool allowUnderscoreDigit = false)
202202
{
203203
if (identifier.IsMissing)
204204
{
@@ -222,6 +222,11 @@ private static void CheckElementNameToken(SyntaxNodeAnalysisContext context, Syn
222222
return;
223223
}
224224

225+
if (allowUnderscoreDigit && (identifier.ValueText.Length > 1) && (identifier.ValueText[0] == '_') && char.IsDigit(identifier.ValueText[1]))
226+
{
227+
return;
228+
}
229+
225230
if (NamedTypeHelpers.IsContainedInNativeMethodsClass(context.Node))
226231
{
227232
return;

0 commit comments

Comments
 (0)