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

  1. Add a variant (unit or single-field) so the enum type inference has input.
  2. Remove the Encode/Decode derive from intentionally empty enums.
  3. 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

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


AI-assisted analysis of swc-project/swc@5176682b65 (2026-08-17). Data as JSON: /api/errors/e59328a109055dcc. Report an issue: GitHub.