@@ -23,7 +23,7 @@ internal sealed class PrivateFieldNamingRule : IFormattingRule
2323 /// <summary>
2424 /// This will add an annotation to any private field that needs to be renamed.
2525 /// </summary>
26- private sealed class PrivateFieldAnnotationsRewriter : CSharpSyntaxRewriter
26+ internal sealed class PrivateFieldAnnotationsRewriter : CSharpSyntaxRewriter
2727 {
2828 internal readonly static SyntaxAnnotation Marker = new SyntaxAnnotation ( "PrivateFieldToRename" ) ;
2929
@@ -47,19 +47,20 @@ internal static SyntaxNode AddAnnotations(SyntaxNode node, out int count)
4747
4848 public override SyntaxNode VisitFieldDeclaration ( FieldDeclarationSyntax node )
4949 {
50- if ( NeedsRewrite ( node ) )
50+ bool isInstance ;
51+ if ( NeedsRewrite ( node , out isInstance ) )
5152 {
5253 var list = new List < VariableDeclaratorSyntax > ( node . Declaration . Variables . Count ) ;
5354 foreach ( var v in node . Declaration . Variables )
5455 {
55- if ( IsBadName ( v ) )
56+ if ( IsGoodName ( v , isInstance ) )
5657 {
57- list . Add ( v . WithAdditionalAnnotations ( Marker ) ) ;
58- _count ++ ;
58+ list . Add ( v ) ;
5959 }
6060 else
6161 {
62- list . Add ( v ) ;
62+ list . Add ( v . WithAdditionalAnnotations ( Marker ) ) ;
63+ _count ++ ;
6364 }
6465 }
6566
@@ -72,16 +73,16 @@ public override SyntaxNode VisitFieldDeclaration(FieldDeclarationSyntax node)
7273 return node ;
7374 }
7475
75- private static bool NeedsRewrite ( FieldDeclarationSyntax fieldSyntax )
76+ private static bool NeedsRewrite ( FieldDeclarationSyntax fieldSyntax , out bool isInstance )
7677 {
77- if ( ! IsPrivateField ( fieldSyntax ) )
78+ if ( ! IsPrivateField ( fieldSyntax , out isInstance ) )
7879 {
7980 return false ;
8081 }
8182
8283 foreach ( var v in fieldSyntax . Declaration . Variables )
8384 {
84- if ( IsBadName ( v ) )
85+ if ( ! IsGoodName ( v , isInstance ) )
8586 {
8687 return true ;
8788 }
@@ -90,14 +91,22 @@ private static bool NeedsRewrite(FieldDeclarationSyntax fieldSyntax)
9091 return false ;
9192 }
9293
93- private static bool IsBadName ( VariableDeclaratorSyntax node )
94+ private static bool IsGoodName ( VariableDeclaratorSyntax node , bool isInstance )
9495 {
9596 var name = node . Identifier . ValueText ;
96- return name . Length > 0 && name [ 0 ] != '_' ;
97+ if ( isInstance )
98+ {
99+ return name . Length > 0 && name [ 0 ] == '_' ;
100+ }
101+ else
102+ {
103+ return name . Length > 1 && ( name [ 0 ] == 's' || name [ 0 ] == 't' ) && name [ 1 ] == '_' ;
104+ }
97105 }
98106
99- private static bool IsPrivateField ( FieldDeclarationSyntax fieldSyntax )
107+ private static bool IsPrivateField ( FieldDeclarationSyntax fieldSyntax , out bool isInstance )
100108 {
109+ isInstance = true ;
101110 foreach ( var modifier in fieldSyntax . Modifiers )
102111 {
103112 switch ( modifier . CSharpKind ( ) )
@@ -107,6 +116,9 @@ private static bool IsPrivateField(FieldDeclarationSyntax fieldSyntax)
107116 case SyntaxKind . InternalKeyword :
108117 case SyntaxKind . ProtectedKeyword :
109118 return false ;
119+ case SyntaxKind . StaticKeyword :
120+ isInstance = false ;
121+ break ;
110122 }
111123 }
112124
@@ -189,6 +201,13 @@ private static async Task<Solution> RenameFields(Solution solution, DocumentId d
189201 var declaration = root . GetAnnotatedNodes ( PrivateFieldAnnotationsRewriter . Marker ) . ElementAt ( i ) ;
190202 var fieldSymbol = ( IFieldSymbol ) semanticModel . GetDeclaredSymbol ( declaration , cancellationToken ) ;
191203 var newName = GetNewFieldName ( fieldSymbol ) ;
204+
205+ // Can happen with pathologically bad field names like _
206+ if ( newName == fieldSymbol . Name )
207+ {
208+ continue ;
209+ }
210+
192211 solution = await Renamer . RenameSymbolAsync ( solution , fieldSymbol , newName , solution . Workspace . Options , cancellationToken ) . ConfigureAwait ( false ) ;
193212 }
194213
@@ -197,17 +216,15 @@ private static async Task<Solution> RenameFields(Solution solution, DocumentId d
197216
198217 private static string GetNewFieldName ( IFieldSymbol fieldSymbol )
199218 {
200- var name = fieldSymbol . Name ;
201- if ( name . Length > 1 )
219+ var name = fieldSymbol . Name . Trim ( '_' ) ;
220+ if ( name . Length > 2 && char . IsLetter ( name [ 0 ] ) && name [ 1 ] == '_' )
202221 {
203- if ( name [ 0 ] == '_' )
204- {
205- name = name . TrimStart ( '_' ) ;
206- }
207- else if ( char . IsLetter ( name [ 0 ] ) && name [ 1 ] == '_' )
208- {
209- name = name . Substring ( 2 ) ;
210- }
222+ name = name . Substring ( 2 ) ;
223+ }
224+
225+ if ( name . Length == 0 )
226+ {
227+ return fieldSymbol . Name ;
211228 }
212229
213230 if ( fieldSymbol . IsStatic )
0 commit comments