From 065d11cb9bd49f36825b3b707e4e9ecfcc64e17b Mon Sep 17 00:00:00 2001 From: magic-akari Date: Thu, 30 Mar 2023 16:38:35 +0800 Subject: [PATCH] fix(es/compat): Handle import/export in `reserved_word` (#7165) --- .../src/es3/reserved_word.rs | 45 ++++++++++++++++--- 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/crates/swc_ecma_transforms_compat/src/es3/reserved_word.rs b/crates/swc_ecma_transforms_compat/src/es3/reserved_word.rs index 2673292d0ab6..7660fcced458 100644 --- a/crates/swc_ecma_transforms_compat/src/es3/reserved_word.rs +++ b/crates/swc_ecma_transforms_compat/src/es3/reserved_word.rs @@ -30,7 +30,24 @@ struct ReservedWord { impl Fold for ReservedWord { noop_fold_type!(); - fn fold_export_specifier(&mut self, n: ExportSpecifier) -> ExportSpecifier { + fn fold_export_named_specifier(&mut self, n: ExportNamedSpecifier) -> ExportNamedSpecifier { + let ident = match n.orig { + ModuleExportName::Ident(ident) if ident.is_reserved_in_es3() => ident, + _ => return n, + }; + + ExportNamedSpecifier { + orig: ident.clone().fold_with(self).into(), + exported: n.exported.or_else(|| Some(ident.into())), + ..n + } + } + + fn fold_named_export(&mut self, n: NamedExport) -> NamedExport { + if n.src.is_none() { + return n.fold_children_with(self); + } + n } @@ -39,16 +56,14 @@ impl Fold for ReservedWord { } fn fold_import_named_specifier(&mut self, s: ImportNamedSpecifier) -> ImportNamedSpecifier { - if s.imported.is_some() { + if s.local.is_reserved_in_es3() { ImportNamedSpecifier { + imported: s.imported.or_else(|| Some(s.local.clone().into())), local: s.local.fold_with(self), ..s } } else { - ImportNamedSpecifier { - imported: s.imported.fold_with(self), - ..s - } + s } } @@ -131,4 +146,22 @@ function utf8CheckByte(_byte) { ); identical!(export_as_default, "export { Foo as default }"); + + test!( + ::swc_ecma_parser::Syntax::default(), + |_| ReservedWord { + preserve_import: false + }, + issue_7164, + r#" + import { int } from './a.js' + console.log(int) + export { int }; + "#, + r#" + import { int as _int } from './a.js'; + console.log(_int); + export { _int as int }; + "# + ); }