diff --git a/.changeset/dry-goats-help.md b/.changeset/dry-goats-help.md new file mode 100644 index 000000000000..ff6c2ba4d65c --- /dev/null +++ b/.changeset/dry-goats-help.md @@ -0,0 +1,5 @@ +--- +swc_ecma_parser: minor +--- + +fix(es/parser): Fix span of EOF errors diff --git a/crates/swc_ecma_parser/src/lexer/state.rs b/crates/swc_ecma_parser/src/lexer/state.rs index bb07f699bcbb..4d06737f8938 100644 --- a/crates/swc_ecma_parser/src/lexer/state.rs +++ b/crates/swc_ecma_parser/src/lexer/state.rs @@ -191,6 +191,10 @@ impl Tokens for Lexer<'_> { fn take_errors(&mut self) -> Vec { take(&mut self.errors.borrow_mut()) } + + fn end_pos(&self) -> BytePos { + self.input.end_pos() + } } impl Lexer<'_> { diff --git a/crates/swc_ecma_parser/src/parser/input.rs b/crates/swc_ecma_parser/src/parser/input.rs index ffc96372ef42..34c513b21387 100644 --- a/crates/swc_ecma_parser/src/parser/input.rs +++ b/crates/swc_ecma_parser/src/parser/input.rs @@ -46,6 +46,8 @@ pub trait Tokens: Clone + Iterator { /// buffer on set_ctx if the parser mode become module mode. fn add_module_mode_error(&self, error: Error); + fn end_pos(&self) -> BytePos; + fn take_errors(&mut self) -> Vec; } @@ -142,6 +144,14 @@ impl Tokens for TokensInput { fn take_errors(&mut self) -> Vec { take(&mut self.errors.borrow_mut()) } + + fn end_pos(&self) -> BytePos { + self.iter + .as_slice() + .last() + .map(|t| t.span.hi) + .unwrap_or(self.start_pos) + } } /// Note: Lexer need access to parser's context to lex correctly. @@ -258,6 +268,10 @@ impl Tokens for Capturing { fn take_errors(&mut self) -> Vec { self.inner.take_errors() } + + fn end_pos(&self) -> BytePos { + self.inner.end_pos() + } } /// This struct is responsible for managing current token and peeked token. @@ -497,4 +511,9 @@ impl Buffer { pub(crate) fn set_token_context(&mut self, c: lexer::TokenContexts) { self.iter.set_token_context(c) } + + #[inline] + pub(crate) fn end_pos(&self) -> BytePos { + self.iter.end_pos() + } } diff --git a/crates/swc_ecma_parser/src/parser/macros.rs b/crates/swc_ecma_parser/src/parser/macros.rs index 2e78017ace57..7b3b19b5be82 100644 --- a/crates/swc_ecma_parser/src/parser/macros.rs +++ b/crates/swc_ecma_parser/src/parser/macros.rs @@ -239,7 +239,7 @@ macro_rules! cur { match $p.input.cur() { Some(c) => Ok(c), None => { - let pos = $p.input.last_pos(); + let pos = $p.input.end_pos(); let last = Span::new(pos, pos); Err(crate::error::Error::new( @@ -263,9 +263,9 @@ macro_rules! cur { _ => c, }, None => { - let pos = $p.input.last_pos(); - let last = Span::new(pos, pos); - let err = crate::error::Error::new(last, crate::error::SyntaxError::Eof); + let pos = $p.input.end_pos(); + let span = Span::new(pos, pos); + let err = crate::error::Error::new(span, crate::error::SyntaxError::Eof); return Err(err); } } diff --git a/crates/swc_ecma_parser/tests/errors/conflict_marker_trivia_4/input.ts.swc-stderr b/crates/swc_ecma_parser/tests/errors/conflict_marker_trivia_4/input.ts.swc-stderr index f53c2940e13b..515693648454 100644 --- a/crates/swc_ecma_parser/tests/errors/conflict_marker_trivia_4/input.ts.swc-stderr +++ b/crates/swc_ecma_parser/tests/errors/conflict_marker_trivia_4/input.ts.swc-stderr @@ -1,7 +1,6 @@ x Unexpected eof - ,-[$DIR/tests/errors/conflict_marker_trivia_4/input.ts:1:1] + ,-[$DIR/tests/errors/conflict_marker_trivia_4/input.ts:2:1] 1 | const x =
- : ^ 2 | <<<<<<< HEAD `---- x Merge conflict marker encountered. diff --git a/crates/swc_ecma_parser/tests/jsx/errors/wrong-closing-tag-fragment/input.js.swc-stderr b/crates/swc_ecma_parser/tests/jsx/errors/wrong-closing-tag-fragment/input.js.swc-stderr index 6241c70ae91a..c2fb7a10d593 100644 --- a/crates/swc_ecma_parser/tests/jsx/errors/wrong-closing-tag-fragment/input.js.swc-stderr +++ b/crates/swc_ecma_parser/tests/jsx/errors/wrong-closing-tag-fragment/input.js.swc-stderr @@ -1,5 +1,4 @@ x Unexpected eof - ,-[$DIR/tests/jsx/errors/wrong-closing-tag-fragment/input.js:1:1] + ,-[$DIR/tests/jsx/errors/wrong-closing-tag-fragment/input.js:1:16] 1 | <> - : ^ `---- diff --git a/crates/swc_ecma_parser/tests/jsx/errors/wrong-closing-tag/input.js.swc-stderr b/crates/swc_ecma_parser/tests/jsx/errors/wrong-closing-tag/input.js.swc-stderr index a61bc63e9e3c..873c795e7db2 100644 --- a/crates/swc_ecma_parser/tests/jsx/errors/wrong-closing-tag/input.js.swc-stderr +++ b/crates/swc_ecma_parser/tests/jsx/errors/wrong-closing-tag/input.js.swc-stderr @@ -1,5 +1,4 @@ x Unexpected eof - ,-[$DIR/tests/jsx/errors/wrong-closing-tag/input.js:1:1] + ,-[$DIR/tests/jsx/errors/wrong-closing-tag/input.js:1:13] 1 | - : ^ `---- diff --git a/crates/swc_ecma_parser/tests/jsx/errors/wrong-opening-tag-fragment/input.js.swc-stderr b/crates/swc_ecma_parser/tests/jsx/errors/wrong-opening-tag-fragment/input.js.swc-stderr index 9b65e9d5ea0b..70b4c95f9586 100644 --- a/crates/swc_ecma_parser/tests/jsx/errors/wrong-opening-tag-fragment/input.js.swc-stderr +++ b/crates/swc_ecma_parser/tests/jsx/errors/wrong-opening-tag-fragment/input.js.swc-stderr @@ -1,5 +1,4 @@ x Unexpected eof - ,-[$DIR/tests/jsx/errors/wrong-opening-tag-fragment/input.js:1:1] + ,-[$DIR/tests/jsx/errors/wrong-opening-tag-fragment/input.js:1:16] 1 | - : ^ `---- diff --git a/crates/swc_ecma_parser/tests/test262-error-references/fail/036f6b8da7e53ee5.js.swc-stderr b/crates/swc_ecma_parser/tests/test262-error-references/fail/036f6b8da7e53ee5.js.swc-stderr index 65b5d1827f5d..a920c4c4c607 100644 --- a/crates/swc_ecma_parser/tests/test262-error-references/fail/036f6b8da7e53ee5.js.swc-stderr +++ b/crates/swc_ecma_parser/tests/test262-error-references/fail/036f6b8da7e53ee5.js.swc-stderr @@ -1,5 +1,4 @@ x Unexpected eof ,-[$DIR/tests/test262-parser/fail/036f6b8da7e53ee5.js:1:1] 1 | ({get - : ^ `---- diff --git a/crates/swc_ecma_parser/tests/test262-error-references/fail/0f175471e2f0c3d5.js.swc-stderr b/crates/swc_ecma_parser/tests/test262-error-references/fail/0f175471e2f0c3d5.js.swc-stderr index d3989ef57370..e8b9e62f830f 100644 --- a/crates/swc_ecma_parser/tests/test262-error-references/fail/0f175471e2f0c3d5.js.swc-stderr +++ b/crates/swc_ecma_parser/tests/test262-error-references/fail/0f175471e2f0c3d5.js.swc-stderr @@ -1,5 +1,4 @@ x Unexpected eof ,-[$DIR/tests/test262-parser/fail/0f175471e2f0c3d5.js:1:1] 1 | class - : ^ `---- diff --git a/crates/swc_ecma_parser/tests/test262-error-references/fail/4cce9feb5a563377.js.swc-stderr b/crates/swc_ecma_parser/tests/test262-error-references/fail/4cce9feb5a563377.js.swc-stderr index 81abf6691ab4..4bbda5507e53 100644 --- a/crates/swc_ecma_parser/tests/test262-error-references/fail/4cce9feb5a563377.js.swc-stderr +++ b/crates/swc_ecma_parser/tests/test262-error-references/fail/4cce9feb5a563377.js.swc-stderr @@ -1,5 +1,4 @@ x Unexpected eof - ,-[$DIR/tests/test262-parser/fail/4cce9feb5a563377.js:1:1] + ,-[$DIR/tests/test262-parser/fail/4cce9feb5a563377.js:1:10] 1 | (a,...a) - : ^ `---- diff --git a/crates/swc_ecma_parser/tests/test262-error-references/fail/814e26b2395ad89d.module.js.swc-stderr b/crates/swc_ecma_parser/tests/test262-error-references/fail/814e26b2395ad89d.module.js.swc-stderr index 12724863d138..ff129b555a70 100644 --- a/crates/swc_ecma_parser/tests/test262-error-references/fail/814e26b2395ad89d.module.js.swc-stderr +++ b/crates/swc_ecma_parser/tests/test262-error-references/fail/814e26b2395ad89d.module.js.swc-stderr @@ -1,5 +1,4 @@ x Unexpected eof ,-[$DIR/tests/test262-parser/fail/814e26b2395ad89d.module.js:1:1] 1 | export - : ^ `---- diff --git a/crates/swc_ecma_parser/tests/test262-error-references/fail/e5fabf7fc4ae5dea.js.swc-stderr b/crates/swc_ecma_parser/tests/test262-error-references/fail/e5fabf7fc4ae5dea.js.swc-stderr index 3301d5ec7952..876e0e6458e5 100644 --- a/crates/swc_ecma_parser/tests/test262-error-references/fail/e5fabf7fc4ae5dea.js.swc-stderr +++ b/crates/swc_ecma_parser/tests/test262-error-references/fail/e5fabf7fc4ae5dea.js.swc-stderr @@ -1,5 +1,4 @@ x Unexpected eof ,-[$DIR/tests/test262-parser/fail/e5fabf7fc4ae5dea.js:1:1] 1 | (a,...a)/*‪*/ - : ^ `---- diff --git a/crates/swc_ecma_parser/tests/typescript-errors/missing-fn-expr-body/anonymous/input.ts.swc-stderr b/crates/swc_ecma_parser/tests/typescript-errors/missing-fn-expr-body/anonymous/input.ts.swc-stderr index 0985d3102aeb..94598e626d5d 100644 --- a/crates/swc_ecma_parser/tests/typescript-errors/missing-fn-expr-body/anonymous/input.ts.swc-stderr +++ b/crates/swc_ecma_parser/tests/typescript-errors/missing-fn-expr-body/anonymous/input.ts.swc-stderr @@ -1,5 +1,4 @@ x Unexpected eof - ,-[$DIR/tests/typescript-errors/missing-fn-expr-body/anonymous/input.ts:1:1] + ,-[$DIR/tests/typescript-errors/missing-fn-expr-body/anonymous/input.ts:1:21] 1 | let f = function () - : ^ `---- diff --git a/crates/swc_ecma_parser/tests/typescript-errors/missing-fn-expr-body/async/input.ts.swc-stderr b/crates/swc_ecma_parser/tests/typescript-errors/missing-fn-expr-body/async/input.ts.swc-stderr index 2940e603d70e..32fd20fba12e 100644 --- a/crates/swc_ecma_parser/tests/typescript-errors/missing-fn-expr-body/async/input.ts.swc-stderr +++ b/crates/swc_ecma_parser/tests/typescript-errors/missing-fn-expr-body/async/input.ts.swc-stderr @@ -1,5 +1,4 @@ x Unexpected eof - ,-[$DIR/tests/typescript-errors/missing-fn-expr-body/async/input.ts:1:1] + ,-[$DIR/tests/typescript-errors/missing-fn-expr-body/async/input.ts:1:27] 1 | let f = async function () - : ^ `---- diff --git a/crates/swc_ecma_parser/tests/typescript-errors/missing-fn-expr-body/named/input.ts.swc-stderr b/crates/swc_ecma_parser/tests/typescript-errors/missing-fn-expr-body/named/input.ts.swc-stderr index abc73ba4595d..1d92c7a27b7c 100644 --- a/crates/swc_ecma_parser/tests/typescript-errors/missing-fn-expr-body/named/input.ts.swc-stderr +++ b/crates/swc_ecma_parser/tests/typescript-errors/missing-fn-expr-body/named/input.ts.swc-stderr @@ -1,5 +1,4 @@ x Unexpected eof - ,-[$DIR/tests/typescript-errors/missing-fn-expr-body/named/input.ts:1:1] + ,-[$DIR/tests/typescript-errors/missing-fn-expr-body/named/input.ts:1:23] 1 | let f = function f(); - : ^ `---- diff --git a/crates/swc_ecma_parser/tests/typescript-errors/missing-fn-expr-body/typed/input.ts.swc-stderr b/crates/swc_ecma_parser/tests/typescript-errors/missing-fn-expr-body/typed/input.ts.swc-stderr index 0a4d3a3a0cc2..9fc432e35088 100644 --- a/crates/swc_ecma_parser/tests/typescript-errors/missing-fn-expr-body/typed/input.ts.swc-stderr +++ b/crates/swc_ecma_parser/tests/typescript-errors/missing-fn-expr-body/typed/input.ts.swc-stderr @@ -1,6 +1,4 @@ x Unexpected eof - ,-[$DIR/tests/typescript-errors/missing-fn-expr-body/typed/input.ts:2:1] - 1 | // return type is `{}` + ,-[$DIR/tests/typescript-errors/missing-fn-expr-body/typed/input.ts:2:25] 2 | let f = function (): {} - : ^ `----