swc_ecma_transforms_compat/es2019/
optional_catch_binding.rsuse swc_ecma_ast::*;
use swc_ecma_utils::private_ident;
use swc_ecma_visit::{as_folder, noop_visit_mut_type, Fold, VisitMut, VisitMutWith};
use swc_trace_macro::swc_trace;
struct OptionalCatchBinding;
#[tracing::instrument(level = "info", skip_all)]
pub fn optional_catch_binding() -> impl Fold + VisitMut {
    as_folder(OptionalCatchBinding)
}
#[swc_trace]
impl VisitMut for OptionalCatchBinding {
    noop_visit_mut_type!();
    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());
    }
}
#[cfg(test)]
mod tests {
    use swc_common::{chain, Mark};
    use swc_ecma_transforms_base::resolver;
    use swc_ecma_transforms_testing::test;
    use swc_ecma_visit::{as_folder, Fold};
    use crate::es2019::optional_catch_binding::OptionalCatchBinding;
    pub fn tr() -> impl Fold {
        chain!(
            resolver(Mark::new(), Mark::new(), false),
            as_folder(OptionalCatchBinding)
        )
    }
    test!(
        ::swc_ecma_parser::Syntax::default(),
        |_| tr(),
        issue_411,
        "try {} catch {}",
        "try {} catch(e) {}"
    );
    test!(
        ::swc_ecma_parser::Syntax::default(),
        |_| tr(),
        catch_binding_name_collision_1,
        "try { throw new Error(); } catch { log(e); }",
        "try { throw new Error(); } catch (e1) { log(e); }"
    );
    test!(
        ::swc_ecma_parser::Syntax::default(),
        |_| tr(),
        catch_binding_name_collision_2,
        "var e; try {} catch { log(e); }",
        "var e; try {} catch (e1) { log(e); }"
    );
}