@@ -31,34 +31,64 @@ internal VisualBasicVisibilityRewriter(Document document, CancellationToken canc
31
31
public override SyntaxNode VisitClassBlock ( ClassBlockSyntax originalNode )
32
32
{
33
33
var node = ( ClassBlockSyntax ) base . VisitClassBlock ( originalNode ) ;
34
- var begin = ( ClassStatementSyntax ) EnsureVisibility ( node . ClassStatement , node . ClassStatement . Modifiers , ( x , l ) => x . WithModifiers ( l ) , ( ) => GetTypeDefaultVisibility ( originalNode ) ) ;
34
+ var begin = ( ClassStatementSyntax ) EnsureVisibility (
35
+ node . ClassStatement ,
36
+ node . ClassStatement . ClassKeyword ,
37
+ node . ClassStatement . Modifiers ,
38
+ ( x , k ) => x . WithClassKeyword ( k ) ,
39
+ ( x , l ) => x . WithModifiers ( l ) ,
40
+ ( ) => GetTypeDefaultVisibility ( originalNode ) ) ;
35
41
return node . WithClassStatement ( begin ) ;
36
42
}
37
43
38
44
public override SyntaxNode VisitStructureBlock ( StructureBlockSyntax originalNode )
39
45
{
40
46
var node = ( StructureBlockSyntax ) base . VisitStructureBlock ( originalNode ) ;
41
- var begin = ( StructureStatementSyntax ) EnsureVisibility ( node . StructureStatement , node . StructureStatement . Modifiers , ( x , l ) => x . WithModifiers ( l ) , ( ) => GetTypeDefaultVisibility ( originalNode ) ) ;
47
+ var begin = ( StructureStatementSyntax ) EnsureVisibility (
48
+ node . StructureStatement ,
49
+ node . StructureStatement . StructureKeyword ,
50
+ node . StructureStatement . Modifiers ,
51
+ ( x , k ) => x . WithStructureKeyword ( k ) ,
52
+ ( x , l ) => x . WithModifiers ( l ) ,
53
+ ( ) => GetTypeDefaultVisibility ( originalNode ) ) ;
42
54
return node . WithStructureStatement ( begin ) ;
43
55
}
44
56
45
57
public override SyntaxNode VisitInterfaceBlock ( InterfaceBlockSyntax originalNode )
46
58
{
47
59
var node = ( InterfaceBlockSyntax ) base . VisitInterfaceBlock ( originalNode ) ;
48
- var begin = ( InterfaceStatementSyntax ) EnsureVisibility ( node . InterfaceStatement , node . InterfaceStatement . Modifiers , ( x , l ) => x . WithModifiers ( l ) , ( ) => GetTypeDefaultVisibility ( originalNode ) ) ;
60
+ var begin = ( InterfaceStatementSyntax ) EnsureVisibility (
61
+ node . InterfaceStatement ,
62
+ node . InterfaceStatement . InterfaceKeyword ,
63
+ node . InterfaceStatement . Modifiers ,
64
+ ( x , k ) => x . WithInterfaceKeyword ( k ) ,
65
+ ( x , l ) => x . WithModifiers ( l ) ,
66
+ ( ) => GetTypeDefaultVisibility ( originalNode ) ) ;
49
67
return node . WithInterfaceStatement ( begin ) ;
50
68
}
51
69
52
70
public override SyntaxNode VisitModuleBlock ( ModuleBlockSyntax node )
53
71
{
54
72
node = ( ModuleBlockSyntax ) base . VisitModuleBlock ( node ) ;
55
- var begin = ( ModuleStatementSyntax ) EnsureVisibility ( node . ModuleStatement , node . ModuleStatement . Modifiers , ( x , l ) => x . WithModifiers ( l ) , ( ) => SyntaxKind . FriendKeyword ) ;
73
+ var begin = ( ModuleStatementSyntax ) EnsureVisibility (
74
+ node . ModuleStatement ,
75
+ node . ModuleStatement . ModuleKeyword ,
76
+ node . ModuleStatement . Modifiers ,
77
+ ( x , k ) => x . WithModuleKeyword ( k ) ,
78
+ ( x , l ) => x . WithModifiers ( l ) ,
79
+ ( ) => SyntaxKind . FriendKeyword ) ;
56
80
return node . WithModuleStatement ( begin ) ;
57
81
}
58
82
59
83
public override SyntaxNode VisitEnumBlock ( EnumBlockSyntax node )
60
84
{
61
- var enumStatement = ( EnumStatementSyntax ) EnsureVisibility ( node . EnumStatement , node . EnumStatement . Modifiers , ( x , l ) => x . WithModifiers ( l ) , ( ) => GetDelegateTypeDefaultVisibility ( node ) ) ;
85
+ var enumStatement = ( EnumStatementSyntax ) EnsureVisibility (
86
+ node . EnumStatement ,
87
+ node . EnumStatement . EnumKeyword ,
88
+ node . EnumStatement . Modifiers ,
89
+ ( x , k ) => x . WithEnumKeyword ( k ) ,
90
+ ( x , l ) => x . WithModifiers ( l ) ,
91
+ ( ) => GetDelegateTypeDefaultVisibility ( node ) ) ;
62
92
return node . WithEnumStatement ( enumStatement ) ;
63
93
}
64
94
@@ -69,7 +99,13 @@ public override SyntaxNode VisitMethodStatement(MethodStatementSyntax node)
69
99
return node ;
70
100
}
71
101
72
- return EnsureVisibility ( node , node . Modifiers , ( x , l ) => x . WithModifiers ( l ) , ( ) => SyntaxKind . PublicKeyword ) ;
102
+ return EnsureVisibility (
103
+ node ,
104
+ node . SubOrFunctionKeyword ,
105
+ node . Modifiers ,
106
+ ( x , k ) => x . WithSubOrFunctionKeyword ( k ) ,
107
+ ( x , l ) => x . WithModifiers ( l ) ,
108
+ ( ) => SyntaxKind . PublicKeyword ) ;
73
109
}
74
110
75
111
public override SyntaxNode VisitSubNewStatement ( SubNewStatementSyntax node )
@@ -79,12 +115,22 @@ public override SyntaxNode VisitSubNewStatement(SubNewStatementSyntax node)
79
115
return node ;
80
116
}
81
117
82
- return EnsureVisibility ( node , node . Modifiers , ( x , l ) => x . WithModifiers ( l ) , ( ) => SyntaxKind . PublicKeyword ) ;
118
+ return EnsureVisibility (
119
+ node ,
120
+ node . SubKeyword ,
121
+ node . Modifiers ,
122
+ ( x , k ) => x . WithSubKeyword ( k ) ,
123
+ ( x , l ) => x . WithModifiers ( l ) ,
124
+ ( ) => SyntaxKind . PublicKeyword ) ;
83
125
}
84
126
85
127
public override SyntaxNode VisitFieldDeclaration ( FieldDeclarationSyntax node )
86
128
{
87
- node = ( FieldDeclarationSyntax ) EnsureVisibility ( node , node . Modifiers , ( x , l ) => x . WithModifiers ( l ) , ( ) => SyntaxKind . PrivateKeyword ) ;
129
+ node = ( FieldDeclarationSyntax ) EnsureVisibility (
130
+ node ,
131
+ node . Modifiers ,
132
+ ( x , l ) => x . WithModifiers ( l ) ,
133
+ ( ) => SyntaxKind . PrivateKeyword ) ;
88
134
89
135
// Now that the field has an explicit modifier remove any Dim modifiers on it
90
136
// as it is now redundant
@@ -204,11 +250,59 @@ private static bool IsNestedDeclaration(SyntaxNode node)
204
250
return false ;
205
251
}
206
252
253
+ private static SyntaxNode EnsureVisibility < T > ( T node , SyntaxToken keyword , SyntaxTokenList originalModifiers , Func < T , SyntaxToken , T > withKeyword , Func < T , SyntaxTokenList , T > withModifiers , Func < SyntaxKind > getDefaultVisibility ) where T : SyntaxNode
254
+ {
255
+ Func < SyntaxKind , T > withFirstModifier = ( visibilityKind ) =>
256
+ {
257
+ var leadingTrivia = keyword . LeadingTrivia ;
258
+ node = withKeyword ( node , keyword . WithLeadingTrivia ( ) ) ;
259
+
260
+ var visibilityToken = SyntaxFactory . Token (
261
+ leadingTrivia ,
262
+ visibilityKind ,
263
+ SyntaxFactory . TriviaList ( SyntaxFactory . SyntaxTrivia ( SyntaxKind . WhitespaceTrivia , " " ) ) ) ;
264
+
265
+ var modifierList = SyntaxFactory . TokenList ( visibilityToken ) ;
266
+ return withModifiers ( node , modifierList ) ;
267
+ } ;
268
+
269
+ return EnsureVisibilityCore (
270
+ node ,
271
+ originalModifiers ,
272
+ withFirstModifier ,
273
+ withModifiers ,
274
+ getDefaultVisibility ) ;
275
+ }
276
+
277
+ private static SyntaxNode EnsureVisibility < T > ( T node , SyntaxTokenList originalModifiers , Func < T , SyntaxTokenList , T > withModifiers , Func < SyntaxKind > getDefaultVisibility ) where T : SyntaxNode
278
+ {
279
+ Func < SyntaxKind , T > withFirstModifier = ( visibilityKind ) =>
280
+ {
281
+ var leadingTrivia = node . GetLeadingTrivia ( ) ;
282
+ node = node . WithLeadingTrivia ( ) ;
283
+
284
+ var visibilityToken = SyntaxFactory . Token (
285
+ leadingTrivia ,
286
+ visibilityKind ,
287
+ SyntaxFactory . TriviaList ( SyntaxFactory . SyntaxTrivia ( SyntaxKind . WhitespaceTrivia , " " ) ) ) ;
288
+
289
+ var modifierList = SyntaxFactory . TokenList ( visibilityToken ) ;
290
+ return withModifiers ( node , modifierList ) ;
291
+ } ;
292
+
293
+ return EnsureVisibilityCore (
294
+ node ,
295
+ originalModifiers ,
296
+ withFirstModifier ,
297
+ withModifiers ,
298
+ getDefaultVisibility ) ;
299
+ }
300
+
207
301
/// <summary>
208
302
/// Return a node declaration that has a visibility modifier. If one isn't present it will be added as the
209
303
/// first modifier. Any trivia before the node will be added as leading trivia to the added <see cref="SyntaxToken"/>.
210
304
/// </summary>
211
- private static SyntaxNode EnsureVisibility < T > ( T node , SyntaxTokenList originalModifiers , Func < T , SyntaxTokenList , T > withModifiers , Func < SyntaxKind > getDefaultVisibility ) where T : SyntaxNode
305
+ private static SyntaxNode EnsureVisibilityCore < T > ( T node , SyntaxTokenList originalModifiers , Func < SyntaxKind , T > withFirstModifier , Func < T , SyntaxTokenList , T > withModifiers , Func < SyntaxKind > getDefaultVisibility ) where T : SyntaxNode
212
306
{
213
307
if ( originalModifiers . Any ( x => SyntaxFacts . IsAccessibilityModifier ( x . Kind ( ) ) ) )
214
308
{
@@ -221,15 +315,7 @@ private static SyntaxNode EnsureVisibility<T>(T node, SyntaxTokenList originalMo
221
315
SyntaxTokenList modifierList ;
222
316
if ( originalModifiers . Count == 0 )
223
317
{
224
- var leadingTrivia = node . GetLeadingTrivia ( ) ;
225
- node = node . WithLeadingTrivia ( ) ;
226
-
227
- var visibilityToken = SyntaxFactory . Token (
228
- leadingTrivia ,
229
- visibilityKind ,
230
- SyntaxFactory . TriviaList ( SyntaxFactory . SyntaxTrivia ( SyntaxKind . WhitespaceTrivia , " " ) ) ) ;
231
-
232
- modifierList = SyntaxFactory . TokenList ( visibilityToken ) ;
318
+ return withFirstModifier ( visibilityKind ) ;
233
319
}
234
320
else
235
321
{
@@ -248,9 +334,9 @@ private static SyntaxNode EnsureVisibility<T>(T node, SyntaxTokenList originalMo
248
334
}
249
335
250
336
modifierList = SyntaxFactory . TokenList ( list ) ;
337
+ return withModifiers ( node , modifierList ) ;
251
338
}
252
339
253
- return withModifiers ( node , modifierList ) ;
254
340
}
255
341
}
256
342
}
0 commit comments