diff --git a/crates/oxc_prettier/src/format/mod.rs b/crates/oxc_prettier/src/format/mod.rs index 15a0d66bf..e93199d6e 100644 --- a/crates/oxc_prettier/src/format/mod.rs +++ b/crates/oxc_prettier/src/format/mod.rs @@ -752,17 +752,7 @@ impl<'a> Format<'a> for ImportDeclaration<'a> { parts.push(ss!(" type")); } if let Some(specifiers) = &self.specifiers { - parts.push(ss!(" {")); - if !specifiers.is_empty() { - parts.push(ss!(" ")); - } - for (i, specifier) in specifiers.iter().enumerate() { - if i != 0 { - parts.push(ss!(", ")); - } - parts.push(specifier.format(p)); - } - parts.push(ss!(" }")); + parts.push(module::print_module_specifiers(p, specifiers)); } parts.push(ss!(" from ")); parts.push(self.source.format(p)); @@ -816,7 +806,13 @@ impl<'a> Format<'a> for ImportAttribute { impl<'a> Format<'a> for ExportNamedDeclaration<'a> { fn format(&self, p: &mut Prettier<'a>) -> Doc<'a> { - Doc::Line + let mut parts = p.vec(); + parts.push(ss!(" ")); + parts.push(module::print_module_specifiers(p, &self.specifiers)); + if let Some(decl) = &self.declaration { + parts.push(decl.format(p)); + } + Doc::Array(parts) } } diff --git a/crates/oxc_prettier/src/format/module.rs b/crates/oxc_prettier/src/format/module.rs index 009ed3d59..dab5298fb 100644 --- a/crates/oxc_prettier/src/format/module.rs +++ b/crates/oxc_prettier/src/format/module.rs @@ -1,3 +1,4 @@ +use oxc_allocator::Vec; #[allow(clippy::wildcard_imports)] use oxc_ast::ast::*; @@ -45,13 +46,37 @@ fn print_semicolon_after_export_declaration<'a>( return None; } - let ModuleDeclaration::ExportDefaultDeclaration(decl) = decl else { return None }; - - match decl.declaration { - ExportDefaultDeclarationKind::Expression(_) => Some(ss!(";")), - ExportDefaultDeclarationKind::FunctionDeclaration(_) - | ExportDefaultDeclarationKind::ClassDeclaration(_) - | ExportDefaultDeclarationKind::TSInterfaceDeclaration(_) - | ExportDefaultDeclarationKind::TSEnumDeclaration(_) => None, + match decl { + ModuleDeclaration::ExportDefaultDeclaration(decl) => match decl.declaration { + ExportDefaultDeclarationKind::Expression(_) => Some(ss!(";")), + ExportDefaultDeclarationKind::FunctionDeclaration(_) + | ExportDefaultDeclarationKind::ClassDeclaration(_) + | ExportDefaultDeclarationKind::TSInterfaceDeclaration(_) + | ExportDefaultDeclarationKind::TSEnumDeclaration(_) => None, + }, + ModuleDeclaration::ExportAllDeclaration(_) => Some(ss!(";")), + _ => None, } } + +pub fn print_module_specifiers<'a, T: Format<'a>>( + p: &mut Prettier<'a>, + specifiers: &Vec<'a, T>, +) -> Doc<'a> { + let mut parts = p.vec(); + parts.push(ss!("{")); + + if !specifiers.is_empty() { + parts.push(ss!(" ")); + + for (i, specifier) in specifiers.iter().enumerate() { + if i != 0 { + parts.push(ss!(", ")); + } + parts.push(specifier.format(p)); + } + } + + parts.push(ss!("}")); + Doc::Array(parts) +} diff --git a/tasks/prettier_conformance/prettier.snap.md b/tasks/prettier_conformance/prettier.snap.md index 3a9a80c94..7e07a4991 100644 --- a/tasks/prettier_conformance/prettier.snap.md +++ b/tasks/prettier_conformance/prettier.snap.md @@ -1,4 +1,4 @@ -Compatibility: 52/881 (5.90%) +Compatibility: 59/881 (6.70%) # Failed @@ -522,14 +522,6 @@ Compatibility: 52/881 (5.90%) ### export-default/export-default-from * export-default/export-default-from/export.js -### export-star -* export-star/export-star-as-default.js -* export-star/export-star-as-reserved-word.js -* export-star/export-star-as-string.js -* export-star/export-star-as-string2.js -* export-star/export-star-as.js -* export-star/export-star.js - ### expression_statement * expression_statement/no_regression.js @@ -635,7 +627,6 @@ Compatibility: 52/881 (5.90%) ### import-assertions/bracket-spacing * import-assertions/bracket-spacing/dynamic-import.js -* import-assertions/bracket-spacing/empty.js * import-assertions/bracket-spacing/re-export.js * import-assertions/bracket-spacing/static-import.js