From 1f2e8b5ecbd982fedd5d1b9aa5fceeb92bac9db5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Sat, 22 Jun 2024 08:38:41 +0900 Subject: [PATCH 1/9] Some cond --- crates/swc_ecma_parser/src/lexer/state.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/crates/swc_ecma_parser/src/lexer/state.rs b/crates/swc_ecma_parser/src/lexer/state.rs index 07da5b7bda84..63645ec11f71 100644 --- a/crates/swc_ecma_parser/src/lexer/state.rs +++ b/crates/swc_ecma_parser/src/lexer/state.rs @@ -203,11 +203,10 @@ impl Lexer<'_> { if let Some(shebang) = self.read_shebang()? { return Ok(Some(Token::Shebang(shebang))); } + } else { + self.state.is_first = false; } - self.state.had_line_break = self.state.is_first; - self.state.is_first = false; - // skip spaces before getting next character, if we are allowed to. if self.state.can_skip_space() { self.skip_space::()?; @@ -377,7 +376,7 @@ impl State { State { is_expr_allowed: true, next_regexp: None, - had_line_break: false, + had_line_break: true, had_line_break_before_last: false, is_first: true, start: BytePos(0), From dada287183c8c7a07ca3b7be07fe6e2c50cf14a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Sat, 22 Jun 2024 08:40:34 +0900 Subject: [PATCH 2/9] #[cold] --- crates/swc_ecma_parser/src/lexer/state.rs | 81 +++++++++++++---------- 1 file changed, 45 insertions(+), 36 deletions(-) diff --git a/crates/swc_ecma_parser/src/lexer/state.rs b/crates/swc_ecma_parser/src/lexer/state.rs index 63645ec11f71..c8e7c6cb88e9 100644 --- a/crates/swc_ecma_parser/src/lexer/state.rs +++ b/crates/swc_ecma_parser/src/lexer/state.rs @@ -194,6 +194,50 @@ impl Tokens for Lexer<'_> { } impl Lexer<'_> { + /// Consume pending comments. + /// + /// This is called when the input is exhausted. + #[cold] + #[inline(never)] + fn consume_pending_comments(&mut self) { + if let Some(comments) = self.comments.as_mut() { + let comments_buffer = self.comments_buffer.as_mut().unwrap(); + let last = self.state.prev_hi; + + // move the pending to the leading or trailing + for c in comments_buffer.take_pending_leading() { + // if the file had no tokens and no shebang, then treat any + // comments in the leading comments buffer as leading. + // Otherwise treat them as trailing. + if last == self.start_pos { + comments_buffer.push(BufferedComment { + kind: BufferedCommentKind::Leading, + pos: last, + comment: c, + }); + } else { + comments_buffer.push(BufferedComment { + kind: BufferedCommentKind::Trailing, + pos: last, + comment: c, + }); + } + } + + // now fill the user's passed in comments + for comment in comments_buffer.take_comments() { + match comment.kind { + BufferedCommentKind::Leading => { + comments.add_leading(comment.pos, comment.comment); + } + BufferedCommentKind::Trailing => { + comments.add_trailing(comment.pos, comment.comment); + } + } + } + } + } + fn next_token(&mut self, start: &mut BytePos) -> Result, Error> { if let Some(start) = self.state.next_regexp { return Ok(Some(self.read_regexp(start)?)); @@ -217,42 +261,7 @@ impl Lexer<'_> { Some(..) => {} // End of input. None => { - if let Some(comments) = self.comments.as_mut() { - let comments_buffer = self.comments_buffer.as_mut().unwrap(); - let last = self.state.prev_hi; - - // move the pending to the leading or trailing - for c in comments_buffer.take_pending_leading() { - // if the file had no tokens and no shebang, then treat any - // comments in the leading comments buffer as leading. - // Otherwise treat them as trailing. - if last == self.start_pos { - comments_buffer.push(BufferedComment { - kind: BufferedCommentKind::Leading, - pos: last, - comment: c, - }); - } else { - comments_buffer.push(BufferedComment { - kind: BufferedCommentKind::Trailing, - pos: last, - comment: c, - }); - } - } - - // now fill the user's passed in comments - for comment in comments_buffer.take_comments() { - match comment.kind { - BufferedCommentKind::Leading => { - comments.add_leading(comment.pos, comment.comment); - } - BufferedCommentKind::Trailing => { - comments.add_trailing(comment.pos, comment.comment); - } - } - } - } + self.consume_pending_comments(); return Ok(None); } From 3d31bcc2ba79339751117750f8322dcaadd3c238 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Sat, 22 Jun 2024 08:42:15 +0900 Subject: [PATCH 3/9] Revert "Some cond" This reverts commit 1f2e8b5ecbd982fedd5d1b9aa5fceeb92bac9db5. --- crates/swc_ecma_parser/src/lexer/state.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/crates/swc_ecma_parser/src/lexer/state.rs b/crates/swc_ecma_parser/src/lexer/state.rs index c8e7c6cb88e9..7d2914be3646 100644 --- a/crates/swc_ecma_parser/src/lexer/state.rs +++ b/crates/swc_ecma_parser/src/lexer/state.rs @@ -247,10 +247,11 @@ impl Lexer<'_> { if let Some(shebang) = self.read_shebang()? { return Ok(Some(Token::Shebang(shebang))); } - } else { - self.state.is_first = false; } + self.state.had_line_break = self.state.is_first; + self.state.is_first = false; + // skip spaces before getting next character, if we are allowed to. if self.state.can_skip_space() { self.skip_space::()?; @@ -385,7 +386,7 @@ impl State { State { is_expr_allowed: true, next_regexp: None, - had_line_break: true, + had_line_break: false, had_line_break_before_last: false, is_first: true, start: BytePos(0), From d46a972a67c27ef82be776ad8829c0f012a5ee28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EB=8F=99=EC=9C=A4=20=28Donny=29?= Date: Sat, 22 Jun 2024 08:49:00 +0900 Subject: [PATCH 4/9] Reduce branch --- crates/swc_ecma_parser/src/lexer/jsx.rs | 2 +- crates/swc_ecma_parser/src/lexer/mod.rs | 10 +++++----- crates/swc_ecma_parser/src/lexer/state.rs | 4 ++-- crates/swc_ecma_parser/src/lexer/util.rs | 14 ++++++-------- 4 files changed, 14 insertions(+), 16 deletions(-) diff --git a/crates/swc_ecma_parser/src/lexer/jsx.rs b/crates/swc_ecma_parser/src/lexer/jsx.rs index 924b90523d3e..3d3e5473c12d 100644 --- a/crates/swc_ecma_parser/src/lexer/jsx.rs +++ b/crates/swc_ecma_parser/src/lexer/jsx.rs @@ -26,7 +26,7 @@ impl<'a> Lexer<'a> { self.emit_error_span(span, SyntaxError::TS1185); self.skip_line_comment(6); - self.skip_space::()?; + self.skip_space::(); return self.read_token(); } '<' | '{' => { diff --git a/crates/swc_ecma_parser/src/lexer/mod.rs b/crates/swc_ecma_parser/src/lexer/mod.rs index d6fc4fc1508f..3bc354501879 100644 --- a/crates/swc_ecma_parser/src/lexer/mod.rs +++ b/crates/swc_ecma_parser/src/lexer/mod.rs @@ -379,7 +379,7 @@ impl<'a> Lexer<'a> { let span = fixed_len_span(start, 7); self.emit_error_span(span, SyntaxError::TS1185); self.skip_line_comment(5); - self.skip_space::()?; + self.skip_space::(); return self.error_span(span, SyntaxError::TS1185); } @@ -572,7 +572,7 @@ impl<'a> Lexer<'a> { if self.state.had_line_break && c == b'-' && self.eat(b'>') { self.emit_module_mode_error(start, SyntaxError::LegacyCommentInModule); self.skip_line_comment(0); - self.skip_space::()?; + self.skip_space::(); return self.read_token(); } @@ -617,7 +617,7 @@ impl<'a> Lexer<'a> { if had_line_break_before_last && self.is_str("====") { self.emit_error_span(fixed_len_span(start, 7), SyntaxError::TS1185); self.skip_line_comment(4); - self.skip_space::()?; + self.skip_space::(); return self.read_token(); } @@ -676,7 +676,7 @@ impl<'a> Lexer<'a> { // XML style comment. `