{"record":{"id":"5c9381e2e478d6f6","repo":"swc-project/swc","slug":"illegal-conversion-cannot-convert-to-objectm","errorCode":null,"errorMessage":"illegal conversion: Cannot convert {:?} to ObjectMember","messagePattern":"illegal conversion: Cannot convert (.+?) to ObjectMember","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/swc_estree_compat/src/babelify/prop.rs","lineNumber":57,"sourceCode":"\n    fn babelify(self, ctx: &Context) -> Self::Output {\n        match self {\n            Prop::Shorthand(i) => {\n                let id = i.babelify(ctx);\n                ObjectMember::Prop(ObjectProperty {\n                    base: id.base.clone(),\n                    key: ObjectKey::Id(id.clone()),\n                    value: ObjectPropVal::Expr(Box::alloc().init(Expression::Id(id))),\n                    computed: Default::default(),\n                    shorthand: true,\n                    decorators: Default::default(),\n                })\n            }\n            Prop::KeyValue(k) => ObjectMember::Prop(k.babelify(ctx)),\n            Prop::Getter(g) => ObjectMember::Method(g.babelify(ctx)),\n            Prop::Setter(s) => ObjectMember::Method(s.babelify(ctx)),\n            Prop::Method(m) => ObjectMember::Method(m.babelify(ctx)),\n            _ => panic!(\n                \"illegal conversion: Cannot convert {:?} to ObjectMember\",\n                &self\n            ),\n        }\n    }\n}\n\nimpl Babelify for KeyValueProp {\n    type Output = ObjectProperty;\n\n    fn babelify(self, ctx: &Context) -> Self::Output {\n        ObjectProperty {\n            base: ctx.base(self.span()),\n            key: self.key.babelify(ctx),\n            value: ObjectPropVal::Expr(Box::alloc().init(self.value.babelify(ctx).into())),\n            computed: Default::default(),\n            shorthand: Default::default(),\n            decorators: Default::default(),","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/swc-project/swc/blob/5176682b65416c6b5de6b47379ae1588ea3ecb3f/crates/swc_estree_compat/src/babelify/prop.rs#L39-L75","documentation":"babelify maps object-literal members to Babel ObjectMember for Shorthand, KeyValue, Getter, Setter and Method props. The catch-all panics for `Prop::Assign` — an assignment inside an object literal, which swc_ecma_ast itself documents as invalid for object literals — and for any unknown Prop variant, since ObjectMember has no shape for them. Unlike the cfg-gated arms, this `_` is always compiled.","triggerScenarios":"Babelify an ObjectLit containing `Prop::Assign`, produced by error recovery from `{ x = 1 }`-style broken input or by a transform/codemod that builds AssignProp nodes; the same arm also fires for unknown variants under `swc_ast_unknown` builds.","commonSituations":"Codemods that normalize object patterns into literals; lenient parsing of experimental `{ x = 1 }` pattern syntax; version skew under the swc_ast_unknown cfg; fuzzed AST corpora.","solutions":["Validate the AST for `Prop::Assign` nodes before babelify and reject or repair the input","Fix the source that produced an assignment inside an object literal","In transforms, emit KeyValue props or object patterns instead of AssignProp","For plugin builds, drop `--cfg=swc_ast_unknown` on babelify paths"],"exampleFix":"// before\nlet estree = module.babelify(); // panics on `{ x = 1 }` recovered into Prop::Assign\n\n// after - detect and reject first\nif module.has_assign_prop() {\n    return Err(anyhow!(\"Prop::Assign is not valid in an object literal\"));\n}\nlet estree = module.babelify();","handlingStrategy":"validation","validationCode":"use swc_ecma_ast::{Module, Prop};\nuse swc_ecma_visit::{Visit, VisitWith};\n\n#[derive(Default)]\nstruct AssignProps(Vec<swc_common::Span>);\n\nimpl Visit for AssignProps {\n    fn visit_prop(&mut self, p: &Prop) {\n        if let Prop::Assign(a) = p { self.0.push(a.span); }\n        p.visit_children_with(self);\n    }\n}\n\nfn has_assign_props(m: &Module) -> bool {\n    let mut v = AssignProps::default();\n    m.visit_with(&mut v);\n    !v.0.is_empty()\n}","typeGuard":"fn object_lit_member_ok(p: &Prop) -> bool {\n    !matches!(p, Prop::Assign(_))\n}","tryCatchPattern":"use std::panic::{catch_unwind, AssertUnwindSafe};\n\ncatch_unwind(AssertUnwindSafe(|| program.babelify()))\n    .map_err(|_| anyhow!(\"Prop::Assign cannot appear in an object literal\"))?;","preventionTips":["Validate for Prop::Assign before babelify when input may come from error recovery","In transforms, emit KeyValue props or patterns instead of AssignProp","Do not babelify programs whose parse error list is non-empty"],"tags":["rust","swc","babelify","object-literal","parser-error-recovery","panic"],"backgroundTag":"unsupported-ast-conversion","analyzedSha":"5176682b65416c6b5de6b47379ae1588ea3ecb3f","analyzedAt":"2026-08-17T16:16:52.067Z","schemaVersion":2},"datasetVersion":"2026-08-22T20:17:22.307Z"}