{"record":{"id":"3a8d52c647b10189","repo":"swc-project/swc","slug":"illegal-conversion-cannot-convert-to-catchcl","errorCode":null,"errorMessage":"illegal conversion: Cannot convert {:?} to CatchClauseParam","messagePattern":"illegal conversion: Cannot convert (.+?) to CatchClauseParam","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/swc_estree_compat/src/babelify/pat.rs","lineNumber":143,"sourceCode":"    fn from(pat: PatOutput) -> Self {\n        match pat {\n            PatOutput::Id(i) => Param::Id(i),\n            PatOutput::Rest(r) => Param::Rest(r),\n            PatOutput::Array(p) => Param::Pat(Pattern::Array(p)),\n            PatOutput::Object(p) => Param::Pat(Pattern::Object(p)),\n            PatOutput::Assign(p) => Param::Pat(Pattern::Assignment(p)),\n            PatOutput::Expr(p) => panic!(\"Cannot convert {p:?} to Param\"),\n        }\n    }\n}\n\nimpl From<PatOutput> for CatchClauseParam {\n    fn from(pat: PatOutput) -> Self {\n        match pat {\n            PatOutput::Id(i) => CatchClauseParam::Id(i),\n            PatOutput::Array(a) => CatchClauseParam::Array(a),\n            PatOutput::Object(o) => CatchClauseParam::Object(o),\n            _ => panic!(\n                \"illegal conversion: Cannot convert {:?} to CatchClauseParam\",\n                &pat\n            ),\n        }\n    }\n}\n\nimpl Babelify for ArrayPat {\n    type Output = ArrayPattern;\n\n    fn babelify(self, ctx: &Context) -> Self::Output {\n        ArrayPattern {\n            base: ctx.base(self.span),\n            elements: self\n                .elems\n                .into_iter()\n                .map(|opt| opt.map(|e| e.babelify(ctx).into()))\n                .collect(),","sourceCodeStart":125,"sourceCodeEnd":161,"githubUrl":"https://github.com/swc-project/swc/blob/5176682b65416c6b5de6b47379ae1588ea3ecb3f/crates/swc_estree_compat/src/babelify/pat.rs#L125-L161","documentation":"Per the grammar a catch parameter is at most an identifier or a binding (destructuring) pattern; rest elements, defaults and expression params are illegal, so `From<PatOutput> for CatchClauseParam` maps only Id/Array/Object and panics on everything else. The catch clause's param is converted at stmt.rs:315 via `self.param.map(|p| p.babelify(ctx).into())`.","triggerScenarios":"Recovered or hand-built `catch (...r) {}`, `catch ({a} = {}) {}`, or `catch (a.b) {}` — any catch param whose PatOutput is Rest, Assign, or Expr hits the `_` arm.","commonSituations":"Lenient parses of mistyped catch clauses; codemods rewriting catch params; ASTs assembled programmatically without grammar validation.","solutions":["Validate catch params before babelify: allow only Ident/Array/Object patterns","Fix the source's catch clause syntax","In transforms, never emit Rest/Assign/Expr as a catch param","Abort when parse errors were recovered instead of converting"],"exampleFix":"// before\nlet estree = module.babelify(); // panics on `catch (...r) {}`\n\n// after\nfn catch_param_ok(p: &Option<Pat>) -> bool {\n    p.as_ref().is_none_or(|p| matches!(p, Pat::Ident(_) | Pat::Array(_) | Pat::Object(_)))\n}\nassert!(catch_param_ok(&catch_clause.param));\nlet estree = module.babelify();","handlingStrategy":"validation","validationCode":"use swc_ecma_ast::Pat;\n\nfn catch_param_ok(p: &Option<Pat>) -> bool {\n    p.as_ref().is_none_or(|p| matches!(p, Pat::Ident(_) | Pat::Array(_) | Pat::Object(_)))\n}","typeGuard":"fn catch_param_convertible(p: &Pat) -> bool {\n    matches!(p, Pat::Ident(_) | Pat::Array(_) | Pat::Object(_))\n}","tryCatchPattern":"use std::panic::{catch_unwind, AssertUnwindSafe};\n\ncatch_unwind(AssertUnwindSafe(|| program.babelify()))\n    .map_err(|_| anyhow!(\"illegal catch clause parameter\"))?;","preventionTips":["Validate catch params (Id/Array/Object only) before estree conversion","Do not generate Rest/Assign/Expr catch params in codemods","Abort on recovered parse errors — invalid catch clauses come from recovery"],"tags":["rust","swc","babelify","catch-clause","binding-pattern","panic"],"backgroundTag":"unsupported-ast-conversion","analyzedSha":"5176682b65416c6b5de6b47379ae1588ea3ecb3f","analyzedAt":"2026-08-17T16:16:52.067Z","schemaVersion":2},"datasetVersion":"2026-08-22T20:17:22.307Z"}