@@ -23,7 +23,7 @@ internal sealed class PrivateFieldNamingRule : IFormattingRule
23
23
/// <summary>
24
24
/// This will add an annotation to any private field that needs to be renamed.
25
25
/// </summary>
26
- private sealed class PrivateFieldAnnotationsRewriter : CSharpSyntaxRewriter
26
+ internal sealed class PrivateFieldAnnotationsRewriter : CSharpSyntaxRewriter
27
27
{
28
28
internal readonly static SyntaxAnnotation Marker = new SyntaxAnnotation ( "PrivateFieldToRename" ) ;
29
29
@@ -47,19 +47,20 @@ internal static SyntaxNode AddAnnotations(SyntaxNode node, out int count)
47
47
48
48
public override SyntaxNode VisitFieldDeclaration ( FieldDeclarationSyntax node )
49
49
{
50
- if ( NeedsRewrite ( node ) )
50
+ bool isInstance ;
51
+ if ( NeedsRewrite ( node , out isInstance ) )
51
52
{
52
53
var list = new List < VariableDeclaratorSyntax > ( node . Declaration . Variables . Count ) ;
53
54
foreach ( var v in node . Declaration . Variables )
54
55
{
55
- if ( IsBadName ( v ) )
56
+ if ( IsGoodName ( v , isInstance ) )
56
57
{
57
- list . Add ( v . WithAdditionalAnnotations ( Marker ) ) ;
58
- _count ++ ;
58
+ list . Add ( v ) ;
59
59
}
60
60
else
61
61
{
62
- list . Add ( v ) ;
62
+ list . Add ( v . WithAdditionalAnnotations ( Marker ) ) ;
63
+ _count ++ ;
63
64
}
64
65
}
65
66
@@ -72,16 +73,16 @@ public override SyntaxNode VisitFieldDeclaration(FieldDeclarationSyntax node)
72
73
return node ;
73
74
}
74
75
75
- private static bool NeedsRewrite ( FieldDeclarationSyntax fieldSyntax )
76
+ private static bool NeedsRewrite ( FieldDeclarationSyntax fieldSyntax , out bool isInstance )
76
77
{
77
- if ( ! IsPrivateField ( fieldSyntax ) )
78
+ if ( ! IsPrivateField ( fieldSyntax , out isInstance ) )
78
79
{
79
80
return false ;
80
81
}
81
82
82
83
foreach ( var v in fieldSyntax . Declaration . Variables )
83
84
{
84
- if ( IsBadName ( v ) )
85
+ if ( ! IsGoodName ( v , isInstance ) )
85
86
{
86
87
return true ;
87
88
}
@@ -90,14 +91,22 @@ private static bool NeedsRewrite(FieldDeclarationSyntax fieldSyntax)
90
91
return false ;
91
92
}
92
93
93
- private static bool IsBadName ( VariableDeclaratorSyntax node )
94
+ private static bool IsGoodName ( VariableDeclaratorSyntax node , bool isInstance )
94
95
{
95
96
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
+ }
97
105
}
98
106
99
- private static bool IsPrivateField ( FieldDeclarationSyntax fieldSyntax )
107
+ private static bool IsPrivateField ( FieldDeclarationSyntax fieldSyntax , out bool isInstance )
100
108
{
109
+ isInstance = true ;
101
110
foreach ( var modifier in fieldSyntax . Modifiers )
102
111
{
103
112
switch ( modifier . CSharpKind ( ) )
@@ -107,6 +116,9 @@ private static bool IsPrivateField(FieldDeclarationSyntax fieldSyntax)
107
116
case SyntaxKind . InternalKeyword :
108
117
case SyntaxKind . ProtectedKeyword :
109
118
return false ;
119
+ case SyntaxKind . StaticKeyword :
120
+ isInstance = false ;
121
+ break ;
110
122
}
111
123
}
112
124
@@ -189,6 +201,13 @@ private static async Task<Solution> RenameFields(Solution solution, DocumentId d
189
201
var declaration = root . GetAnnotatedNodes ( PrivateFieldAnnotationsRewriter . Marker ) . ElementAt ( i ) ;
190
202
var fieldSymbol = ( IFieldSymbol ) semanticModel . GetDeclaredSymbol ( declaration , cancellationToken ) ;
191
203
var newName = GetNewFieldName ( fieldSymbol ) ;
204
+
205
+ // Can happen with pathologically bad field names like _
206
+ if ( newName == fieldSymbol . Name )
207
+ {
208
+ continue ;
209
+ }
210
+
192
211
solution = await Renamer . RenameSymbolAsync ( solution , fieldSymbol , newName , solution . Workspace . Options , cancellationToken ) . ConfigureAwait ( false ) ;
193
212
}
194
213
@@ -197,17 +216,15 @@ private static async Task<Solution> RenameFields(Solution solution, DocumentId d
197
216
198
217
private static string GetNewFieldName ( IFieldSymbol fieldSymbol )
199
218
{
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 ] == '_' )
202
221
{
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 ;
211
228
}
212
229
213
230
if ( fieldSymbol . IsStatic )
0 commit comments