Skip to content

Commit abc548a

Browse files
committed
Allow underscore digit in enum members for SA1300
1 parent ebf6c5b commit abc548a

3 files changed

Lines changed: 42 additions & 3 deletions

File tree

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
@@ -971,6 +971,39 @@ public interface IInterface
971971
await this.VerifyCSharpFixAsync(testCode, fixedCode).ConfigureAwait(false);
972972
}
973973

974+
[Fact]
975+
[WorkItem(1935, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/1935")]
976+
public async Task TestUnderscoreExclusionAsync()
977+
{
978+
var testCode = @"public enum TestEnum
979+
{
980+
_12clock,
981+
_12Clock,
982+
_tick,
983+
_Tock,
984+
}
985+
";
986+
987+
var fixedCode = @"public enum TestEnum
988+
{
989+
_12clock,
990+
_12Clock,
991+
Tick,
992+
Tock,
993+
}
994+
";
995+
996+
DiagnosticResult[] expected =
997+
{
998+
this.CSharpDiagnostic().WithLocation(5, 5).WithArguments("_tick"),
999+
this.CSharpDiagnostic().WithLocation(6, 5).WithArguments("_Tock"),
1000+
};
1001+
1002+
await this.VerifyCSharpDiagnosticAsync(testCode, expected, CancellationToken.None).ConfigureAwait(false);
1003+
await this.VerifyCSharpDiagnosticAsync(fixedCode, EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false);
1004+
await this.VerifyCSharpFixAsync(testCode, fixedCode, cancellationToken: CancellationToken.None).ConfigureAwait(false);
1005+
}
1006+
9741007
protected override IEnumerable<DiagnosticAnalyzer> GetCSharpDiagnosticAnalyzers()
9751008
{
9761009
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
@@ -125,7 +125,7 @@ private static void HandleEnumDeclaration(SyntaxNodeAnalysisContext context)
125125

126126
private static void HandleEnumMemberDeclaration(SyntaxNodeAnalysisContext context)
127127
{
128-
CheckElementNameToken(context, ((EnumMemberDeclarationSyntax)context.Node).Identifier);
128+
CheckElementNameToken(context, ((EnumMemberDeclarationSyntax)context.Node).Identifier, true);
129129
}
130130

131131
private static void HandleStructDeclaration(SyntaxNodeAnalysisContext context)
@@ -200,7 +200,7 @@ private static void HandlePropertyDeclaration(SyntaxNodeAnalysisContext context)
200200
CheckElementNameToken(context, propertyDeclaration.Identifier);
201201
}
202202

203-
private static void CheckElementNameToken(SyntaxNodeAnalysisContext context, SyntaxToken identifier)
203+
private static void CheckElementNameToken(SyntaxNodeAnalysisContext context, SyntaxToken identifier, bool allowUnderscoreDigit = false)
204204
{
205205
if (identifier.IsMissing)
206206
{
@@ -224,6 +224,11 @@ private static void CheckElementNameToken(SyntaxNodeAnalysisContext context, Syn
224224
return;
225225
}
226226

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

0 commit comments

Comments
 (0)