@@ -208,36 +208,44 @@ function create(context: RuleContext): RuleListener {
208208 }
209209
210210 function * fixAllRemoveKeys ( fixer : RuleFixer , nodes : JSONAST . JSONNode [ ] ) {
211- const ranges = nodes . map ( node => fixRemoveRange ( node ) )
212-
211+ const removed = new Set < JSONAST . JSONNode > ( )
213212 let preLast = 0
214- for ( const range of ranges ) {
215- yield fixer . removeRange ( [ Math . max ( preLast , range [ 0 ] ) , range [ 1 ] ] )
213+ for ( const node of nodes ) {
214+ const range = fixRemoveRange ( node , removed )
215+ const start = Math . max ( preLast , range [ 0 ] )
216+ yield fixer . removeRange ( [ start , range [ 1 ] ] )
216217 preLast = range [ 1 ]
217218 }
218219 }
219220
220- /**
221- * @param { JSONNode } node
222- */
223- function fixRemoveRange ( node : JSONAST . JSONNode ) : Range {
221+ function fixRemoveRange (
222+ node : JSONAST . JSONNode ,
223+ removedNodes : Set < JSONAST . JSONNode > = new Set ( )
224+ ) : Range {
224225 const parent = node . parent !
225226 let removeNode
226227 let isFirst = false
227228 let isLast = false
228229 if ( parent . type === 'JSONProperty' ) {
229230 removeNode = parent
230- const index = parent . parent . properties . indexOf ( parent )
231+ const properties = parent . parent . properties . filter (
232+ p => ! removedNodes . has ( p )
233+ )
234+ const index = properties . indexOf ( parent )
231235 isFirst = index === 0
232- isLast = index === parent . parent . properties . length - 1
236+ isLast = index === properties . length - 1
233237 } else {
234238 removeNode = node
235239 if ( parent . type === 'JSONArrayExpression' ) {
236- const index = parent . elements . indexOf ( node as never )
240+ const elements = parent . elements . filter (
241+ e => e == null || ! removedNodes . has ( e )
242+ )
243+ const index = elements . indexOf ( node as never )
237244 isFirst = index === 0
238- isLast = index === parent . elements . length - 1
245+ isLast = index === elements . length - 1
239246 }
240247 }
248+ removedNodes . add ( removeNode )
241249 const range : Range = [ ...removeNode . range ]
242250
243251 if ( isLast || isFirst ) {
0 commit comments