@@ -148,104 +148,117 @@ private extension PrivateOverFilePrivateRule {
148148 // don't call super in any of the `visit` methods to avoid digging into the children
149149 override func visit( _ node: ExtensionDeclSyntax ) -> DeclSyntax {
150150 guard validateExtensions, let modifier = node. modifiers. fileprivateModifier,
151+ let modifierIndex = node. modifiers. fileprivateModifierIndex,
151152 !node. isContainedIn ( regions: disabledRegions, locationConverter: locationConverter) else {
152153 return DeclSyntax ( node)
153154 }
154155
155156 correctionPositions. append ( modifier. positionAfterSkippingLeadingTrivia)
156- let newNode = node. with ( \. modifiers, node. modifiers? . replacing ( fileprivateModifier : modifier ) )
157+ let newNode = node. with ( \. modifiers, node. modifiers? . replacing ( fileprivateModifierIndex : modifierIndex ) )
157158 return DeclSyntax ( newNode)
158159 }
159160
160161 override func visit( _ node: ClassDeclSyntax ) -> DeclSyntax {
161162 guard let modifier = node. modifiers. fileprivateModifier,
163+ let modifierIndex = node. modifiers. fileprivateModifierIndex,
162164 !node. isContainedIn ( regions: disabledRegions, locationConverter: locationConverter) else {
163165 return DeclSyntax ( node)
164166 }
165167
166168 correctionPositions. append ( modifier. positionAfterSkippingLeadingTrivia)
167- let newNode = node. with ( \. modifiers, node. modifiers? . replacing ( fileprivateModifier : modifier ) )
169+ let newNode = node. with ( \. modifiers, node. modifiers? . replacing ( fileprivateModifierIndex : modifierIndex ) )
168170 return DeclSyntax ( newNode)
169171 }
170172
171173 override func visit( _ node: StructDeclSyntax ) -> DeclSyntax {
172174 guard let modifier = node. modifiers. fileprivateModifier,
175+ let modifierIndex = node. modifiers. fileprivateModifierIndex,
173176 !node. isContainedIn ( regions: disabledRegions, locationConverter: locationConverter) else {
174177 return DeclSyntax ( node)
175178 }
176179
177180 correctionPositions. append ( modifier. positionAfterSkippingLeadingTrivia)
178- let newNode = node. with ( \. modifiers, node. modifiers? . replacing ( fileprivateModifier : modifier ) )
181+ let newNode = node. with ( \. modifiers, node. modifiers? . replacing ( fileprivateModifierIndex : modifierIndex ) )
179182 return DeclSyntax ( newNode)
180183 }
181184
182185 override func visit( _ node: EnumDeclSyntax ) -> DeclSyntax {
183186 guard let modifier = node. modifiers. fileprivateModifier,
187+ let modifierIndex = node. modifiers. fileprivateModifierIndex,
184188 !node. isContainedIn ( regions: disabledRegions, locationConverter: locationConverter) else {
185189 return DeclSyntax ( node)
186190 }
187191
188192 correctionPositions. append ( modifier. positionAfterSkippingLeadingTrivia)
189- let newNode = node. with ( \. modifiers, node. modifiers? . replacing ( fileprivateModifier : modifier ) )
193+ let newNode = node. with ( \. modifiers, node. modifiers? . replacing ( fileprivateModifierIndex : modifierIndex ) )
190194 return DeclSyntax ( newNode)
191195 }
192196
193197 override func visit( _ node: ProtocolDeclSyntax ) -> DeclSyntax {
194198 guard let modifier = node. modifiers. fileprivateModifier,
199+ let modifierIndex = node. modifiers. fileprivateModifierIndex,
195200 !node. isContainedIn ( regions: disabledRegions, locationConverter: locationConverter) else {
196201 return DeclSyntax ( node)
197202 }
198203
199204 correctionPositions. append ( modifier. positionAfterSkippingLeadingTrivia)
200- let newNode = node. with ( \. modifiers, node. modifiers? . replacing ( fileprivateModifier : modifier ) )
205+ let newNode = node. with ( \. modifiers, node. modifiers? . replacing ( fileprivateModifierIndex : modifierIndex ) )
201206 return DeclSyntax ( newNode)
202207 }
203208
204209 override func visit( _ node: FunctionDeclSyntax ) -> DeclSyntax {
205210 guard let modifier = node. modifiers. fileprivateModifier,
211+ let modifierIndex = node. modifiers. fileprivateModifierIndex,
206212 !node. isContainedIn ( regions: disabledRegions, locationConverter: locationConverter) else {
207213 return DeclSyntax ( node)
208214 }
209215
210216 correctionPositions. append ( modifier. positionAfterSkippingLeadingTrivia)
211- let newNode = node. with ( \. modifiers, node. modifiers? . replacing ( fileprivateModifier : modifier ) )
217+ let newNode = node. with ( \. modifiers, node. modifiers? . replacing ( fileprivateModifierIndex : modifierIndex ) )
212218 return DeclSyntax ( newNode)
213219 }
214220
215221 override func visit( _ node: VariableDeclSyntax ) -> DeclSyntax {
216222 guard let modifier = node. modifiers. fileprivateModifier,
223+ let modifierIndex = node. modifiers. fileprivateModifierIndex,
217224 !node. isContainedIn ( regions: disabledRegions, locationConverter: locationConverter) else {
218225 return DeclSyntax ( node)
219226 }
220227
221228 correctionPositions. append ( modifier. positionAfterSkippingLeadingTrivia)
222- let newNode = node. with ( \. modifiers, node. modifiers? . replacing ( fileprivateModifier : modifier ) )
229+ let newNode = node. with ( \. modifiers, node. modifiers? . replacing ( fileprivateModifierIndex : modifierIndex ) )
223230 return DeclSyntax ( newNode)
224231 }
225232
226233 override func visit( _ node: TypealiasDeclSyntax ) -> DeclSyntax {
227234 guard let modifier = node. modifiers. fileprivateModifier,
235+ let modifierIndex = node. modifiers. fileprivateModifierIndex,
228236 !node. isContainedIn ( regions: disabledRegions, locationConverter: locationConverter) else {
229237 return DeclSyntax ( node)
230238 }
231239
232240 correctionPositions. append ( modifier. positionAfterSkippingLeadingTrivia)
233- let newNode = node. with ( \. modifiers, node. modifiers? . replacing ( fileprivateModifier : modifier ) )
241+ let newNode = node. with ( \. modifiers, node. modifiers? . replacing ( fileprivateModifierIndex : modifierIndex ) )
234242 return DeclSyntax ( newNode)
235243 }
236244 }
237245}
238246
239247private extension ModifierListSyntax ? {
248+ var fileprivateModifierIndex : ModifierListSyntax . Index ? {
249+ self ? . firstIndex ( where: { $0. name. tokenKind == . keyword( . fileprivate) } )
250+ }
251+
240252 var fileprivateModifier : DeclModifierSyntax ? {
241- self ? . first { $0 . name . tokenKind == . keyword ( . fileprivate ) }
253+ fileprivateModifierIndex . flatMap { self ? [ $0 ] }
242254 }
243255}
244256
245257private extension ModifierListSyntax {
246- func replacing( fileprivateModifier: DeclModifierSyntax ) -> ModifierListSyntax ? {
247- replacing (
248- childAt: fileprivateModifier. indexInParent,
258+ func replacing( fileprivateModifierIndex: ModifierListSyntax . Index ) -> ModifierListSyntax ? {
259+ let fileprivateModifier = self [ fileprivateModifierIndex]
260+ return replacing (
261+ childAt: self . distance ( from: self . startIndex, to: fileprivateModifierIndex) ,
249262 with: fileprivateModifier. with (
250263 \. name,
251264 . keyword(
0 commit comments