mirror of
https://github.com/oven-sh/bun
synced 2026-02-13 20:39:05 +00:00
## Summary - Implement complete lowering of TC39 stage-3 standard ES decorators (the non-legacy variant used when tsconfig has no `experimentalDecorators`). - Passes all 147 esbuild decorator tests and 22 additional Bun-specific tests (191 total, 0 failures). - Supports method, getter, setter, field, auto-accessor, private member, and class decorators in both statement and expression positions, with proper evaluation order, class binding semantics, and decorator metadata. Fixes #4122 Fixes #20206 Fixes #14529 Fixes #6051 ## What's implemented | Feature | Details | |---|---| | Method/getter/setter decorators | Static and instance, public and private | | Field decorators | Initializer replacement + extra initializers via `__runInitializers` | | Auto-accessor (`accessor` keyword) | Lowered to WeakMap storage + getter/setter pair | | Private member decorators | WeakMap/WeakSet lowering with `__privateGet`/`__privateSet` | | Class decorators | Statement and expression positions | | Class expression decorators | Comma-expression lowering (no IIFE) | | Decorator metadata | `Symbol.metadata` support via `__decoratorMetadata` | | Evaluation order | All decorator expressions + computed keys evaluated in source order per TC39 spec | | Class binding semantics | Separate inner/outer class name bindings (element vs class decorator closures) | | Static block extraction | `this` replaced with class name ref when moved to suffix | | Computed property keys | Pre-evaluated into temp variables for correct ordering | ## Runtime helpers Added to `src/runtime.js` and registered in `src/runtime.zig`: - `__decoratorStart(base)` — creates decorator context array - `__decorateElement(array, flags, name, decorators, target, extra)` — applies decorators to a class element - `__decoratorMetadata(array, target)` — sets `Symbol.metadata` on the class - `__runInitializers(array, flags, self, value)` — runs initializer/extra-initializer arrays ## Test plan - [x] `bun bd test test/bundler/transpiler/es-decorators-esbuild.test.ts` — **147/147 pass** (esbuild's full decorator test suite) - [x] `bun bd test test/bundler/transpiler/es-decorators.test.ts` — **22/22 pass** - [x] `bun bd test test/bundler/transpiler/decorators.test.ts` — **22/22 pass** (legacy decorators still work) - [x] E2E runtime verification of method, field, accessor, class, private, and expression decorators 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Dylan Conway <dylan.conway567@gmail.com>