@@ -36,9 +36,20 @@ public final class NoAccessLevelOnExtensionDeclaration: SyntaxFormatRule {
36
36
// Public, private, or fileprivate keywords need to be moved to members
37
37
case . publicKeyword, . privateKeyword, . fileprivateKeyword:
38
38
diagnose ( . moveAccessKeyword( keyword: accessKeyword. name. text) , on: accessKeyword)
39
+
40
+ // The effective access level of the members of a `private` extension is `fileprivate`, so
41
+ // we have to update the keyword to ensure that the result is correct.
42
+ let accessKeywordToAdd : DeclModifierSyntax
43
+ if keywordKind == . privateKeyword {
44
+ accessKeywordToAdd
45
+ = accessKeyword. withName ( accessKeyword. name. withKind ( . fileprivateKeyword) )
46
+ } else {
47
+ accessKeywordToAdd = accessKeyword
48
+ }
49
+
39
50
let newMembers = SyntaxFactory . makeMemberDeclBlock (
40
51
leftBrace: node. members. leftBrace,
41
- members: addMemberAccessKeywords ( memDeclBlock: node. members, keyword: accessKeyword ) ,
52
+ members: addMemberAccessKeywords ( memDeclBlock: node. members, keyword: accessKeywordToAdd ) ,
42
53
rightBrace: node. members. rightBrace)
43
54
let newKeyword = replaceTrivia (
44
55
on: node. extensionKeyword,
@@ -47,6 +58,7 @@ public final class NoAccessLevelOnExtensionDeclaration: SyntaxFormatRule {
47
58
return node. withMembers ( newMembers)
48
59
. withModifiers ( modifiers. remove ( name: accessKeyword. name. text) )
49
60
. withExtensionKeyword ( newKeyword)
61
+
50
62
// Internal keyword redundant, delete
51
63
case . internalKeyword:
52
64
diagnose (
@@ -58,6 +70,7 @@ public final class NoAccessLevelOnExtensionDeclaration: SyntaxFormatRule {
58
70
leadingTrivia: accessKeyword. leadingTrivia) as! TokenSyntax
59
71
return node. withModifiers ( modifiers. remove ( name: accessKeyword. name. text) )
60
72
. withExtensionKeyword ( newKeyword)
73
+
61
74
default :
62
75
break
63
76
}
0 commit comments