{"record":{"id":"1fb557c5b6f7ac08","repo":"swc-project/swc","slug":"named-enum-unsupported","errorCode":null,"errorMessage":"named enum unsupported","messagePattern":"named enum unsupported","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/ast_node/src/encoding/decode.rs","lineNumber":142,"sourceCode":"                                    tag => #ident::#name(tag),\n                                }\n                            }\n                            2 => {\n                                assert_eq!(enum_type, EnumType::One);\n                                let val_ty = &fields.unnamed[1].ty;\n                                syn::parse_quote! {\n                                    tag => {\n                                        let tag: u32 = tag.try_into().map_err(|_| cbor4ii::core::error::DecodeError::CastOverflow {\n                                             name: &\"unknown-tag\",\n                                        })?;\n                                        let val = <#val_ty as cbor4ii::core::dec::Decode<'_>>::decode(reader)?;\n                                        #ident::#name(tag, val)\n                                    },\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\n                .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\"),","sourceCodeStart":124,"sourceCodeEnd":160,"githubUrl":"https://github.com/swc-project/swc/blob/5176682b65416c6b5de6b47379ae1588ea3ecb3f/crates/ast_node/src/encoding/decode.rs#L124-L160","documentation":"When expanding the #[encoding(unknown)] arm, the macro matches on unknown.fields and only handles syn::Fields::Unnamed; everything else — a named-field variant like `Unknown { tag: u32, value: Expr }` 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/Decode) on an enum whose #[encoding(unknown)] variant uses named fields or has no fields at all.","commonSituations":"Developers 'improving' the generated Unknown variant with named fields for readability; porting serde enum styles into swc codec types.","solutions":["Rewrite the variant with positional fields: `Unknown(u32)` or `Unknown(u32, Unknown)`.","Use #[ast_node] so the Unknown variant is generated 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 rename the unknown variant's fields — it must stay a positional tuple variant.","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","decode","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-14T05:17:10.506Z"}