swc-project/swc · error
#[derive(FromVariant)] only works for an enum.
Error message
#[derive(FromVariant)] only works for an enum.
What it means
Compile-time panic from `#[derive(FromVariant)]` (crates/from_variant). The macro generates `From<T>` impls that wrap each variant payload (`Enum::Variant(v)`), which only makes sense for enums; applying it to a struct or union hits `panic!("#[derive(FromVariant)] only works for an enum.")` when matching on `input.data`.
Source
Thrown at crates/from_variant/src/lib.rs:47
is_unknown |= meta.path.is_ident("ignore");
Ok(())
})
.unwrap();
is_unknown
})
}
fn derive(
DeriveInput {
generics,
data,
ident,
..
}: DeriveInput,
) -> Vec<ItemImpl> {
let variants = match data {
Data::Enum(DataEnum { variants, .. }) => variants,
_ => panic!("#[derive(FromVariant)] only works for an enum."),
};
let mut from_impls: Vec<ItemImpl> = Vec::new();
for v in variants {
if is_ignored(&v.attrs) {
continue;
}
let variant_name = v.ident;
match v.fields {
Fields::Unnamed(FieldsUnnamed { unnamed, .. }) => {
if unnamed.len() != 1 {
panic!(
"#[derive(FromVariant)] requires all variants to be tuple with exactly \
one field"
)
}View on GitHub (pinned to 5176682b65)
Solutions
- Move the payload types into enum variants and derive on the enum
- Or drop the derive and write the `impl From<T> for X` conversions manually for a struct
Example fix
// before
#[derive(FromVariant)]
struct Wrapper {
inner: Expr,
}
// after
#[derive(FromVariant)]
enum Wrapper {
Expr(Expr),
} Defensive patterns
Strategy: validation
Prevention
- Apply `#[derive(FromVariant)]` only to enums
- For structs, write `impl From<T> for X` manually
When it happens
Trigger: `#[derive(FromVariant)]` on a struct or union item.
Common situations: Accidentally deriving FromVariant on wrapper structs while refactoring variant types out of an enum; copy-pasting derive lists between items.
Related errors
- An element descriptor's .kind property must be either "metho
- An element descriptor's .placement property must be one of "
- A class descriptor's .kind property must be "class", but a d
- ${objectType} can't have a .${name} property.
- Expected '${name}' to be a function
AI-assisted analysis of swc-project/swc@5176682b65 (2026-08-17).
Data as JSON: /api/errors/d8fe1e448a4e5d93.
Report an issue: GitHub.