Skip to content

Commit 3676fda

Browse files
committed
Reset to start
1 parent 1c246d3 commit 3676fda

File tree

5 files changed

+15
-12
lines changed

5 files changed

+15
-12
lines changed

crates/swc_ecma_parser/src/lexer/capturing.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::mem;
22

33
use swc_atoms::Atom;
4+
use swc_common::BytePos;
45

56
use crate::{
67
error::Error,
@@ -162,8 +163,8 @@ impl<I: Tokens> Tokens for Capturing<I> {
162163
self.inner.set_token_value(token_value);
163164
}
164165

165-
fn scan_regex(&mut self) -> (TokenAndSpan, Option<(Atom, Atom)>) {
166-
let result = self.inner.scan_regex();
166+
fn scan_regex(&mut self, start: BytePos) -> (TokenAndSpan, Option<(Atom, Atom)>) {
167+
let result = self.inner.scan_regex(start);
167168
self.capture(result.0);
168169
result
169170
}

crates/swc_ecma_parser/src/lexer/mod.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1785,10 +1785,13 @@ impl<'a> Lexer<'a> {
17851785
}
17861786

17871787
/// Expects current char to be '/'
1788-
pub(crate) fn read_regexp(&mut self) -> LexResult<(Atom, Atom)> {
1789-
debug_assert_eq!(self.cur(), Some('/'));
1788+
pub(crate) fn read_regexp(&mut self, start: BytePos) -> LexResult<(Atom, Atom)> {
1789+
unsafe {
1790+
// Safety: start is valid position, and cur() is Some('/')
1791+
self.input_mut().reset_to(start);
1792+
}
17901793

1791-
let start = self.cur_pos();
1794+
debug_assert_eq!(self.cur(), Some('/'));
17921795

17931796
self.bump(); // bump '/'
17941797

crates/swc_ecma_parser/src/lexer/state.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,9 +163,8 @@ impl crate::input::Tokens for Lexer<'_> {
163163
self.state.token_value.take()
164164
}
165165

166-
fn scan_regex(&mut self) -> (TokenAndSpan, Option<(Atom, Atom)>) {
167-
let start = self.cur_pos();
168-
let (token, ret) = match self.read_regexp() {
166+
fn scan_regex(&mut self, start: BytePos) -> (TokenAndSpan, Option<(Atom, Atom)>) {
167+
let (token, ret) = match self.read_regexp(start) {
169168
Ok(ret) => (Token::Regex, Some(ret)),
170169
Err(error) => {
171170
self.state.set_token_value(TokenValue::Error(error));

crates/swc_ecma_parser/src/parser/expr.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2592,7 +2592,7 @@ impl<I: Tokens> Parser<I> {
25922592
// Regexp
25932593
debug_assert!(self.input().cur() == Token::Slash || self.input().cur() == Token::DivEq);
25942594

2595-
let Some((exp, flags)) = self.input_mut().scan_regex() else {
2595+
let Some((exp, flags)) = self.input_mut().scan_regex(start) else {
25962596
let error = self.input_mut().expect_error_token_and_bump();
25972597
return Err(error);
25982598
};

crates/swc_ecma_parser/src/parser/input.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ pub trait Tokens: Clone + Iterator<Item = TokenAndSpan> {
5959
fn get_token_value(&self) -> Option<&TokenValue>;
6060
fn set_token_value(&mut self, token_value: Option<TokenValue>);
6161

62-
fn scan_regex(&mut self) -> (TokenAndSpan, Option<(Atom, Atom)>);
62+
fn scan_regex(&mut self, start: BytePos) -> (TokenAndSpan, Option<(Atom, Atom)>);
6363
fn scan_jsx_token(&mut self, allow_multiline_jsx_text: bool) -> TokenAndSpan;
6464
fn scan_jsx_open_el_terminal_token(&mut self) -> TokenAndSpan;
6565
fn rescan_jsx_open_el_terminal_token(&mut self, reset: BytePos) -> TokenAndSpan;
@@ -139,9 +139,9 @@ impl<I: Tokens> Buffer<I> {
139139
self.iter.get_token_value()
140140
}
141141

142-
pub(crate) fn scan_regex(&mut self) -> Option<(Atom, Atom)> {
142+
pub(crate) fn scan_regex(&mut self, start: BytePos) -> Option<(Atom, Atom)> {
143143
let prev = self.cur;
144-
let (t, ret) = self.iter.scan_regex();
144+
let (t, ret) = self.iter.scan_regex(start);
145145
self.prev_span = prev.span;
146146
self.set_cur(t);
147147
ret

0 commit comments

Comments
 (0)