swc-project/swc · error · TypeError
An element descriptor's .placement property must be one of "
Error message
An element descriptor's .placement property must be one of "static", "prototype" or "own", but a decorator created an element descriptor with .placement "${placement}" What it means
The #[derive(Encode)] macro from swc's ast_node crate computes a single EnumType across all variants by folding. If the enum has no variants, the fold yields None and enum_type.expect("enum cannot be empty") panics inside the proc macro at compile time. The compiler reports 'proc-macro panicked' with this message attached to the derive invocation.
Source
Thrown at crates/swc_ecma_transforms_base/src/helpers/generated/_decorate.rs:201
if (elementObjects === undefined) return;
return _to_array(elementObjects).map(function(elementObject) {
var element = _toElementDescriptor(elementObject);
_disallowProperty(elementObject, "finisher", "An element descriptor");
_disallowProperty(elementObject, "extras", "An element descriptor");
return element;
});
}
function _toElementDescriptor(elementObject) {
var kind = String(elementObject.kind);
if (kind !== "method" && kind !== "field") {
throw new TypeError("An element descriptor's .kind property must be either \"method\" or" + " \"field\", but a decorator created an element descriptor with" + " .kind \"" + kind + "\"");
}
var key = _to_property_key(elementObject.key);
var placement = String(elementObject.placement);
if (placement !== "static" && placement !== "prototype" && placement !== "own") {
throw new TypeError(
"An element descriptor's .placement property must be one of \"static\","
+ " \"prototype\" or \"own\", but a decorator created an element descriptor"
+ " with .placement \""
+ placement
+ "\""
);
}
var descriptor = elementObject.descriptor;
_disallowProperty(elementObject, "elements", "An element descriptor");
var element = { kind: kind, key: key, placement: placement, descriptor: Object.assign({}, descriptor) };
if (kind !== "field") _disallowProperty(elementObject, "initializer", "A method descriptor");
else {
_disallowProperty(descriptor, "get", "The property descriptor of a field descriptor");
_disallowProperty(descriptor, "set", "The property descriptor of a field descriptor");
_disallowProperty(descriptor, "value", "The property descriptor of a field descriptor");
element.initializer = elementObject.initializer;
}
View on GitHub (pinned to 5176682b65)
Solutions
- Add a variant (unit or single-field) so the enum type inference has input.
- Remove the Encode/Decode derive from intentionally empty enums.
- If the empty enum models 'never', consider a struct with an uninhabited field or simply drop the type from the serialized AST.
Example fix
// before: panics with 'enum cannot be empty'
#[derive(Encode, Decode)]
enum NoCases {}
// after
#[derive(Encode, Decode)]
enum NoCases {
#[encoding(ignore)]
Placeholder(u8),
} Defensive patterns
Strategy: validation
Validate before calling
// Codegen guard: only emit derives when the enum is non-empty.
let variants = schema.cases; // your generator's variant list
let derive_attr = if variants.is_empty() {
String::new()
} else {
"#[derive(Encode, Decode)]".to_string()
};
// then: #{derive_attr} enum {name} { #(#variants),* } Prevention
- Do not derive Encode/Decode on uninhabited enums; model 'never' with a struct holding an uninhabited field instead.
- Add a CI check that greps for `enum \w+ \{\s*\}` near ast_node derives.
When it happens
Trigger: Deriving Encode (or the paired Decode) on a variant-less enum: `#[derive(Encode)] enum Void {}`. Also reachable when a macro/codegen layer forwards an emptied enum into these derives.
Common situations: Placeholder types committed before variants are written; schema-driven codegen where an empty category is legal in the schema but not for these derives; refactors that move all variants elsewhere and leave the shell behind with derives intact.
Related errors
- An element descriptor's .kind property must be either "metho
- 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
- Finishers must return a constructor.
AI-assisted analysis of swc-project/swc@5176682b65 (2026-08-17).
Data as JSON: /api/errors/e59328a109055dcc.
Report an issue: GitHub.