@@ -31,34 +31,64 @@ internal VisualBasicVisibilityRewriter(Document document, CancellationToken canc
3131 public override SyntaxNode VisitClassBlock ( ClassBlockSyntax originalNode )
3232 {
3333 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 ) ) ;
3541 return node . WithClassStatement ( begin ) ;
3642 }
3743
3844 public override SyntaxNode VisitStructureBlock ( StructureBlockSyntax originalNode )
3945 {
4046 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 ) ) ;
4254 return node . WithStructureStatement ( begin ) ;
4355 }
4456
4557 public override SyntaxNode VisitInterfaceBlock ( InterfaceBlockSyntax originalNode )
4658 {
4759 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 ) ) ;
4967 return node . WithInterfaceStatement ( begin ) ;
5068 }
5169
5270 public override SyntaxNode VisitModuleBlock ( ModuleBlockSyntax node )
5371 {
5472 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 ) ;
5680 return node . WithModuleStatement ( begin ) ;
5781 }
5882
5983 public override SyntaxNode VisitEnumBlock ( EnumBlockSyntax node )
6084 {
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 ) ) ;
6292 return node . WithEnumStatement ( enumStatement ) ;
6393 }
6494
@@ -69,7 +99,13 @@ public override SyntaxNode VisitMethodStatement(MethodStatementSyntax node)
6999 return node ;
70100 }
71101
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 ) ;
73109 }
74110
75111 public override SyntaxNode VisitSubNewStatement ( SubNewStatementSyntax node )
@@ -79,12 +115,22 @@ public override SyntaxNode VisitSubNewStatement(SubNewStatementSyntax node)
79115 return node ;
80116 }
81117
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 ) ;
83125 }
84126
85127 public override SyntaxNode VisitFieldDeclaration ( FieldDeclarationSyntax node )
86128 {
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 ) ;
88134
89135 // Now that the field has an explicit modifier remove any Dim modifiers on it
90136 // as it is now redundant
@@ -204,11 +250,59 @@ private static bool IsNestedDeclaration(SyntaxNode node)
204250 return false ;
205251 }
206252
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+
207301 /// <summary>
208302 /// Return a node declaration that has a visibility modifier. If one isn't present it will be added as the
209303 /// first modifier. Any trivia before the node will be added as leading trivia to the added <see cref="SyntaxToken"/>.
210304 /// </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
212306 {
213307 if ( originalModifiers . Any ( x => SyntaxFacts . IsAccessibilityModifier ( x . Kind ( ) ) ) )
214308 {
@@ -221,15 +315,7 @@ private static SyntaxNode EnsureVisibility<T>(T node, SyntaxTokenList originalMo
221315 SyntaxTokenList modifierList ;
222316 if ( originalModifiers . Count == 0 )
223317 {
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 ) ;
233319 }
234320 else
235321 {
@@ -248,9 +334,9 @@ private static SyntaxNode EnsureVisibility<T>(T node, SyntaxTokenList originalMo
248334 }
249335
250336 modifierList = SyntaxFactory . TokenList ( list ) ;
337+ return withModifiers ( node , modifierList ) ;
251338 }
252339
253- return withModifiers ( node , modifierList ) ;
254340 }
255341 }
256342 }
0 commit comments