diff --git a/crates/oxc_parser/src/js/statement.rs b/crates/oxc_parser/src/js/statement.rs index 54505ae97..54297b88b 100644 --- a/crates/oxc_parser/src/js/statement.rs +++ b/crates/oxc_parser/src/js/statement.rs @@ -44,13 +44,16 @@ impl<'a> Parser<'a> { Kind::Import if !matches!(self.peek_kind(), Kind::Dot | Kind::LParen) => { let stmt = self.parse_import_declaration()?; statements.push(stmt); + expecting_directives = false; } Kind::Export => { let stmt = self.parse_export_declaration()?; statements.push(stmt); + expecting_directives = false; } Kind::At => { self.eat_decorators()?; + expecting_directives = false; continue; } _ => { diff --git a/crates/oxc_parser/src/lib.rs b/crates/oxc_parser/src/lib.rs index 73f902c03..45dd4d3b5 100644 --- a/crates/oxc_parser/src/lib.rs +++ b/crates/oxc_parser/src/lib.rs @@ -300,6 +300,22 @@ mod test { assert_eq!(ret.errors.first().unwrap().to_string(), "Flow is not supported"); } + #[test] + fn directives() { + let allocator = Allocator::default(); + let source_type = SourceType::default(); + let sources = [ + ("import x from 'foo'; 'use strict';", 2), + ("export {x} from 'foo'; 'use strict';", 2), + ("@decorator 'use strict';", 1), + ]; + for (source, body_length) in sources { + let ret = Parser::new(&allocator, source, source_type).parse(); + assert!(ret.program.directives.is_empty(), "{source}"); + assert_eq!(ret.program.body.len(), body_length, "{source}"); + } + } + // Source with length u32::MAX + 1 fails to parse #[test] fn overlong_source() {