Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions crates/swc_ecma_compat_es2019/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ unexpected_cfgs = { level = "warn", check-cfg = ['cfg(swc_ast_unknown)'] }
[dependencies]
swc_common = { version = "17.0.1", path = "../swc_common" }
swc_ecma_ast = { version = "18.0.0", path = "../swc_ecma_ast" }
swc_ecma_transformer = { version = "0.1.0", path = "../swc_ecma_transformer" }
swc_ecma_transforms_base = { version = "30.0.0", path = "../swc_ecma_transforms_base" }
swc_ecma_utils = { version = "24.0.0", path = "../swc_ecma_utils" }
swc_ecma_visit = { version = "18.0.1", path = "../swc_ecma_visit" }
Expand Down
20 changes: 3 additions & 17 deletions crates/swc_ecma_compat_es2019/src/optional_catch_binding.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,10 @@ use swc_ecma_utils::private_ident;
use swc_ecma_visit::{noop_visit_mut_type, visit_mut_pass, VisitMut, VisitMutWith};
use swc_trace_macro::swc_trace;

struct OptionalCatchBinding;

pub fn optional_catch_binding() -> impl Pass {
visit_mut_pass(OptionalCatchBinding)
}

#[swc_trace]
impl VisitMut for OptionalCatchBinding {
noop_visit_mut_type!(fail);

fn visit_mut_catch_clause(&mut self, cc: &mut CatchClause) {
cc.visit_mut_children_with(self);

if cc.param.is_some() {
return;
}
cc.param = Some(private_ident!("e").into());
}
let mut options = swc_ecma_transformer::Options::default();
options.env.es2019.optional_catch_binding = true;
options.into_pass()
}

#[cfg(test)]
Expand Down
4 changes: 3 additions & 1 deletion crates/swc_ecma_preset_env/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,9 @@ where
);

// ES2019
let pass = add!(pass, OptionalCatchBinding, es2019::optional_catch_binding());
if !caniuse(Feature::OptionalCatchBinding) {
options.env.es2019.optional_catch_binding = true;
}

// ES2018
if !caniuse(Feature::ObjectRestSpread) {
Expand Down
20 changes: 11 additions & 9 deletions crates/swc_ecma_transformer/src/es2019/mod.rs
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
use swc_ecma_hooks::VisitMutHook;

use crate::TraverseCtx;
use crate::{hook_utils::OptionalHook, TraverseCtx};

mod optional_catch_binding;

#[derive(Debug, Default)]
#[non_exhaustive]
pub struct Es2019Options {}

pub fn hook(options: Es2019Options) -> impl VisitMutHook<TraverseCtx> {
Es2019Pass { options }
pub struct Es2019Options {
pub optional_catch_binding: bool,
}

struct Es2019Pass {
options: Es2019Options,
pub(crate) fn hook(options: Es2019Options) -> impl VisitMutHook<TraverseCtx> {
OptionalHook(if options.optional_catch_binding {
Some(self::optional_catch_binding::hook())
} else {
None
})
}

impl VisitMutHook<TraverseCtx> for Es2019Pass {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
use swc_ecma_ast::*;
use swc_ecma_hooks::VisitMutHook;
use swc_ecma_utils::private_ident;

use crate::TraverseCtx;

pub fn hook() -> impl VisitMutHook<TraverseCtx> {
OptionalCatchBindingPass {}
}

struct OptionalCatchBindingPass {}

impl VisitMutHook<TraverseCtx> for OptionalCatchBindingPass {
fn enter_catch_clause(&mut self, node: &mut CatchClause, _: &mut TraverseCtx) {
if node.param.is_none() {
// TODO: Do not use private_ident! here.
// All private identifiers should be tracked using TraverseCtx.
node.param = Some(Pat::Ident(private_ident!("unused")));
}
}
}
2 changes: 2 additions & 0 deletions crates/swc_ecma_transformer/src/hook_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ where
optional_method!(enter_script, exit_script, Script);

optional_method!(enter_program, exit_program, Program);

optional_method!(enter_catch_clause, exit_catch_clause, CatchClause);
}

pub(crate) struct NoopHook;
Expand Down
Loading