{"record":{"id":"622e5a9ab0462667","repo":"swc-project/swc","slug":"named-enum-unsupported-622e5a","errorCode":null,"errorMessage":"named enum unsupported","messagePattern":"named enum unsupported","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/ast_node/src/encoding/encode.rs","lineNumber":111,"sourceCode":"                    match &unknown.fields {\n                        syn::Fields::Unnamed(fields) => match fields.unnamed.len() {\n                            1 => {\n                                assert_eq!(enum_type, EnumType::Unit);\n                                syn::parse_quote! {\n                                    #ident::#name(tag)\n                                        => tag.encode(writer)?,\n                                }\n                            }\n                            2 => {\n                                assert_eq!(enum_type, EnumType::One);\n                                syn::parse_quote! {\n                                    #ident::#name(tag, value)\n                                        => cbor4ii::core::types::Tag((*tag).into(), &*value).encode(writer)?,\n                                }\n                            }\n                            _ => panic!(\"unknown member must be a tag and a value\"),\n                        },\n                        _ => panic!(\"named enum unsupported\"),\n                    }\n                });\n\n            if matches!(enum_type, EnumType::Struct) {\n                assert!(\n                    unknown_arm.is_none(),\n                    \"struct enum does not allow unknown variants\"\n                );\n            }\n\n            let mut discriminant: u32 = 0;\n            let fields = iter.map(|field| -> syn::Arm {\n                match field.discriminant.as_ref() {\n                    Some((_, syn::Expr::Lit(syn::ExprLit { lit: syn::Lit::Int(lit), .. }))) => {\n                        discriminant = lit.base10_parse::<u32>().unwrap();\n                    },\n                    Some(_) => panic!(\"unsupported discriminant type\"),\n                    None => (),","sourceCodeStart":93,"sourceCodeEnd":129,"githubUrl":"https://github.com/swc-project/swc/blob/5176682b65416c6b5de6b47379ae1588ea3ecb3f/crates/ast_node/src/encoding/encode.rs#L93-L129","documentation":"When expanding the #[encoding(unknown)] arm, the Encode derive matches on unknown.fields and only handles syn::Fields::Unnamed; a named-field variant like `Unknown { tag, value }` or a unit variant `Unknown` falls into the catch-all and panics 'named enum unsupported'. The unknown variant must be positional: (tag) or (tag, value).","triggerScenarios":"derive(Encode) on an enum whose #[encoding(unknown)] variant uses named fields or has no fields.","commonSituations":"Rewriting the generated Unknown variant with named fields for readability; porting serde enum conventions into swc codec types.","solutions":["Rewrite the variant with positional fields: `Unknown(u32)` or `Unknown(u32, Unknown)`.","Use #[ast_node] to generate the variant in the correct shape."],"exampleFix":"// before\n#[encoding(unknown)]\nUnknown { tag: u32, value: Unknown }\n\n// after\n#[encoding(unknown)]\nUnknown(u32, Unknown)","handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never convert the unknown variant to named fields — it must stay positional.","Use #[ast_node] to generate the Unknown variant instead of hand-writing it.","cargo check after touching any #[encoding(...)] attribute."],"tags":["rust","proc-macro","derive","encode","enum","unknown-variant"],"backgroundTag":"derive-macro-enum-shape-invalid","analyzedSha":"5176682b65416c6b5de6b47379ae1588ea3ecb3f","analyzedAt":"2026-08-17T16:16:52.067Z","contentChangedAt":"2026-08-17T16:16:52.067Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}