From 53e87ffd3c4d8b0973e973f949614deb1f073203 Mon Sep 17 00:00:00 2001 From: AayushMainali-Github Date: Wed, 22 Jul 2026 19:21:12 +0000 Subject: [PATCH] fix(parser): parse default async arrow exports --- .../parser/statement/declaration/export.rs | 30 ++++++++++++------- .../src/parser/statement/declaration/tests.rs | 16 ++++++++++ 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/core/parser/src/parser/statement/declaration/export.rs b/core/parser/src/parser/statement/declaration/export.rs index 78b8d8f26e4..4faaf3639df 100644 --- a/core/parser/src/parser/statement/declaration/export.rs +++ b/core/parser/src/parser/statement/declaration/export.rs @@ -184,17 +184,27 @@ where } } TokenKind::Keyword((Keyword::Async, false)) => { - let next_token = cursor.peek(2, interner).or_abrupt()?; - if next_token.kind() == &TokenKind::Punctuator(Punctuator::Mul) { - AstExportDeclaration::DefaultAsyncGeneratorDeclaration( - AsyncGeneratorDeclaration::new(false, true, true) - .parse(cursor, interner)?, - ) + let next_token = cursor.peek(1, interner).or_abrupt()?; + if next_token.kind() == &TokenKind::Keyword((Keyword::Function, false)) { + let following_token = cursor.peek(2, interner).or_abrupt()?; + if following_token.kind() == &TokenKind::Punctuator(Punctuator::Mul) { + AstExportDeclaration::DefaultAsyncGeneratorDeclaration( + AsyncGeneratorDeclaration::new(false, true, true) + .parse(cursor, interner)?, + ) + } else { + AstExportDeclaration::DefaultAsyncFunctionDeclaration( + AsyncFunctionDeclaration::new(false, true, true) + .parse(cursor, interner)?, + ) + } } else { - AstExportDeclaration::DefaultAsyncFunctionDeclaration( - AsyncFunctionDeclaration::new(false, true, true) - .parse(cursor, interner)?, - ) + let expr = AssignmentExpression::new(true, false, true) + .parse(cursor, interner)?; + + cursor.expect_semicolon("default expression export", interner)?; + + AstExportDeclaration::DefaultAssignmentExpression(expr) } } TokenKind::Keyword((Keyword::Class, false)) => { diff --git a/core/parser/src/parser/statement/declaration/tests.rs b/core/parser/src/parser/statement/declaration/tests.rs index 16bb745c43f..5a4d2c0a0cc 100644 --- a/core/parser/src/parser/statement/declaration/tests.rs +++ b/core/parser/src/parser/statement/declaration/tests.rs @@ -663,6 +663,22 @@ fn import_non_string_attribute_value() { ); } +/// Checks async arrow functions in default exports. +#[test] +fn default_export_async_arrow_function() { + let scope = boa_ast::scope::Scope::new_global(); + + for source in [ + "export default async () => 1;", + "export default async x => x;", + "export default async (a, b) => a + b;", + ] { + Parser::new(Source::from_bytes(source)) + .parse_module(&scope, &mut Interner::default()) + .expect("async arrow function should parse as a default export"); + } +} + /// Checks `using` declaration parsing. #[test] fn using_declaration() {