swc_ecma_transforms_compat/es3/
reserved_word.rsuse swc_ecma_ast::*;
use swc_ecma_visit::{noop_fold_type, Fold, FoldWith};
use swc_trace_macro::swc_trace;
#[tracing::instrument(level = "info", skip_all)]
pub fn reserved_words(preserve_import: bool) -> impl Fold {
ReservedWord { preserve_import }
}
struct ReservedWord {
pub preserve_import: bool,
}
#[swc_trace]
impl Fold for ReservedWord {
noop_fold_type!();
fn fold_export_specifier(&mut self, n: ExportSpecifier) -> ExportSpecifier {
n
}
fn fold_ident(&mut self, i: Ident) -> Ident {
fold_ident(self.preserve_import, i)
}
fn fold_import_named_specifier(&mut self, s: ImportNamedSpecifier) -> ImportNamedSpecifier {
if s.imported.is_some() {
ImportNamedSpecifier {
local: s.local.fold_with(self),
..s
}
} else {
ImportNamedSpecifier {
imported: s.imported.fold_with(self),
..s
}
}
}
fn fold_member_expr(&mut self, e: MemberExpr) -> MemberExpr {
MemberExpr {
obj: e.obj.fold_with(self),
prop: if let MemberProp::Computed(c) = e.prop {
MemberProp::Computed(c.fold_with(self))
} else {
e.prop
},
..e
}
}
fn fold_prop_name(&mut self, n: PropName) -> PropName {
n
}
}
fn fold_ident(preserve_import: bool, i: Ident) -> Ident {
if preserve_import && i.sym == *"import" {
return i;
}
if i.is_reserved_in_es3() {
return Ident {
sym: format!("_{}", i.sym).into(),
..i
};
}
i
}
#[cfg(test)]
mod tests {
use swc_ecma_transforms_testing::test;
use super::*;
macro_rules! identical {
($name:ident, $src:literal) => {
test!(
::swc_ecma_parser::Syntax::default(),
|_| ReservedWord {
preserve_import: false
},
$name,
$src,
$src
);
};
}
test!(
::swc_ecma_parser::Syntax::default(),
|_| ReservedWord {
preserve_import: false
},
babel_issue_6477,
r#"
function utf8CheckByte(byte) {
if (byte <= 0x7F) return 0;
else if (byte >> 5 === 0x06) return 2;
else if (byte >> 4 === 0x0E) return 3;
else if (byte >> 3 === 0x1E) return 4;
return -1;
}
"#,
r#"
function utf8CheckByte(_byte) {
if (_byte <= 0x7F) return 0;
else if (_byte >> 5 === 0x06) return 2;
else if (_byte >> 4 === 0x0E) return 3;
else if (_byte >> 3 === 0x1E) return 4;
return -1;
}
"#
);
identical!(export_as_default, "export { Foo as default }");
}