@@ -174,9 +174,7 @@ export class SelectorParser {
174174
175175 // Check for leading combinator (relative selector) if allowed
176176 if ( allow_relative && this . lexer . pos < this . selector_end ) {
177- let saved_pos = this . lexer . pos
178- let saved_line = this . lexer . line
179- let saved_column = this . lexer . column
177+ const saved = this . lexer . save_position ( )
180178
181179 this . lexer . next_token_fast ( false )
182180 let token_type = this . lexer . token_type
@@ -192,15 +190,11 @@ export class SelectorParser {
192190 // Continue to parse the rest normally
193191 } else {
194192 // Not a combinator, restore position
195- this . lexer . pos = saved_pos
196- this . lexer . line = saved_line
197- this . lexer . column = saved_column
193+ this . lexer . restore_position ( saved )
198194 }
199195 } else {
200196 // Not a delimiter, restore position
201- this . lexer . pos = saved_pos
202- this . lexer . line = saved_line
203- this . lexer . column = saved_column
197+ this . lexer . restore_position ( saved )
204198 }
205199 }
206200
@@ -225,25 +219,19 @@ export class SelectorParser {
225219 }
226220
227221 // Peek ahead for comma or end
228- let saved_pos = this . lexer . pos
229- let saved_line = this . lexer . line
230- let saved_column = this . lexer . column
222+ const saved = this . lexer . save_position ( )
231223 this . skip_whitespace ( )
232224 if ( this . lexer . pos >= this . selector_end ) break
233225
234226 this . lexer . next_token_fast ( false )
235227 let token_type = this . lexer . token_type
236228 if ( token_type === TOKEN_COMMA || this . lexer . pos >= this . selector_end ) {
237229 // Reset position for comma handling
238- this . lexer . pos = saved_pos
239- this . lexer . line = saved_line
240- this . lexer . column = saved_column
230+ this . lexer . restore_position ( saved )
241231 break
242232 }
243233 // Reset for next iteration
244- this . lexer . pos = saved_pos
245- this . lexer . line = saved_line
246- this . lexer . column = saved_column
234+ this . lexer . restore_position ( saved )
247235 break
248236 }
249237
@@ -271,9 +259,7 @@ export class SelectorParser {
271259
272260 while ( this . lexer . pos < this . selector_end ) {
273261 // Save lexer state before getting token
274- let saved_pos = this . lexer . pos
275- let saved_line = this . lexer . line
276- let saved_column = this . lexer . column
262+ const saved = this . lexer . save_position ( )
277263 this . lexer . next_token_fast ( false )
278264
279265 if ( this . lexer . token_start >= this . selector_end ) break
@@ -286,9 +272,7 @@ export class SelectorParser {
286272 parts . push ( part )
287273 } else {
288274 // Not a simple selector part, restore lexer state and break
289- this . lexer . pos = saved_pos
290- this . lexer . line = saved_line
291- this . lexer . column = saved_column
275+ this . lexer . restore_position ( saved )
292276 break
293277 }
294278 }
@@ -409,17 +393,13 @@ export class SelectorParser {
409393 // Parse class selector (.classname)
410394 private parse_class_selector ( dot_pos : number ) : number | null {
411395 // Save lexer state for potential restoration
412- let saved_pos = this . lexer . pos
413- let saved_line = this . lexer . line
414- let saved_column = this . lexer . column
396+ const saved = this . lexer . save_position ( )
415397
416398 // Next token should be identifier
417399 this . lexer . next_token_fast ( false )
418400 if ( this . lexer . token_type !== TOKEN_IDENT ) {
419401 // Restore lexer state and return null
420- this . lexer . pos = saved_pos
421- this . lexer . line = saved_line
422- this . lexer . column = saved_column
402+ this . lexer . restore_position ( saved )
423403 return null
424404 }
425405
@@ -607,9 +587,7 @@ export class SelectorParser {
607587 // Parse pseudo-class or pseudo-element (:hover, ::before)
608588 private parse_pseudo ( start : number ) : number | null {
609589 // Save lexer state for potential restoration
610- let saved_pos = this . lexer . pos
611- let saved_line = this . lexer . line
612- let saved_column = this . lexer . column
590+ const saved = this . lexer . save_position ( )
613591
614592 // Check for double colon (::)
615593 let is_pseudo_element = false
@@ -643,9 +621,7 @@ export class SelectorParser {
643621 }
644622
645623 // Restore lexer state and return null
646- this . lexer . pos = saved_pos
647- this . lexer . line = saved_line
648- this . lexer . column = saved_column
624+ this . lexer . restore_position ( saved )
649625 return null
650626 }
651627
@@ -716,9 +692,7 @@ export class SelectorParser {
716692 // Parse as selector (for :is(), :where(), :has(), etc.)
717693 // Save current lexer state and selector_end
718694 let saved_selector_end = this . selector_end
719- let saved_pos = this . lexer . pos
720- let saved_line = this . lexer . line
721- let saved_column = this . lexer . column
695+ const saved = this . lexer . save_position ( )
722696
723697 // Recursively parse the content as a selector
724698 // Only :has() accepts relative selectors (starting with combinator)
@@ -727,9 +701,7 @@ export class SelectorParser {
727701
728702 // Restore lexer state and selector_end
729703 this . selector_end = saved_selector_end
730- this . lexer . pos = saved_pos
731- this . lexer . line = saved_line
732- this . lexer . column = saved_column
704+ this . lexer . restore_position ( saved )
733705
734706 // Add as child if parsed successfully
735707 if ( child_selector !== null ) {
@@ -759,9 +731,7 @@ export class SelectorParser {
759731 private parse_lang_identifiers ( start : number , end : number , parent_node : number ) : void {
760732 // Save current lexer state
761733 let saved_selector_end = this . selector_end
762- let saved_pos = this . lexer . pos
763- let saved_line = this . lexer . line
764- let saved_column = this . lexer . column
734+ const saved = this . lexer . save_position ( )
765735
766736 // Set lexer to parse this range
767737 this . lexer . pos = start
@@ -822,9 +792,7 @@ export class SelectorParser {
822792
823793 // Restore lexer state
824794 this . selector_end = saved_selector_end
825- this . lexer . pos = saved_pos
826- this . lexer . line = saved_line
827- this . lexer . column = saved_column
795+ this . lexer . restore_position ( saved )
828796 }
829797
830798 // Parse An+B expression for nth-* pseudo-classes
@@ -846,9 +814,7 @@ export class SelectorParser {
846814
847815 // Save current state
848816 let saved_selector_end = this . selector_end
849- let saved_pos = this . lexer . pos
850- let saved_line = this . lexer . line
851- let saved_column = this . lexer . column
817+ const saved = this . lexer . save_position ( )
852818
853819 // Parse selector list
854820 this . selector_end = end
@@ -857,9 +823,7 @@ export class SelectorParser {
857823
858824 // Restore state
859825 this . selector_end = saved_selector_end
860- this . lexer . pos = saved_pos
861- this . lexer . line = saved_line
862- this . lexer . column = saved_column
826+ this . lexer . restore_position ( saved )
863827
864828 // Create NTH_OF wrapper
865829 let of_node = this . arena . create_node ( )
0 commit comments