@@ -33,21 +33,24 @@ export function findLast(re: RegExp, str: string): RegExpMatchArray {
33
33
}
34
34
35
35
export function getClassNamesInClassList (
36
- { classList, range, important } : DocumentClassList ,
36
+ { classList, span , range, important } : DocumentClassList ,
37
37
blocklist : State [ 'blocklist' ] ,
38
38
) : DocumentClassName [ ] {
39
39
const parts = classList . split ( / ( \s + ) / )
40
40
const names : DocumentClassName [ ] = [ ]
41
41
let index = 0
42
42
for ( let i = 0 ; i < parts . length ; i ++ ) {
43
43
if ( i % 2 === 0 && ! blocklist . includes ( parts [ i ] ) ) {
44
+ const classNameSpan = [ index , index + parts [ i ] . length ]
44
45
const start = indexToPosition ( classList , index )
45
46
const end = indexToPosition ( classList , index + parts [ i ] . length )
46
47
names . push ( {
47
48
className : parts [ i ] ,
49
+ span : [ span [ 0 ] + classNameSpan [ 0 ] , span [ 0 ] + classNameSpan [ 1 ] ] ,
48
50
classList : {
49
51
classList,
50
52
range,
53
+ span,
51
54
important,
52
55
} ,
53
56
relativeRange : {
@@ -107,11 +110,19 @@ export function findClassListsInCssRange(
107
110
const matches = findAll ( regex , text )
108
111
const globalStart : Position = range ? range . start : { line : 0 , character : 0 }
109
112
113
+ const rangeStartOffset = doc . offsetAt ( globalStart )
114
+
110
115
return matches . map ( ( match ) => {
111
- const start = indexToPosition ( text , match . index + match [ 1 ] . length )
112
- const end = indexToPosition ( text , match . index + match [ 1 ] . length + match . groups . classList . length )
116
+ let span = [
117
+ match . index + match [ 1 ] . length ,
118
+ match . index + match [ 1 ] . length + match . groups . classList . length ,
119
+ ] as [ number , number ]
120
+
121
+ const start = indexToPosition ( text , span [ 0 ] )
122
+ const end = indexToPosition ( text , span [ 1 ] )
113
123
return {
114
124
classList : match . groups . classList ,
125
+ span : [ rangeStartOffset + span [ 0 ] , rangeStartOffset + span [ 1 ] ] ,
115
126
important : Boolean ( match . groups . important ) ,
116
127
range : {
117
128
start : {
@@ -143,6 +154,7 @@ async function findCustomClassLists(
143
154
for ( let match of customClassesIn ( { text, filters : regexes } ) ) {
144
155
result . push ( {
145
156
classList : match . classList ,
157
+ span : match . range ,
146
158
range : {
147
159
start : doc . positionAt ( match . range [ 0 ] ) ,
148
160
end : doc . positionAt ( match . range [ 1 ] ) ,
@@ -179,6 +191,8 @@ export async function findClassListsInHtmlRange(
179
191
180
192
const result : DocumentClassList [ ] = [ ]
181
193
194
+ const rangeStartOffset = doc . offsetAt ( range ?. start || { line : 0 , character : 0 } )
195
+
182
196
matches . forEach ( ( match ) => {
183
197
const subtext = text . substr ( match . index + match [ 0 ] . length - 1 )
184
198
@@ -234,17 +248,17 @@ export async function findClassListsInHtmlRange(
234
248
const after = value . match ( / \s * $ / )
235
249
const afterOffset = after === null ? 0 : - after [ 0 ] . length
236
250
237
- const start = indexToPosition (
238
- text ,
251
+ let span = [
239
252
match . index + match [ 0 ] . length - 1 + offset + beforeOffset ,
240
- )
241
- const end = indexToPosition (
242
- text ,
243
253
match . index + match [ 0 ] . length - 1 + offset + value . length + afterOffset ,
244
- )
254
+ ]
255
+
256
+ const start = indexToPosition ( text , span [ 0 ] )
257
+ const end = indexToPosition ( text , span [ 1 ] )
245
258
246
259
return {
247
260
classList : value . substr ( beforeOffset , value . length + afterOffset ) ,
261
+ span : [ rangeStartOffset + span [ 0 ] , rangeStartOffset + span [ 1 ] ] as [ number , number ] ,
248
262
range : {
249
263
start : {
250
264
line : ( range ?. start . line || 0 ) + start . line ,
@@ -356,6 +370,8 @@ export function findHelperFunctionsInRange(
356
370
text ,
357
371
)
358
372
373
+ let rangeStartOffset = range ?. start ? doc . offsetAt ( range . start ) : 0
374
+
359
375
// Eliminate matches that are on an `@import`
360
376
matches = matches . filter ( ( match ) => {
361
377
// Scan backwards to see if we're in an `@import` statement
@@ -422,6 +438,16 @@ export function findHelperFunctionsInRange(
422
438
range ,
423
439
) ,
424
440
} ,
441
+ spans : {
442
+ full : [
443
+ rangeStartOffset + startIndex ,
444
+ rangeStartOffset + startIndex + match . groups . path . length ,
445
+ ] ,
446
+ path : [
447
+ rangeStartOffset + startIndex + quotesBefore . length ,
448
+ rangeStartOffset + startIndex + quotesBefore . length + path . length ,
449
+ ] ,
450
+ } ,
425
451
}
426
452
} )
427
453
}
0 commit comments