@@ -33,6 +33,7 @@ import { joinWithAnd } from '../../util/joinWithAnd'
33
33
import { getLanguageBoundaries } from '../../util/getLanguageBoundaries'
34
34
import { isCssDoc } from '../../util/css'
35
35
import { absoluteRange } from '../../util/absoluteRange'
36
+ import type { NodeSource , Root } from 'postcss'
36
37
37
38
async function getDiagnosticsFromCodeActionParams (
38
39
state : State ,
@@ -201,6 +202,19 @@ async function provideUtilityConflictsCodeActions(
201
202
]
202
203
}
203
204
205
+ function postcssSourceToRange ( source : NodeSource ) : Range {
206
+ return {
207
+ start : {
208
+ line : source . start . line - 1 ,
209
+ character : source . start . column - 1 ,
210
+ } ,
211
+ end : {
212
+ line : source . end . line - 1 ,
213
+ character : source . end . column ,
214
+ } ,
215
+ }
216
+ }
217
+
204
218
async function provideInvalidApplyCodeActions (
205
219
state : State ,
206
220
params : CodeActionParams ,
@@ -211,7 +225,7 @@ async function provideInvalidApplyCodeActions(
211
225
let cssRange : Range
212
226
let cssText = documentText
213
227
const { postcss } = state . modules
214
- let change : TextEdit
228
+ let changes : TextEdit [ ] = [ ]
215
229
216
230
let totalClassNamesInClassList = diagnostic . className . classList . classList . split (
217
231
/ \s + /
@@ -238,30 +252,18 @@ async function provideInvalidApplyCodeActions(
238
252
try {
239
253
await postcss ( [
240
254
postcss . plugin ( '' , ( _options = { } ) => {
241
- return ( root ) => {
255
+ return ( root : Root ) => {
242
256
root . walkRules ( ( rule ) => {
243
- if ( change ) return false
257
+ if ( changes . length ) return false
244
258
245
259
rule . walkAtRules ( 'apply' , ( atRule ) => {
246
- let { start, end } = atRule . source
247
- let atRuleRange : Range = {
248
- start : {
249
- line : start . line - 1 ,
250
- character : start . column - 1 ,
251
- } ,
252
- end : {
253
- line : end . line - 1 ,
254
- character : end . column - 1 ,
255
- } ,
256
- }
260
+ let atRuleRange = postcssSourceToRange ( atRule . source )
257
261
if ( cssRange ) {
258
262
atRuleRange = absoluteRange ( atRuleRange , cssRange )
259
263
}
260
264
261
- if ( ! isWithinRange ( diagnostic . range . start , atRuleRange ) ) {
262
- // keep looking
265
+ if ( ! isWithinRange ( diagnostic . range . start , atRuleRange ) )
263
266
return true
264
- }
265
267
266
268
let ast = classNameToAst (
267
269
state ,
@@ -270,35 +272,33 @@ async function provideInvalidApplyCodeActions(
270
272
diagnostic . className . classList . important
271
273
)
272
274
273
- if ( ! ast ) {
274
- return false
275
- }
275
+ if ( ! ast ) return false
276
276
277
277
rule . after ( ast . nodes )
278
278
let insertedRule = rule . next ( )
279
+ if ( ! insertedRule ) return false
279
280
280
281
if ( totalClassNamesInClassList === 1 ) {
281
282
atRule . remove ( )
283
+ } else {
284
+ changes . push ( {
285
+ range : diagnostic . className . classList . range ,
286
+ newText : removeRangesFromString (
287
+ diagnostic . className . classList . classList ,
288
+ diagnostic . className . relativeRange
289
+ ) ,
290
+ } )
282
291
}
283
292
284
- let outputIndent : string
285
- let documentIndent = detectIndent ( documentText )
286
-
287
- let ruleRange : Range = {
288
- start : {
289
- line : rule . source . start . line - 1 ,
290
- character : rule . source . start . column - 1 ,
291
- } ,
292
- end : {
293
- line : rule . source . end . line - 1 ,
294
- character : rule . source . end . column ,
295
- } ,
296
- }
293
+ let ruleRange = postcssSourceToRange ( rule . source )
297
294
if ( cssRange ) {
298
295
ruleRange = absoluteRange ( ruleRange , cssRange )
299
296
}
300
297
301
- change = {
298
+ let outputIndent : string
299
+ let documentIndent = detectIndent ( documentText )
300
+
301
+ changes . push ( {
302
302
range : ruleRange ,
303
303
newText :
304
304
rule . toString ( ) +
@@ -315,7 +315,7 @@ async function provideInvalidApplyCodeActions(
315
315
documentIndent . indent
316
316
)
317
317
} ) ,
318
- }
318
+ } )
319
319
320
320
return false
321
321
} )
@@ -327,7 +327,7 @@ async function provideInvalidApplyCodeActions(
327
327
return [ ]
328
328
}
329
329
330
- if ( ! change ) {
330
+ if ( ! changes . length ) {
331
331
return [ ]
332
332
}
333
333
@@ -338,20 +338,7 @@ async function provideInvalidApplyCodeActions(
338
338
diagnostics : [ diagnostic ] ,
339
339
edit : {
340
340
changes : {
341
- [ params . textDocument . uri ] : [
342
- ...( totalClassNamesInClassList > 1
343
- ? [
344
- {
345
- range : diagnostic . className . classList . range ,
346
- newText : removeRangesFromString (
347
- diagnostic . className . classList . classList ,
348
- diagnostic . className . relativeRange
349
- ) ,
350
- } ,
351
- ]
352
- : [ ] ) ,
353
- change ,
354
- ] ,
341
+ [ params . textDocument . uri ] : changes ,
355
342
} ,
356
343
} ,
357
344
} ,
0 commit comments