{"record":{"id":"cd22c80d6584a83b","repo":"swc-project/swc","slug":"illegal-conversion-cannot-convert-to-classbo","errorCode":null,"errorMessage":"illegal conversion: Cannot convert {:?} to ClassBodyEl","messagePattern":"illegal conversion: Cannot convert (.+?) to ClassBodyEl","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/swc_estree_compat/src/babelify/class.rs","lineNumber":60,"sourceCode":"            ),\n            id: Default::default(),\n            mixins: Default::default(),\n        }\n    }\n}\n\nimpl Babelify for ClassMember {\n    type Output = ClassBodyEl;\n\n    fn babelify(self, ctx: &Context) -> Self::Output {\n        match self {\n            ClassMember::Constructor(c) => ClassBodyEl::Method(c.babelify(ctx)),\n            ClassMember::Method(m) => ClassBodyEl::Method(m.babelify(ctx)),\n            ClassMember::PrivateMethod(m) => ClassBodyEl::PrivateMethod(m.babelify(ctx)),\n            ClassMember::ClassProp(p) => ClassBodyEl::Prop(p.babelify(ctx)),\n            ClassMember::PrivateProp(p) => ClassBodyEl::PrivateProp(p.babelify(ctx)),\n            ClassMember::TsIndexSignature(s) => ClassBodyEl::TSIndex(s.babelify(ctx)),\n            ClassMember::Empty(_) => panic!(\n                \"illegal conversion: Cannot convert {:?} to ClassBodyEl\",\n                &self\n            ),\n            ClassMember::StaticBlock(s) => ClassBodyEl::StaticBlock(s.babelify(ctx)),\n            ClassMember::AutoAccessor(..) => todo!(\"auto accessor\"),\n            #[cfg(swc_ast_unknown)]\n            _ => panic!(\"unable to access unknown nodes\"),\n        }\n    }\n}\n\nimpl Babelify for ClassProp {\n    type Output = ClassProperty;\n\n    fn babelify(self, ctx: &Context) -> Self::Output {\n        let computed = Some(self.key.is_computed());\n\n        ClassProperty {","sourceCodeStart":42,"sourceCodeEnd":78,"githubUrl":"https://github.com/swc-project/swc/blob/5176682b65416c6b5de6b47379ae1588ea3ecb3f/crates/swc_estree_compat/src/babelify/class.rs#L42-L78","documentation":"swc_estree_compat converts the SWC AST into a Babel/ESTree-shaped AST (swc_estree_ast). Babel's ClassBody element union has no node for an empty class member, so babelify of ClassMember::Empty — what a stray `;` inside a class body parses to — panics with \"illegal conversion: Cannot convert ... to ClassBodyEl\" (class.rs:60).","triggerScenarios":"Calling the crate's Babelify conversion (or any tool wrapping swc_estree_compat) on a program containing `class A { ; }` or a trailing semicolon after the last member such as `class A { m() {} ; }`.","commonSituations":"Machine-generated code with defensive semicolons; formatters leaving `;` after members; converting an already-parsed SWC AST that kept Empty members instead of dropping them.","solutions":["Remove stray semicolons from class bodies in the input source.","Pre-visit the AST and strip ClassMember::Empty nodes before babelify — they are semantically void.","Patch swc_estree_compat to skip Empty members instead of panicking, and report upstream."],"exampleFix":"// before\nclass A {\n  ;\n  method() {}\n}\n\n// after\nclass A {\n  method() {}\n}","handlingStrategy":"type-guard","validationCode":"// Strip semantically-void empty class members before babelify.\nfn drop_empty_class_members(program: &mut Program) {\n    struct Clean;\n    impl VisitMut for Clean {\n        fn visit_mut_class_members(&mut self, n: &mut Vec<ClassMember>) {\n            n.retain(|m| !matches!(m, ClassMember::Empty(_)));\n            n.visit_mut_children_with(self);\n        }\n    }\n    program.visit_mut_with(&mut Clean);\n}","typeGuard":"fn has_empty_class_member(program: &Program) -> bool {\n    struct Scan(bool);\n    impl Visit for Scan {\n        fn visit_class_member(&mut self, m: &ClassMember) {\n            if matches!(m, ClassMember::Empty(_)) { self.0 = true; }\n            m.visit_children_with(self);\n        }\n    }\n    let mut s = Scan(false);\n    program.visit_with(&mut s);\n    s.0\n}","tryCatchPattern":null,"preventionTips":["Normalize inputs: strip stray semicolons from class bodies before AST conversion.","When building conversion pipelines, always run a cleanup pass that drops Empty members.","Watch for ClassMember::AutoAccessor too — it hits a todo!() in the same match."],"tags":["swc","estree","babelify","class","panic"],"backgroundTag":"ast-conversion-unsupported-node","analyzedSha":"5176682b65416c6b5de6b47379ae1588ea3ecb3f","analyzedAt":"2026-08-17T16:16:52.067Z","schemaVersion":2},"datasetVersion":"2026-08-22T14:17:55.899Z"}