@@ -109,10 +109,12 @@ export class CSSParser {
109109 const duplicate = new Set < string > ( )
110110 for ( const error of errors ) {
111111 const errorLoc =
112- getESLintLineAndColumnFromPostCSSPosition (
113- offsetLocation ,
114- error ,
115- ) || offsetLocation
112+ error . line != null && error . column != null
113+ ? getESLintLineAndColumnFromPostCSSPosition (
114+ offsetLocation ,
115+ error ,
116+ )
117+ : offsetLocation
116118 const message = error . reason || error . message
117119
118120 const key = `[${ errorLoc . line } :${ errorLoc . column } ]: ${ message } `
@@ -241,7 +243,7 @@ export class CSSParser {
241243 loc : SourceLocation ,
242244 start : number ,
243245 end : number ,
244- ) {
246+ ) : VCSSNode | null {
245247 return new VCSSStyleSheet ( node , loc , start , end , { lang : this . lang } )
246248 }
247249
@@ -260,24 +262,27 @@ export class CSSParser {
260262 start : number ,
261263 end : number ,
262264 parent : VCSSContainerNode ,
263- ) {
264- const astNode = new VCSSStyleRule ( node , loc , start , end , { parent } )
265+ ) : VCSSNode | null {
266+ const astNode = new VCSSStyleRule ( node , loc , start , end , {
267+ parent,
268+ rawSelectorText : this . getRaw ( node , "selector" ) ?. raw ?? null ,
269+ } )
265270 astNode . selectors = this . selectorParser . parse (
266271 astNode . rawSelectorText ,
267272 astNode . loc . start ,
268273 astNode ,
269274 )
270275
271- if ( node . raws . between ?. trim ( ) ) {
276+ if ( this . getRaw ( node , " between" ) ?. trim ( ) ) {
272277 this . parseRuleRawsBetween ( node , astNode )
273278 }
274279
275280 return astNode
276281 }
277282
278283 protected parseRuleRawsBetween ( node : PostCSSRule , astNode : VCSSNode ) {
279- const { between } = node . raws
280- const rawSelector = node . raws . selector ?. raw ?? node . selector
284+ const between = this . getRaw ( node , "between" )
285+ const rawSelector = this . getRaw ( node , " selector" ) ?. raw ?? node . selector
281286 const betweenStart = astNode . range [ 0 ] + rawSelector . length
282287 const postcssRoot = this . parseInternal ( between || "" ) as PostCSSRoot
283288
@@ -302,15 +307,19 @@ export class CSSParser {
302307 start : number ,
303308 end : number ,
304309 parent : VCSSContainerNode ,
305- ) {
306- const astNode = new VCSSAtRule ( node , loc , start , end , { parent } )
310+ ) : VCSSNode | null {
311+ const astNode = new VCSSAtRule ( node , loc , start , end , {
312+ parent,
313+ rawParamsText : this . getRaw ( node , "params" ) ?. raw ?? null ,
314+ identifier : this . getRaw ( node as any , "identifier" ) ?? "@" ,
315+ } )
307316 if ( node . name === "nest" ) {
308317 // The parameters following `@nest` are parsed as selectors.
309318 const paramsStartIndex =
310319 astNode . range [ 0 ] + // start index of at-rule
311- 1 + // `@`
320+ astNode . identifier . length + // `@`
312321 astNode . name . length + // `nest`
313- ( node . raws . afterName || "" ) . length // comments and spaces
322+ ( this . getRaw ( node , " afterName" ) || "" ) . length // comments and spaces
314323
315324 astNode . selectors = this . selectorParser . parse (
316325 astNode . rawParamsText ,
@@ -319,22 +328,22 @@ export class CSSParser {
319328 )
320329 }
321330
322- if ( node . raws . afterName ?. trim ( ) ) {
331+ if ( this . getRaw ( node , " afterName" ) ?. trim ( ) ) {
323332 this . parseAtruleRawsAfterName ( node , astNode )
324333 }
325- if ( node . raws . between ?. trim ( ) ) {
334+ if ( this . getRaw ( node , " between" ) ?. trim ( ) ) {
326335 this . parseAtruleRawsBetween ( node , astNode )
327336 }
328337
329338 return astNode
330339 }
331340
332341 private parseAtruleRawsAfterName ( node : PostCSSAtRule , astNode : VCSSAtRule ) {
333- const { afterName } = node . raws
342+ const afterName = this . getRaw ( node , "afterName" )
334343
335344 const afterNameStart =
336345 astNode . range [ 0 ] + // start index of at-rule
337- 1 + // `@`
346+ astNode . identifier . length + // `@`
338347 astNode . name . length // `nest`
339348 const postcssRoot = this . parseInternal ( afterName || "" ) as PostCSSRoot
340349
@@ -345,14 +354,14 @@ export class CSSParser {
345354 }
346355
347356 private parseAtruleRawsBetween ( node : PostCSSAtRule , astNode : VCSSAtRule ) {
348- const { between } = node . raws
357+ const between = this . getRaw ( node , "between" )
349358
350- const rawParams = node . raws . params ?. raw ?? node . params
359+ const rawParams = this . getRaw ( node , " params" ) ?. raw ?? node . params
351360 const betweenStart =
352361 astNode . range [ 0 ] + // start index of at-rule
353- 1 + // `@`
362+ astNode . identifier . length + // `@`
354363 astNode . name . length + // `nest`
355- ( node . raws . afterName || "" ) . length + // comments and spaces
364+ ( this . getRaw ( node , " afterName" ) || "" ) . length + // comments and spaces
356365 rawParams . length
357366
358367 const postcssRoot = this . parseInternal ( between || "" ) as PostCSSRoot
@@ -377,7 +386,7 @@ export class CSSParser {
377386 start : number ,
378387 end : number ,
379388 parent : VCSSContainerNode ,
380- ) {
389+ ) : VCSSNode | null {
381390 // adjust star hack
382391 // `*color: red`
383392 // ^
@@ -418,7 +427,7 @@ export class CSSParser {
418427 start : number ,
419428 end : number ,
420429 parent : VCSSContainerNode ,
421- ) : null {
430+ ) : VCSSNode | null {
422431 this . commentContainer . push (
423432 new VCSSComment ( node , node . text , loc , start , end , { parent } ) ,
424433 )
@@ -440,13 +449,20 @@ export class CSSParser {
440449 start : number ,
441450 end : number ,
442451 parent : VCSSContainerNode ,
443- ) {
452+ ) : VCSSNode | null {
444453 return new VCSSUnknown ( node , loc , start , end , {
445454 parent,
446455 unknownType : node . type ,
447456 } )
448457 }
449458
459+ protected getRaw < N extends PostCSSNode , K extends keyof N [ "raws" ] & string > (
460+ node : N ,
461+ keyName : K ,
462+ ) : N [ "raws" ] [ K ] {
463+ return ( node . raws as any ) [ keyName ]
464+ }
465+
450466 /* eslint-enable class-methods-use-this */
451467}
452468
0 commit comments