oxc-guard
b6f1458dec
release(crates): oxc v0.144.0 ( #25474 )
...
### 💥 BREAKING CHANGES
- a33788e ast: [**BREAKING**] Group class heritage into `ClassHeritage` (#25360 ) (camc314)
- 5c5cdcd ast: [**BREAKING**] Narrow `TSInterfaceHeritage::expression` to TSTypeName (#24360 ) (camc314)
- 6be314f ast: [**BREAKING**] Remove duplicated `VariableDeclarator::kind` (#25319 ) (camc314)
- 44fd320 ast: [**BREAKING**] Split TS external modules & Namespace Declarations (#25284 ) (camc314)
### 🚀 Features
- 9a37c41 napi: Restructure React transform options (#25326 ) (Boshen)
- b3c1b30 allocator: Add `ArenaVec::push_mut` (#25338 ) (overlookmotel)
### 🐛 Bug Fixes
- bbd6ed3 codegen: Wrap string literal in parens after directives (#25435 ) (overlookmotel)
- d07a293 codegen: Preserve cast parentheses in conditional tests (#25115 ) (camc314)
- 8b7d441 codegen: Preserve satisfies parentheses before bitwise operators (#25113 ) (camc314)
- e0fb2d7 minifier: Avoid unsafe return removal in labeled blocks (#25406 ) (Armano)
- c49f4ce parser: Preserve terminal license comments (#25400 ) (camc314)
- 9d19ab3 transform_react: Downgrade nonfatal compiler diagnostics (#25418 ) (Boshen)
- 937825c react_compiler: Disable exhaustive memo validation by default (#25417 ) (Boshen)
- 12937b3 parser: Reject comma expressions in class fields (#25385 ) (Cameron)
- 7d8a9b5 react_compiler: Preserve hook spans for React Refresh (#25393 ) (Boshen)
- 9e93ba6 parser: Reset auto-accessor initializer context (#25384 ) (camc314)
- cc2e28d parser: Reject trailing tokens in `Parser::parse_expression` (#25371 ) (camc314)
- 697c629 minifier: Preserve Annex B labeled-function bindings in implicit-return rewrite (#25349 ) (Armano)
- 4d723ca parser: Report TS1035 for quoted module names (#25305 ) (camc314)
- 0c9b980 semantic: Report module declaration diagnostics (#25285 ) (camc314)
- 2a1058a napi: Omit parser header from WASI declarations (#25254 ) (camc314)
### ⚡ Performance
- dd1430b semantic: Avoid allocation in class overload check (#25440 ) (camc314)
- e420816 parser: Optimize trailing comma tracking (#25376 ) (camc314)
- 6529d1a minifier: Short-circuit scope check when alternate already determines result (#25318 ) (Armano)
### 📚 Documentation
- fe111eb allocator: Improve doc comments for `Arena` methods (#24922 ) (overlookmotel)
2026-08-10 09:57:10 +00:00
oxc-guard
45a17c25d1
release(crates): oxc v0.143.0 ( #25250 )
...
### 💥 BREAKING CHANGES
- 4120da0 semantic: [**BREAKING**] Return borrowed JSDoc so the parse cache works (#25186 ) (Connor Shea)
- f0a41c8 allocator: [**BREAKING**] Remove `ArenaBox::dangling` method (#25236 ) (overlookmotel)
- 067da8c ast: [**BREAKING**] Store single parameter in `TSIndexSignature::parameter` (#25154 ) (camc314)
- a0c7788 ast: [**BREAKING**] Change `TSIndexSignatureName::name` to `Ident` (#25150 ) (camc314)
- 1bdedd1 ast: [**BREAKING**] Introduce `ExportDeclaration`, `ExportFromDeclaration` (#25095 ) (camc314)
- c917f20 ast: [**BREAKING**] Introduce `ArrowFunctionBody` enum (#24987 ) (camc314)
- 7e1199c ast: [**BREAKING**] Remove conversion to `Box` from AST builder methods (#25038 ) (overlookmotel)
### 🚀 Features
- 3c8312e allocator: Make `Box` `Send` + `Sync` when the type it contains is (#25242 ) (overlookmotel)
- cb5bc08 ast: Derive `GetSpan` for `Comment` (#25147 ) (leaysgur)
- 8541e18 ast_tools: Generate minifier scope collector (#25088 ) (camc314)
- 5acdae2 ecmascript: Skip transparent TS expressions (#25072 ) (camc314)
- 85d0f4d napi: Add React Compiler transform binding (#24934 ) (Boshen)
- 70d6ece minifier: Fold safe integer exponentiation (#25009 ) (Dunqing)
- 73fc747 minifier: Enable termination statement optimization for do while (#24921 ) (Armano)
- 5eadfdb minifier: Fold safe integer division and remainder (#24981 ) (Dunqing)
### 🐛 Bug Fixes
- 6c9ee14 minifier: Preserve if-chain idempotency and correct side effects when alternate should not be moved (#25041 ) (Armano)
- 8a47ff3 ecmascript: Do not treat lone-surrogate strings as constants (#25084 ) (Dunqing)
- 468b970 isolated-declarations: Strip re-export attributes (#25090 ) (camc314)
- a70035d parser: Report export imports in namespaces (#25086 ) (camc314)
- 5d8ccf5 react_compiler: Preserve nonfatal diagnostics (#25066 ) (Boshen)
- d349e4a react_compiler: Match eslint suppression gating (#25068 ) (Boshen)
- 0dc16ba react_compiler: Track catch block declarations (#25067 ) (Boshen)
- e6734a5 minifier: Fold typeof comparisons with known object strings (#25017 ) (Dunqing)
- 3a9d5a5 minifier: Keep `typeof foo == ['object']` as-is (#24941 ) (sapphi-red)
- 10ec276 ast: Custom AST builder methods take `IntoIn<ArenaBox>` where child method does (#25033 ) (overlookmotel)
- fbe8d31 minifier: Respect targets when folding RegExp source (#24790 ) (Dunqing)
### ⚡ Performance
- fb402b0 minifier: Stop re-deriving printed numeric spellings (#25103 ) (Dunqing)
- 7251e52 react_compiler: Avoid large types on stack (#25037 ) (overlookmotel)
- e07718f isolated_declarations: Avoid large types on stack (#25036 ) (overlookmotel)
- 9fb1e3e transformer: Avoid large types on stack (#25035 ) (overlookmotel)
- 8b80f8b parser: Avoid large types on stack (#25034 ) (overlookmotel)
### 📚 Documentation
- 2ea0aa9 ast: Correct grammar in AST builder methods doc comments (#25173 ) (overlookmotel)
2026-08-03 11:07:37 +00:00
overlookmotel
ec7018ef4f
refactor(allocator, str): use impl GetAllocator instead of generic params ( #25177 )
...
Pure refactor. Along the same lines as #25174 and other PRs in this stack.
Replace generic params with `impl` for `GetAllocator` in methods of various types and traits across `oxc_allocator` and `oxc_str`, to make the code easier to read.
2026-08-01 15:40:56 +00:00
oxc-guard[bot]
fc702c1fa9
release(crates): oxc v0.142.0 ( #24977 )
...
### 💥 BREAKING CHANGES
- 1ac5ac7 ast: [**BREAKING**] Tighten bound on `AstBuild` trait (#24925 )
(overlookmotel)
### 🚀 Features
- c7c5696 minifier: Fold parenthesized boolean ternary tests (#24968 )
(Dunqing)
- 82c5806 minifier: Fold sequence branches in boolean ternaries (#24943 )
(Dunqing)
- cc623d9 ast_visit: Add VisitJsMut visitor (#24828 ) (Boshen)
- b31713a minifier: Add new IsTerminated trait and use it in exit-point
optimization (#24950 ) (Armano)
- e9e0f24 minifier: Shorten integer zero comparisons (#24933 ) (Dunqing)
- 34f5559 minifier: Convert switch with one case to if statement
(#24611 ) (Armano)
- 9107e74 str: Add `static_str!` macro (#24887 ) (overlookmotel)
- 4d6f623 parser: Emit error for type args in JS files (#24896 )
(camc314)
- ec08afc ast: Re-export `Ident` from `oxc_ast` crate (#24861 )
(overlookmotel)
- 73cfdfa oxc: Re-export `oxc_str` types from `oxc` crate (#24860 )
(overlookmotel)
- 11f5d1f ast_visit: Add `Utf8ToUtf16::convert_program_and_comments`
(#24859 ) (overlookmotel)
### 🐛 Bug Fixes
- cb5acfb minifier: Optimize termination statements in labeled
statements (#24813 ) (Armano)
- 4618300 minifier: Avoid longer numeric constant folds (#24875 )
(Dunqing)
- f7971f1 minifier: Keep side effects in typeof comparisons (#24940 )
(sapphi-red)
- 4597d6f minifier: Keep side effects when compressing `== true` to `==
1` (#24939 ) (sapphi-red)
- c3a48df minifier: Keep side effects values in template literals
(#24938 ) (sapphi-red)
- e19f183 minifier: Keep side effects when folding `Number` call
(#24937 ) (sapphi-red)
- 9d7745a react-compiler: Preserve warning bailouts (#24935 ) (Boshen)
- 0126aba codegen: Preserve orphaned file coverage comments (#24815 )
(Dunqing)
- 9fbbaf8 parser: Clarify return in class static blocks (#24899 )
(camc314)
- e7d5c78 str: Fix hygiene of `format_ident!` and `format_str!` macros
(#24886 ) (overlookmotel)
- 07e9acc ecmascript: Keep side effects in parent of `toString` calls
(#24846 ) (sapphi-red)
- 16a40ad ecmascript: Detect side effects in unused arguments to
`charCodeAt` (#24845 ) (sapphi-red)
- 5b4ae54 parser: Use specific for-await diagnostic (#24856 ) (camc314)
- ffcc33a parser: Report for-await in non-async functions (#24855 )
(camc314)
- df230d0 minifier: Avoid reordering this in nested class keys (#24785 )
(Dunqing)
- d24b76b minifier: Isolate derived constructor this state (#24784 )
(Dunqing)
- 582805d parser: Parse unary conditional after satisfies (#24807 )
(Boshen)
- 23b904f minifier: Preserve default parameter side effects (#24791 )
(Dunqing)
- 3048594 parser: Use correct diagnostic for `await using` in bare
switch case (#24798 ) (camc314)
- e80574f estree: Handle empty spans serializing `ImportMeta` and
`NewTarget` (#24775 ) (overlookmotel)
- 4b12840 minifier: Do not fold a `-0` ternary branch to `+a` (loses the
sign) (#23637 ) (Jerry Zhao)
- 133bb35 ecmascript: Detect side effects of `foo().#bar` correctly when
PropertyReadSideEffects::None (#24769 ) (sapphi-red)
### ⚡ Performance
- a086d91 ecmascript: Avoid number literal allocations (#24889 )
(Dunqing)
- 98f2ecb react_compiler: Compare value set pointers before probing in
state merge (#24805 ) (Marius Schulz)
- b287f29 estree: Avoid ident hash calculations when serializing
(#24774 ) (overlookmotel)
### 📚 Documentation
- 4d2e2bf ast: Fix incorrect return value in `common_js_require` docs
(#24945 ) (connorshea)
- b539e74 estree: Document custom serializers for `ImportMeta` and
`NewTarget` (#24777 ) (overlookmotel)
Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com >
2026-07-27 23:07:40 +08:00
overlookmotel
9107e7491b
feat(str): add static_str! macro ( #24887 )
...
Add a `static_str!` macro to create a `Str<'static>`, same as the existing `static_ident!` macro.
Why is this macro useful? Why not just use `Str::from`?
`Str` in time will likely evolve to have more features and constraints than it currently does. e.g. constrain max length to `u32::MAX`, add a flag for "is all ASCII". `Str::from` will likely gain runtime checks, whereas this macro will perform any checks or calculations at compile time. So using this macro in preferences to `Str::from` is future-proof.
We may also store all static strings pre-defined in a single packed concatenated string, at which point `Str::new_const` would not work either - it has to be a macro.
2026-07-24 10:11:16 +00:00
overlookmotel
e7d5c7801d
fix(str): fix hygiene of format_ident! and format_str! macros ( #24886 )
...
Avoid `use` statements in these macros, to avoid naming clashes with the user-provided input.
2026-07-24 10:04:52 +00:00
oxc-guard[bot]
14533a3dc1
release(crates): oxc v0.141.0 ( #24714 )
...
### 💥 BREAKING CHANGES
- 54cc121 ast: [**BREAKING**] Split `MetaProperty` into `ImportMeta` and
`NewTarget` (#24557 ) (camc314)
### 🚀 Features
- 4c71560 parser: More friendly error for spread element in dynamic
imports (#24705 ) (sapphi-red)
- 7b045cd minfier: Drop last break from last switch case (#24673 )
(Armano)
- 7d3c178 minifier: Remove unreachable recursive functions (#24125 )
(Dunqing)
- 94f99b3 ast: Allow `NONE` to be passed to AST builder methods where
`Option<ArenaVec>` is expected (#24629 ) (overlookmotel)
- 77230c5 ast: Accept arrays for `ArenaVec` params of AST builder
methods (#24621 ) (overlookmotel)
- f08b152 allocator: Implement `FromIn` for array to `Vec` conversion
(#24620 ) (overlookmotel)
- 2338c13 track-memory-allocations: Track heap deallocs, alloc bytes,
and peak growth (#24619 ) (Boshen)
- 7aa4739 syntax,transformer: Move JSX entity decoder to `oxc_syntax`
(#24617 ) (camc314)
- 2b097c4 str: Export `Str` as `ArenaStr` (#24604 ) (overlookmotel)
- 3acf4c1 minifier: Expand switch optimiation to remove empty cases
(#24520 ) (Armano)
- 129b759 parser: Improve diagnostics for unparenthesized LHS on
exponential expr (#24569 ) (camc314)
- 4d0c601 minifier: Fold arithmetic over undefined and null operands
(#24485 ) (Dunqing)
- 91541dd minifier: Drop empty switch statements (#24527 ) (Armano)
- d05224d ast_visit: Generate VisitJs visitor that skips TypeScript
type-space (#24499 ) (Boshen)
- 3d22307 parser: Add `ParseOptions::enable_ident_hashes` (#24491 )
(Boshen)
### 🐛 Bug Fixes
- 64c2241 minifier: Align class heritage removal with assumptions
(#24533 ) (Dunqing)
- 48b59f4 parser: Span ambient generator diagnostics (#24711 ) (camc314)
- e750a82 ecmascript: Fix false negative for may_have_side_effects on
dynamic property access (#24709 ) (sapphi-red)
- f145d73 minifier: Guard reordered identifier reads (#24698 ) (Dunqing)
- a2ef382 isolated-declarations: Reject `window.Symbol` as global symbol
reference (#24689 ) (camc314)
- b1bcf72 minifier: Invalidate facts for redeclared bindings (#24658 )
(Dunqing)
- 921b834 minifier: Don't treat a conditionally-assigned var as
write-once (#24650 ) (Dunqing)
- 061af1f minifier: Avoid stale pure function summaries (#24636 )
(Dunqing)
- 40c2f43 allocator: `Vec::from_array_in` do not allocate zero-length
array (#24628 ) (overlookmotel)
- 70994ae codegen: Preserve comments before expression operands (#24510 )
(Dunqing)
- 7b4baff parser: Reject new import member access (#23459 ) (camc314)
- 128b385 minifier: Clippy warning with no-debug-assertions (#24547 )
(camc314)
- 8421feb parser: Use first `as` span for imported name (#24537 )
(leaysgur)
- c517aa0 parser: Reject invalid accessor assertions (#24504 ) (camc314)
### ⚡ Performance
- 884d9eb parser: Pre-size cover-grammar assignment target buffers
(#24683 ) (Boshen)
- d3f07a0 diagnostics: Box OxcDiagnosticInner to reduce binary size
(#24665 ) (Boshen)
- bcc9de0 parser: Defer diagnostic creation until parse exit (#24663 )
(Boshen)
- c35d8ab allocator: Mark `ReplaceWith` panic path cold (#24515 )
(camc314)
- ba65790 semantic, allocator: Branchless `clone_in` for semantic IDs
(#24564 ) (overlookmotel)
- 747feec parser: Build AST nodes with the AST builder instead of
cloning (#24540 ) (Boshen)
- ba35a0d react_compiler: Use IndexVec for dense id-keyed maps (#24549 )
(Boshen)
- b685062 react_compiler: Keep small hot-path collections inline
(#24514 ) (Marius Schulz)
- a149e95 transformer: Outline rare expression exits (#24512 ) (camc314)
- 7808a6e react_compiler: Make aliasing effects cheap to intern and
clone (#24506 ) (Marius Schulz)
- 3a36f2a react_compiler: Store AbstractValue reasons as a u16 bitmask
(#24480 ) (Boshen)
- 1c96753 react_compiler: Use FxHashMap for the lookup-only aliasing
node map (#24490 ) (Boshen)
Co-authored-by: Cameron <cameron.clark@hey.com >
2026-07-21 16:09:41 +01:00
overlookmotel
10fd38eab4
test(allocator, data_structures, str): use implements! macro in tests ( #24722 )
...
Use `implements!` macro (introduced in #24721 ) in various tests, including adding some new ones.
The most valuable change is replacing a `compile_fail` doctest which checks that `Arena` is not `Sync`. Using `assert!(implements!(Arena: !Sync));` is more robust.
2026-07-20 12:36:14 +00:00
overlookmotel
0ffa88e750
fix(str): enable hashbrown feature inline-more ( #24719 )
...
Pure refactor.
`oxc_str` uses `hashbrown` crate. Because `oxc_str` depends on `oxc_allocator`, feature unification enables the `inline-more` Cargo feature for `hashbrown`. Make this explicit by enabling the `inline-more` feature in `oxc_str` crate too.
2026-07-20 10:53:19 +00:00
overlookmotel
5293431203
feat(str)!: move IdentBuildHasher to oxc_str crate ( #24717 )
...
Move all `Ident`\-hashing code from `oxc_allocator` into `oxc_str`, to sit alongside `Ident`'s code.
This feels like the natural place for this code, and reduces the public API surface - we no longer need to expose `Ident`'s internals (`ident_hash`). Now only `IdentHasher` and `IdentBuildHasher` are exposed.
Only change to code is removing `pack_len_hash`, as it was only used in tests.
2026-07-20 10:48:48 +00:00
overlookmotel
2b097c411b
feat(str): export Str as ArenaStr ( #24604 )
...
Companion to #23746 . Re-export `Str` under `ArenaStr` alias, following convention of `ArenaVec`, `ArenaBox` etc.
Within Oxc we can continue to use `Str` as it's unambiguous - we only have one arena string type. But it'd be helpful for Oxc's consumers. e.g. Rolldown has a lot of repetition of `oxc::ast::ast::Str` which could be shortened to `ArenaStr`, without causing ambiguity with other string types.
2026-07-16 18:17:13 +00:00
overlookmotel
ba65790029
perf(semantic, allocator): branchless clone_in for semantic IDs ( #24564 )
...
Follow-on after #24422 .
Make cloning semantic IDs (`NodeId`, `ScopeId` etc) use branchless arithmetic.
* Cloning `NodeId` now just uses a single OR operation to take into account whether to preserve the existing ID (`clone_in_with_semantic_ids`) or substitute a dummy ID (`clone_in`).
* Cloning `Cell<Option<ScopeId>>` is 2 instructions (NOT + AND) on x86_64, or just 1 on aarch64 (NOT-AND).
https://godbolt.org/z/1KWdc5hnb
The mechanism is a type `CloneInSemanticIds` which is used as `with_semantic_ids` instead of a `bool`:
```rs
#[repr(u32)]
pub enum CloneInSemanticIds {
With = 0,
Without = u32::MAX,
}
```
This is 4 bytes, rather than `bool`'s 1 byte, but that makes no difference - either way it takes 1 register to pass between functions. The choice of discriminants is what enables the cheap arithmetic.
This is even smaller in terms of binary size than the previous solution of marking `Cell::clone_in_impl` as `#[inline(never)]` (OR instruction is smaller than function call), and it's more performant as it loses the function call overhead. It also keeps `Cell`'s blanket implementation of `CloneIn` generalized.
Between #24422 and this PR, merging `CloneIn` with/without semantic IDs into a single path has gained us a large binary size reduction, and lost us nothing - or may even have gained us a marginal perf improvement.
No visible change on our benchmarks, as we don't use `CloneIn` much, but it may well be a measurable improvement for Rolldown, which clones whole ASTs.
2026-07-16 04:14:55 +00:00
Boshen
3d223072c2
feat(parser): add ParseOptions::enable_ident_hashes ( #24491 )
...
Adds `ParseOptions::enable_ident_hashes` (default `true`) and `Ident::new_unhashed` in `oxc_str`, and turns it off in the parse-only paths of the `oxc-parser` napi crate and the JS/JSON formatters.
### Why
`Ident`'s precomputed hash (#19143 ) is a parse-time investment that pays off in semantic analysis — but parse-only consumers (parse + serialize, formatting) pay it for nothing. Profiling against other native parsers showed identifier hashing at 3.5-4.6% of parse time.
Measured on M-series (yuku-style native harness, 50 warmup + 300 runs, median):
| fixture | default | option off |
|---|---|---|
| react.development.js | 0.156 ms | 0.152 ms (−2.3%) |
| binder.ts | 0.383 ms | 0.370 ms (−3.5%) |
| App.tsx | 1.140 ms | 1.111 ms (−2.5%) |
| checker.ts | 7.862 ms | 7.499 ms (−4.6%) |
| typescript.js | 25.07 ms | 24.16 ms (−3.6%) |
### Contract
Unhashed `Ident`s store hash `0`; `Eq`/`Hash`/`ContentEq` include the stored hash, so unhashed and hashed `Ident`s of the same string do not compare equal. Semantic analysis (or anything relying on `Ident` hashing) must not run on an AST parsed with the option disabled. Default behavior is unchanged.
Every `Ident` the parser creates funnels through the `ParserImpl::ident()` helper, so the option applies uniformly. This covers identifiers lexed directly (`parse_identifier_kind`, `parse_private_identifier`) as well as those reconstructed from a `&str`/`Str` — import/export specifier locals, JSX element/member names, the TS `intrinsic` type name, TS import-type option keys (`with`/`assert`), and the `import x = this` recovery path — which would otherwise always be hashed through `Into<Ident>`. Exhaustively checked by parsing the test262/babel/typescript/misc/prettier corpora (96.5k files, 5.6M identifiers) in both option states and walking every `Ident` in the AST.
On 64-bit platforms `Ident::new_unhashed` compiles to a no-op: an unhashed `Ident` has the same layout and bit representation as `&str`.
### Opt-outs
- **napi `oxc-parser`** ties `enable_ident_hashes` to whether semantic errors are requested. Both parse entry points run `SemanticBuilder` only when `showSemanticErrors` is set, so the common parse-and-serialize path skips hashing while the semantic-errors path keeps it. Serialized output is unchanged — the hash is internal to `Ident` and never emitted.
- **JS and JSON formatters** turn it off: they never run semantic analysis and only read `Ident::as_str` / compare idents against string literals. Exception: the JS formatter keeps hashes when built with the `detect_code_removal` feature, whose check runs `SemanticBuilder` on the formatter-parsed AST.
2026-07-14 15:55:27 +00:00
Boshen
f297654a68
refactor(allocator, ast_tools): generate a single CloneIn traversal via a runtime flag ( #24422 )
...
## Summary
The `CloneIn` derive generated **two near-identical traversals over the whole AST** — `clone_in` (resets semantic ids to their default) and `clone_in_with_semantic_ids` (preserves them). Almost every node carries an id field, so the two bodies diverge nearly everywhere and the pair roughly doubled the clone codegen.
This threads *"preserve semantic ids?"* as a **runtime `bool`** through a **single** traversal:
- **`CloneIn::clone_in_impl(&self, with_semantic_ids: bool, allocator)` is the one required method.** `clone_in` / `clone_in_with_semantic_ids` are `#[inline(always)]` default wrappers that call it with `false` / `true`. Hand-written impls provide only `clone_in_impl`.
- The **derive emits a single `clone_in_impl` body per type** — no per-type `clone_in` / `clone_in_with_semantic_ids` wrappers.
- Semantic ids live in `Cell<NodeId>` / `Cell<Option<{Scope,Symbol,Reference}Id>>`. **`Cell<T: Copy + Default>::clone_in_impl` threads the flag**: preserve (`Cell::new(self.get())`) when `with_semantic_ids`, otherwise reset to the default (`Cell::new(T::default())` = `NodeId::DUMMY` / `None`). So the derive emits a plain `clone_in_impl(&self.node_id, …)` per id field — no per-field `if/else`.
- **`Cell::clone_in_impl` is `#[inline(never)]`** so the (for some consumers dead) preserve branch isn't inlined at every id-field site — see Results.
## Results
Measured `f736d87e77` → `db9f2ab41a` on this branch (release, stripped, fat-LTO):
| | before | after | Δ |
|---|--:|--:|--:|
| `oxc_ast` generated `CloneIn` (source lines) | 7,180 | 5,581 | **−1,599 (−22%)** |
| oxlint binary | 14,192,816 B | 14,126,656 B | **−66,160 B (−64.6 KiB)** |
| napi transform cdylib (`--features allocator`) | 3,633,312 B | 3,633,312 B | **0 (neutral)** |
The two binaries move differently because they clone differently:
- **oxlint / rolldown clone *with* semantic ids** (react compiler on `TSType`; whole-`Program` clones). They already carried chunks of both traversals; merging dedups them → **−64.6 KiB**.
- **napi transform / parse clone *without* ids** — `oxc_transformer` never calls `clone_in_with_semantic_ids`, so before this PR `--gc-sections` dropped that whole half. The merged traversal would force the preserve branch live at every id field (~+16 KiB); `#[inline(never)]` on the `Cell` leaf outlines it to one function per `Cell<T>`, keeping these binaries **flat**.
## Behavior & perf
Behavior is identical by construction — `clone_in` resets ids (`Cell::new(None)` / `Cell::new(DUMMY)`), `clone_in_with_semantic_ids` preserves them. The runtime flag is loop-invariant and well predicted; the `#[inline(never)]` leaf adds one outlined call per id-cell on the clone path (expected negligible — worth a benchmark spot-check). Generated files were produced by `just ast`.
---
🤖 AI-assisted (Claude Code), reviewed and measured by the author.
2026-07-14 15:49:54 +00:00
oxc-guard[bot]
8e0ed2ebb9
release(crates): oxc v0.140.0 ( #24453 )
...
### 🚀 Features
- 616bfa2 minifier: Remove unreachable code after terminating statements
(#24441 ) (Dunqing)
- ddab89a data_structures: Add `likely` and `unlikely` functions
(#24368 ) (overlookmotel)
- a3a39f9 react_compiler: Implement enableEmitHookGuards codegen
(#24329 ) (Boshen)
- b79eef7 minifier: Apply De Morgan's law to negated comparison chains
in jump guards and loop tests (#24279 ) (Dunqing)
- 34ff7b4 minifier: Drop write-only property assignments to unused local
bindings by default (#24112 ) (Dunqing)
- 1b829d8 semantic: Record const enums in EnumData (#24268 ) (Dunqing)
- ba0944c semantic: Add `Scoping::set_symbol_span` (#24221 ) (camc314)
### 🐛 Bug Fixes
- 7d33363 minifier: Preserve guaranteed throws from class heritage
evaluation (#24349 ) (Dunqing)
- 058a62f semantic: Track ambient contexts in `SemanticBuilder` (#24327 )
(camc314)
- 721eb0b transformer/decorator: Scope accessor class binding (#24330 )
(camc314)
- 1ebdce3 semantic: Allow reserved keywords in ambient declaration types
(#24325 ) (camc314)
- 460176a track-memory-allocations: Exclude arena chunks from Sys allocs
(#24292 ) (Dunqing)
- af4922b transformer: Clear lowered namespace redeclarations (#24300 )
(camc314)
- ffd2765 semantic: Mark declared computed `MethodDefinition`s as type
references (#24296 ) (camc314)
- f17514b isolated-declarations: Emit const readonly fields as types
(#24288 ) (camc314)
- 40f769d minifier: Make `__proto__` write tracking execution-order
independent (#24280 ) (Dunqing)
- 6371fed transformer: Remove stale enum member bindings (#24272 )
(camc314)
- f05dfab transformer: Correct symbol flags for lowered namespaces
(#24271 ) (Dunqing)
- 84eeb55 transformer: Correct symbol flags for lowered enums (#24269 )
(Dunqing)
- c3057da transformer: Preserve generated class binding spans (#24220 )
(camc314)
- 8260096 transformer: Correct span for lowered namespace symbol
(#24222 ) (camc314)
- 42d00d3 semantic: Mark declared class heritage as type references
(#24237 ) (camc314)
- 588d997 semantic: Mark TS `PropertyDefinition`s computed fields as
type references (#24233 ) (camc314)
- 9b95632 semantic: Mark computed method keys in `TSMethodSignature`s as
type references (#24232 ) (camc314)
### ⚡ Performance
- 5b26643 transformer_plugins: Dispatch global defines by trailing name
(#23666 ) (Boshen)
- dce0f29 react_compiler: Replace all compiled functions in a single AST
walk (#24403 ) (Boshen)
- f85f0d8 ast: Delegate inherited enum variants in clone_in and estree
derives (#23555 ) (Boshen)
- 3ff0234 allocator: Remove `unwrap` from `ReplaceWith` (#24365 )
(overlookmotel)
- ab22e80 transformer: Fix Rust 1.97 performance regression (#24354 )
(camc314)
- b47585c parser: Use `ReplaceWith` instead of `TakeIn` (#24018 )
(overlookmotel)
- b227a06 minifier: Use `ReplaceWith` instead of `TakeIn` (#24017 )
(overlookmotel)
Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com >
2026-07-14 15:02:22 +08:00
oxc-guard[bot]
69b2dfc181
release(crates): oxc v0.139.0 ( #24218 )
...
### 🚀 Features
- 260425f semantic/examples: Include unresolved references (#24214 )
(camc314)
- 2d9b0b3 minifier: Fold boolean-literal ternary branches in value
contexts (#24110 ) (Dunqing)
- 61fbf10 ast: Implement `ReplaceWith` on all AST types (#24013 )
(overlookmotel)
- 7db7a29 allocator: Add `ReplaceWith` trait (#24012 ) (overlookmotel)
- 4eb074e mangler: Add `reserved` option for names that must not be
mangled (#24041 ) (Dunqing)
- 2e62012 data_structures: Add `StringExt` trait (#24006 )
(overlookmotel)
- 60e7160 minifier: Drop side-effect-free IIFEs whose result is unused
(#23967 ) (Dunqing)
- 26dd9e2 ast: Add method to widen inherited enum ref to parent ref
(#23961 ) (overlookmotel)
### 🐛 Bug Fixes
- e8b50ee transformer: Clean up semantics for stripped TypeScript syntax
(#24180 ) (camc314)
- d966d0b react_compiler: Remove clippy allows (#24168 ) (Boshen)
- 854ef8d react_compiler: Compile generic functions instead of
over-bailing on type-param hoisting (#24158 ) (Boshen)
- 093586c react_compiler: Align memoization cache-slot allocation with
Babel (#24157 ) (Boshen)
- 09c8f59 react_compiler: Normalize snapshot fixture paths (#24142 )
(camc314)
- f13df97 react_compiler: Drop stray empty statement from catch bindings
(#24133 ) (Boshen)
- cb2a505 react_compiler: Codegen destructuring reassignment targets
(#24131 ) (Boshen)
- b82c394 react_compiler: Propagate codegen invariants instead of
emitting empty bodies (#24128 ) (Boshen)
- 5771982 react_compiler: Render unchanged programs as source in fixture
snapshots (#24129 ) (Boshen)
- 4b16e1a transformer/async-to-generator: Preserve direct eval scope
flags (#24136 ) (camc314)
- 4e9194f react_compiler: Lower `delete obj.prop` to
Property/ComputedDelete (#24123 ) (Boshen)
- 0b25582 ast: Type binding node `typeAnnotation` as `TSTypeAnnotation |
null` (#23113 ) (Boshen)
- 018c0e5 transformer: Hoist lowered async declarations (#22770 )
(camc314)
- 652fbaf mangler: Keep names of destructured exported bindings (#24036 )
(Dunqing)
- e274415 minifier: Don't drop global calls that throw despite pure
arguments (#23917 ) (Dunqing)
- 59abb30 minifier: Only merge string literals in `try_fold_add` when
the inner operator is `+` (#23622 ) (Jerry Zhao)
### ⚡ Performance
- c5ca77b transformer: Avoid cloning refresh options (#24191 ) (camc314)
- bf1a151 react_compiler: Compile out debug printers (#24184 ) (Boshen)
- abb44a0 transformer: Build fixed object-rest arguments (#24190 )
(camc314)
- a4db731 isolated_declarations: Use `ReplaceWith` instead of `TakeIn`
(#24016 ) (overlookmotel)
- ff10855 transformer: Use `ReplaceWith` instead of `TakeIn` (#24015 )
(overlookmotel)
- bd49aff ecmascript: Avoid heap-allocating Math.min/max/imul operands
(#23941 ) (Lawrence Lin)
- e4b708b react_compiler: Skip compiled files before prefilters (#24171 )
(Boshen)
- c59f2fe rust: Return impl ExactSizeIterator from slice-backed
accessors (#24144 ) (Boshen)
- 5d6d04a codegen: SWAR-skip boring byte runs in sourcemap line/column
scan (#24023 ) (Boshen)
- a55e0be traverse: Reduce string operations in `get_var_name_from_node`
(#24007 ) (overlookmotel)
- e6d48e1 transformer/nullish_coalescing: Move cold path into separate
function (#23989 ) (overlookmotel)
- c4e35b5 transformer/object_rest_spread: Pre-allocate capacity in `Vec`
(#23988 ) (overlookmotel)
- 527b8e5 transformer/decorators: Narrow type earlier (#23987 )
(overlookmotel)
### 📚 Documentation
- 30d17f5 allocator: Clarify docs for `TakeIn::take_in_box` (#24093 )
(overlookmotel)
- 675e6a8 ast: Correct doc comment for `PrivateFieldExpression` (#24008 )
(overlookmotel)
- e4c30e6 minifier: Explain what `dce` mode means (#23994 ) (Dunqing)
- 37cbf88 ast_macros: Document fields of `StructDetails` (#23959 )
(overlookmotel)
- 4de3e54 ast: Correct doc comment (#23948 ) (overlookmotel)
Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com >
2026-07-06 23:26:26 +08:00
oxc-guard[bot]
8bf69a3076
release(crates): oxc v0.138.0 ( #23934 )
...
### 💥 BREAKING CHANGES
- 94fbacb ast: [**BREAKING**] Only export `AstBuilder` and `NONE` in
`builder` module (#23876 ) (overlookmotel)
- 8de5122 ecmascript: [**BREAKING**] Switch to new `AstBuilder` (#23834 )
(overlookmotel)
- dc0ef38 transformer: [**BREAKING**] Switch to new `AstBuilder`
(#23831 ) (overlookmotel)
- 88f4455 str: [**BREAKING**] `Str` and `Ident` methods take
`&GetAllocator` (#23781 ) (overlookmotel)
- 36009dd allocator: [**BREAKING**] `GetAllocator::allocator` take
`&self` (#23676 ) (overlookmotel)
- bd74f9d allocator: [**BREAKING**] Rename `AllocatorAccessor` trait to
`GetAllocator` (#23675 ) (overlookmotel)
### 🚀 Features
- 326fe25 transformer_plugins: Support `typeof` `define` keys (#23605 )
(Alexander Lichter)
- f2091b3 ast: Unify old and new `AstBuilder`s (#23875 ) (overlookmotel)
- cd1fd12 codegen: Expose `Codegen::print_string` API (#23785 ) (camc314)
- 785461b ast: Add custom builder methods to AST types (#23651 )
(overlookmotel)
- 05d1357 ast: Add AST creation methods to AST types (#23650 )
(overlookmotel)
- 2580eda str: Add `Str::from_str_in` and `Ident::from_str_in` methods
(#23767 ) (overlookmotel)
- 6883fcf minifier: Fold write-once falsy var to false in boolean
context (#23540 ) (Dunqing)
- fcbf993 allocator: Add `Vec::from_value_in` method (#23718 )
(overlookmotel)
- 989ddb7 allocator: Add `Vec::from_box_in` method (#23717 )
(overlookmotel)
- 9d1aa7f allocator: Improve `PartialEq` for `Vec` (#23716 )
(overlookmotel)
### 🐛 Bug Fixes
- da0e5bf minifier: Don't reorder a closed-over TDZ read when inlining a
var (#23771 ) (Dunqing)
- 0b3021f allocator: Remove `Vec::from_box_in` (#23873 ) (overlookmotel)
- 0ab64ec ast: Silence deprecation warnings within files defining
deprecated `AstBuilder` methods (#23889 ) (overlookmotel)
- 8c07cad all: Enable `disable_old_builder` Cargo feature for `oxc_ast`
crate in tests (#23888 ) (overlookmotel)
- 3800f01 ast: Legacy `AstBuilder` methods take `self` not `&self`
(#23891 ) (overlookmotel)
- 869ac20 semantic/cfg: Connect for update exit to loop test (#23791 )
(camc314)
- d3e92d5 semantic/cfg: Connect while branches from condition exit
(#23790 ) (camc314)
- 025045d ast: `ExportNamedDeclaration` plain builder methods return
boxed nodes (#23783 ) (overlookmotel)
- 7537c58 ast: Fix name of `AstBuilder` method for
`Expression::V8IntrinsicExpression` (#23766 ) (overlookmotel)
- 3f574f5 traverse: Fix unsoundness in `Traverse` walk functions
(#23745 ) (overlookmotel)
- 585760f parser: String in AST reference arena (#23721 ) (overlookmotel)
- 7231d55 allocator: Fix unsound lifetime extension in `Box::new_in`
(#23685 ) (overlookmotel)
### ⚡ Performance
- d5c916a semantic: Flatten hoisting_variables to avoid per-scope map
allocation (#23927 ) (Lawrence Lin)
- e71609d minifier: Bail member-expr folding before the side-effect walk
(#23924 ) (Lawrence Lin)
- e1f89ab minifier: Reduce string allocations folding addition (#23846 )
(overlookmotel)
- 9f6ee3b isolated-declarations: Pool scope maps to avoid per-scope
alloc/rehash (#23761 ) (Boshen)
- 0b07c4c semantic: Avoid heap alloc for catch-clause binding ids
(#23911 ) (Lawrence Lin)
- c5eef8b regular_expression: Skip capturing-group pre-parse when
pattern has no `(` (#23908 ) (Lawrence Lin)
- b4f5b4b isolated_declarations: Remove redundant clone of formal
parameter pattern (#23912 ) (Lawrence Lin)
- 53d083f isolated_declarations: Use `TakeIn` not `CloneIn` (#23847 )
(overlookmotel)
- 3ea9304 react_compiler: Use faster API to arena allocate strings
(#23849 ) (overlookmotel)
- a6d8e45 parser: Avoid span lookup for arrow expression body (#23788 )
(camc314)
- e1886a0 transformer, minifier: Use `static_ident!` macro to create
static `Ident`s (#23727 ) (overlookmotel)
- 5527bef transformer/object-rest-spread: Reduce iteration (#23720 )
(overlookmotel)
- 680ffbc transformer: Allocate AST nodes in arena directly (#23711 )
(overlookmotel)
- 1c63c66 parser: Allocate AST nodes in arena directly (#23712 )
(overlookmotel)
- 3855f0c minifier: Allocate AST nodes in arena directly (#23710 )
(overlookmotel)
- d025887 isolated_declarations: Allocate AST nodes in arena directly
(#23709 ) (overlookmotel)
- 10b96c6 parser: Remove string search from parsing JSX element name
(#23713 ) (overlookmotel)
### 📚 Documentation
- 3d61dea all: Correct capitalization in comments (#23887 )
(overlookmotel)
- aa1ad74 ast: Add `#[deprecated]` to legacy `AstBuilder` methods
(#23877 ) (overlookmotel)
- a4676db ast: Correct doc comment for `NONE` (#23765 ) (overlookmotel)
- 419ec80 syntax: Fix typo in doc comment (#23674 ) (overlookmotel)
### 🛡️ Security
- 3cdd18f deps: Update npm packages (#23690 ) (renovate[bot])
Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com >
Co-authored-by: Cameron <cameron.clark@hey.com >
2026-06-29 20:11:00 +01:00
overlookmotel
88f4455c72
feat(str)!: Str and Ident methods take &GetAllocator ( #23781 )
...
Continuation of #23767 , #23756 , and #23755 .
Make all methods that construct `Str`s and `Ident`s take `&A where A: GetAllocator<'a>` instead of `&'a Allocator`.
2026-06-25 11:59:59 +00:00
overlookmotel
2580eda2a7
feat(str): add Str::from_str_in and Ident::from_str_in methods ( #23767 )
...
Part of #23043 .
Add 2 new methods:
- `Str::from_str_in`
- `Ident::from_str_in`
Both take a `&str`, allocate it in arena, and return a `Str<'a>` / `Ident<'a>`.
Both take a `&A where A: GetAllocator`, so can be passed any type which implements `GetAllocator` e.g. `ParserImpl`, `TraverseCtx` (same as `Box::new_in`, `Vec::new_in` etc).
2026-06-24 17:40:35 +00:00
overlookmotel
d1f18cda21
refactor(all): import arena Box and Vec as ArenaBox / ArenaVec ( #23747 )
...
Pure refactor.
Use `ArenaBox` and `ArenaVec` everywhere for the arena-allocated types from `oxc_allocator`, instead of plain `Box` and `Vec`.
This disambiguates when `Vec` is `oxc_allocator::Vec` and when it's `std::vec::Vec`, making code clearer to follow.
Previously it was easy to confuse the two, and such confusion led to UB in `Traverse` (fixed in #23745 ).
Ditto other arena types - `ArenaHashMap`, `ArenaHashSet`, `ArenaStringBuilder`.
The only exceptions are:
1. Inside `oxc_allocator` crate itself.
2. AST type definitions.
3. Generated code (migrated separately in #23749 ).
2026-06-24 01:21:41 +00:00
overlookmotel
8c6481bbf9
refactor(allocator): export ArenaBox and ArenaVec aliases ( #23746 )
...
Pure refactor.
It's a common pattern in repo to import `Vec` and `Box` etc from `oxc_allocator` and alias them to `ArenaBox` / `ArenaVec`.
```rust
use oxc_allocator::{Box as ArenaBox, Vec as ArenaVec};
```
Make this pattern less verbose by re-exporting `Box` and `Vec` as these aliases from `oxc_allocator`.
Ditto other arena types: `ArenaHashMap`, `ArenaHashSet`, `ArenaStringBuilder`.
Use those aliases in all other crates to shorten code.
```rust
use oxc_allocator::{ArenaBox, ArenaVec};
```
2026-06-24 01:21:40 +00:00
overlookmotel
ef5b472f90
refactor(str): relax lifetime on PartialEq for Ident ( #23726 )
...
`PartialEq` impl for `Ident` had an unnecessarily restrictive lifetime bound - both `Ident`s had to have same lifetime (i.e. both `Ident<'a>`, not e.g. `Ident<'a>` and `Ident<'static>`).
As the type is covariant, this caused little problem in practice, but it suggested that lifetime equivalence is important, which it isn't - only the _contents_ of the 2 `Ident`s matters, not how long they live for.
Fix by making the 2 lifetime bounds separate and independent.
2026-06-22 19:01:31 +00:00
oxc-guard[bot]
6d56d57535
release(crates): oxc v0.137.0 ( #23591 )
...
### 💥 BREAKING CHANGES
- 7a76cd3 estree: [**BREAKING**] Make whether to include TS fields a
runtime option (#23574 ) (overlookmotel)
- e7b6b68 estree: [**BREAKING**] `ESTree` config use methods not consts
(#23573 ) (overlookmotel)
### 🚀 Features
- 556cc6d data_structures: Add `CodeBuffer::as_str` method (#23571 )
(overlookmotel)
- 38c4b06 parser: Add friendly error for adjacent JSX elements (#23378 )
(sapphi-red)
- 53509a8 minifier: Treeshake pure typed arrays and Set/Map array
literals (#23469 ) (Dunqing)
- 09762d9 minifier: Inline const value for read-only vars (#22593 )
(Dunqing)
### 🐛 Bug Fixes
- 20375f9 react_compiler: Keep imports referenced only by a computed key
(#23586 ) (Boshen)
- 31bfd9b minifier: Keep Object introspection calls on a possible Proxy
(#23483 ) (Dunqing)
- 837a395 parser: Treat a line comment after ':' as leading, not
trailing (#23515 ) (Dunqing)
- e409fe0 minifier: Keep `new Map`/`WeakSet`/`WeakMap` with a string
argument (#23470 ) (Dunqing)
- ae02b4e ci/parser: Use `minimal` for vitest reporter (#23457 )
(camc314)
### ⚡ Performance
- cf24329 mangler: Compile slot sort once instead of per CAPACITY
(#23577 ) (Boshen)
- 4058a6a parser: Reduce code bloat from verify_modifiers
monomorphization (#23576 ) (Boshen)
- 053b0c1 estree: Remove pointless `mem::take` (#23572 ) (overlookmotel)
- dfb52b6 transformer: Pre-size statement vecs in TS enum & namespace
lowering (#23516 ) (Yunfei He)
- 970e09a minifier: Compute template-literal inline checks in a single
pass (#23467 ) (Yunfei He)
- 3170c0e semantic,mangler,minifier: Fix `Semantic::stats` node count
and reuse stats in mangler builds (#23352 ) (Boshen)
- d1fa6e0 minifier: Evaluate ternary branches once in
minimize_conditional_expression (#23479 ) (Yunfei He)
- 3fa8051 transformer: Pre-size JSX props vec to attribute count
(#23466 ) (Yunfei He)
- 488b382 react_compiler: Borrow binding names in prefilter instead of
allocating (#23471 ) (Yunfei He)
- bcb3894 minifier: Incremental scoping refresh, delete
LiveUsageCollector (#23197 ) (Dunqing)
### 📚 Documentation
- f68641e data_structures: Improve docs on safety contract (#23575 )
(overlookmotel)
Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com >
2026-06-18 17:31:57 +08:00
oxc-guard[bot]
827248a7fb
release(crates): oxc v0.136.0 ( #23443 )
...
### 💥 BREAKING CHANGES
- 7a24911 codegen: [**BREAKING**] Borrow sourcemaps from codegen
(#23422 ) (Boshen)
- bb0ed44 transformer: [**BREAKING**] Disable styled-components
transpileTemplateLiterals by default (#23171 ) (Boshen)
### 🚀 Features
- 1490a0a linter/react: Implement react-compiler rule (#23202 ) (Boshen)
- 6c0bdf0 transformer/react-refresh: Support `module.property.useHook()`
(#23190 ) (Dunqing)
- 47991bd semantic: Report TS1228 for invalid type predicates (#23174 )
(camc314)
- 1d3af58 parser: Add TS2398 parameter property diagnostic (#23216 )
(camc314)
- 44313da semantic: Add `scope_is_descendant_of` api (#22313 ) (camc314)
- e5050c0 parser: Improve diagnostic for rest initializer (#23205 )
(camc314)
- ec266bb transformer: Run React Compiler as a feature-gated transform
pass (#23201 ) (Boshen)
- e7374fe parser: Report error for `const` modifier on interface type
parameter (#23173 ) (camc314)
- a7c1c9b parser: Report ambient definite variable assertions (#23165 )
(camc314)
- d169fcd parser: Report invalid class definite assertions (#23164 )
(camc314)
- 00244d8 parser: Report definite property initializer errors (#23160 )
(camc314)
### 🐛 Bug Fixes
- 52d0c31 transformer: Replace ambient dot defines (#23231 ) (camc314)
- 2c28748 transformer/class: Parent generated constructors to class
scope (#23222 ) (camc314)
- 8edd234 parser: Report accessor definite assertion on token (#23203 )
(camc314)
- de38a3f react_compiler: Keep imports referenced only by a local
re-export (#23176 ) (Boshen)
- f5721c2 codegen: Preserve parentheses around `intrinsic` type
reference (#23156 ) (Boshen)
- e89f81d parser: Don't emit TS1477 for parenthesized instantiation
expression (#23147 ) (Boshen)
- 8a04149 parser: Reject module-referencing imports/exports in a
namespace body (#22829 ) (Boshen)
### ⚡ Performance
- 2783295 parser: Table-driven operator precedence lookup (#23346 )
(Boshen)
- 231d5de parser: Single-match member expression dispatch (#23347 )
(Boshen)
- e89729b codegen: Accept one-shot wrap closures (#23265 ) (camc314)
- a6c11fa parser: Force-inline read_non_decimal to fold per-digit number
dispatch (#23157 ) (Boshen)
- d74964c parser: Store class definite assertion offset (#23170 )
(camc314)
- f0fda4d parser: Shrink-wrap cold diagnostic tails out of hot frames
(#23159 ) (Boshen)
- a082180 parser: Store definite assertion offset (#23167 ) (camc314)
- 534f9c6 oxc: Conditionally rebuild semantic in compiler pipeline
(#23153 ) (Boshen)
- b435c6a parser: Skip checkpoint for `infer T extends U` constraint in
disallow context (#23128 ) (Boshen)
- 7464dce parser: Peek instead of checkpoint/rewind for `export default`
modifier (#23124 ) (Boshen)
- 80a9a32 parser: Fast-path single-keyword TS declarations (#23083 )
(Boshen)
- da1a6c6 diagnostics: Migrate to allocation-optimized oxc-miette
(#23094 ) (Boshen)
- b7b08ce parser: Peek once for the static modifier disambiguation
(#23079 ) (Boshen)
- e7e07a3 parser: Fold unary dispatch into a single match (#23076 )
(Boshen)
### 📚 Documentation
- d241add semantic: Add `AGENTS.md` test guidance for agents (#23441 )
(camc314)
- 026f1ae parser: Add `AGENTS.md` test guidance for agents (#23440 )
(camc314)
- 09755ac transformer: Add `AGENTS.md` test guidance for agents (#23439 )
(camc314)
- e6bdfd4 lexer: Correct reference link for `byte_handlers!` (#23313 )
(Dunqing)
- 65b6d7a allocator: Fix memory leaks in `Arena` examples (#23257 )
(overlookmotel)
Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com >
2026-06-15 20:05:34 +08:00
oxc-guard[bot]
e9b8fd595c
release(crates): oxc v0.135.0 ( #23117 )
...
### 💥 BREAKING CHANGES
- ee4dc73 ast: [**BREAKING**] Add `#[non_exhaustive]` to AST nodes
(#23046 ) (overlookmotel)
- 4c35362 ast: [**BREAKING**] Add
`AstBuilder::template_element_escape_raw` and
`template_element_escape_raw_with_lone_surrogates` methods (#23047 )
(overlookmotel)
### 🚀 Features
- b846ab2 react_compiler: Integrate the Rust port of the React Compiler
(#22942 ) (Boshen)
- 5b8dd68 parser: Report TS1255 for invalid class definite assertions
(#22917 ) (camc314)
- 85efabf semantic: Make building the class table optional, off by
default (#22862 ) (Boshen)
### 🐛 Bug Fixes
- 556acdc codegen: Parenthesize TS-cast assignment targets (#23112 )
(Boshen)
- 37169ff codegen: Don't emit space between postfix `--` and `>` when
minifying (#23036 ) (Boshen)
- a4b1bf7 codegen: Drop redundant whitespace in minified TypeScript
output (#23038 ) (Boshen)
- cf53285 parser: Report reserved type-declaration names in the parser
(#23035 ) (Boshen)
- 4e44969 ast: Fix UB in `escape_template_element_raw` (#23052 )
(overlookmotel)
- c543154 parser: Report comma operator in JSX expression in the parser
(#23030 ) (Boshen)
- 325c94f codegen: Tighten conditional-type and constructor-type
whitespace when minifying (#23033 ) (Boshen)
- 95dd3a2 parser: Report `import type` alias to a non-external reference
in the parser (#23032 ) (Boshen)
- 90180b8 codegen: Drop space after `:` in function return type when
minifying (#23028 ) (Boshen)
- 6da876e parser: Report `abstract` private class field in the parser
(#23029 ) (Boshen)
- 28467ce codegen: Don't emit space before a postfix update operand when
minifying (#23027 ) (Boshen)
- cb29926 codegen: Drop redundant space after `export default` when
minifying (#23024 ) (Boshen)
- 62965ae codegen: Drop redundant space after `else` when minifying
(#23025 ) (Boshen)
- 989230a parser: Report compound assignment to non-simple target in the
parser (#23022 ) (Boshen)
- 06f367c parser: Report `super.#field` private access in the parser
(#23014 ) (Boshen)
- 184edef codegen: Print space before `const`/`declare` enum modifier
(#23013 ) (Boshen)
- 4d722e0 parser: Report duplicate switch `default` clause in the parser
(#23012 ) (Boshen)
- 597ed85 codegen: Parenthesize `let`/`async` for-of head target
(#23008 ) (Boshen)
- 8b631bf codegen: Remove stray space before mapped type value colon
(#23010 ) (Boshen)
- c08407e codegen: Don't over-parenthesize `in` inside an arrow in a
for-init (#23009 ) (Boshen)
- 600cd6f codegen: Parenthesize lower-precedence
`TSInstantiationExpression` operand (#23007 ) (Boshen)
- 187e1a5 codegen: Don't leak space after comment-only JSX expression
container (#23006 ) (Boshen)
- 294c473 codegen: Don't over-parenthesize `TSTypeAssertion` operand
(#23004 ) (Boshen)
- 786d96f codegen: Give `TSTypeAssertion` unary precedence (#23002 )
(Boshen)
- 1295882 parser: Report `new.target` and `import.meta` syntax errors in
the parser (#23003 ) (Boshen)
- d727b6b codegen: Parenthesize `await` expression as base of `**`
(#23001 ) (Boshen)
- 67dfa08 codegen: Keep parentheses around `new` callees containing a
call (#22997 ) (Boshen)
- 17e7cf3 parser: Disallow unerasable `as`/`satisfies` assertions
(#22986 ) (Boshen)
- beb46d3 parser: Commit to module goal on decorated exports (#22941 )
(Boshen)
- 49e63f7 isolated-declarations: Require annotations for satisfies
initializers (#22898 ) (camc314)
- 8c93601 isolated-declarations: Allow unknown enum initializer in
non-const enum (#22900 ) (camc314)
### ⚡ Performance
- 7d89909 parser: Peek instead of lookahead for yield disambiguation
(#23071 ) (Boshen)
- bf872f0 parser: Skip arrow lookahead for a parenthesized literal
(#23070 ) (Boshen)
- d19fc54 parser: Guard type-argument speculation behind an angle-token
check (#23069 ) (Boshen)
- 8eb5507 parser: Skip redundant member-rest re-scan on call entry
(#23068 ) (Boshen)
- 883dfc1 parser: Skip parse_call_expression_rest when no call follows
(#23063 ) (Boshen)
- b171153 parser: Peek before the await-using lookahead (#23059 )
(Boshen)
- 56f21bd parser: Use peek_token for the TS `asserts` type predicate
(#23058 ) (Boshen)
- 68805ac parser: Use peek_token instead of checkpoint/rewind for
single-token decisions (#23056 ) (Boshen)
- 1f9d8eb ast: `AstBuilder::template_element_escape_raw` avoid
allocation if no escape required (#23053 ) (overlookmotel)
- 502b04d semantic: Move cold function redeclaration handling into
`#[cold]` function (#22973 ) (overlookmotel)
### 📚 Documentation
- 275d318 napi/minifier: Point `target` to oxc docs (#23102 ) (camc314)
Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com >
2026-06-08 22:17:46 +08:00
oxc-guard[bot]
6c30f81eca
release(crates): oxc v0.134.0 ( #22882 )
...
### 🚀 Features
- 9c71f2e ast, codegen, formatter: Add `WithClauseKeyword::as_str`
helper and use it (#22791 ) (camc314)
### 🐛 Bug Fixes
- cf5769c parser: Reject TypeScript declarations in single-statement
context (#22827 ) (Boshen)
- c360fb6 parser: Reject generators in ambient contexts and overload
signatures (TS1221/TS1222) (#22848 ) (Boshen)
- cc60d8d parser: Reject invalid index signature parameter types
(TS1268/TS1337) (#22852 ) (Boshen)
- 3d13e29 parser: Reject `declare` in an already-ambient context
(TS1038) (#22850 ) (Boshen)
- 5152854 parser: Reject statements in ambient contexts (TS1036)
(#22849 ) (Boshen)
- 4f9afc5 parser: Reject `export as namespace` inside a namespace body
(TS1316) (#22846 ) (Boshen)
- 2eafea6 parser: Reject function implementations in ambient contexts
(TS1183) (#22845 ) (Boshen)
- c645615 parser: Reject incompatible class member modifiers (#22843 )
(Boshen)
- 276b78b parser: Reject module-referencing imports/exports in a
namespace body (#22836 ) (Boshen)
- 842ed1c parser: Parse `class implements` with `implements` as the
class name (#22801 ) (Boshen)
### ⚡ Performance
- 7e3a567 parser: Reuse cached token kind in delimited-list loops
(#22841 ) (Boshen)
- 9e741c2 parser: Use peek_token instead of lookahead on the modifier
path (#22842 ) (Boshen)
- 9e496a7 semantic: Defer declare lookup for empty accessors (#22810 )
(camc314)
2026-06-01 17:27:01 +01:00
oxc-guard[bot]
83328b65ce
release(crates): oxc v0.133.0 ( #22734 )
...
### 🚀 Features
- e857b0c napi/minify: Expose legalComments option and result (#20370 )
(Boshen)
- 661132d parser: More friendly error messages for rest assignment
target and rest binding element (#22719 ) (sapphi-red)
- ee659b6 transformer/legacy-decorator: Add `strictNullChecks` option
for nullable-union design:type (#22266 ) (Kyle Cannon)
### 🐛 Bug Fixes
- e1d064e transformer/class-properties: Reparent lifted private method
helpers (#22716 ) (Cameron)
- 4ac0fca minifier: Preserve `0 && (module.exports = { ... })`
cjs-module-lexer hint (#22729 ) (Dunqing)
- 40ff611 minifier: Mark peephole loop changed when dropping
dead-after-throw statement (#22722 ) (Dunqing)
- 2f7b210 codegen: Emit pife-arrow/function leading comments inside the
wrap (#22720 ) (Dunqing)
- e184f74 parser: Improve invalid `import` property access diagnostic
(#22693 ) (camc314)
- 7baed9c transformer/private-method: Clear inherited strict flags
(#22508 ) (camc314)
- a9ad27e parser: Keep annotation comments leading without preceding
newline (#22711 ) (Dunqing)
- 9ea4d64 minifier: Re-evaluate pure/no-side-effects flags after
peephole inlining (#22595 ) (Dunqing)
- 07afbb6 minifier: Drop empty-body IIFE wrapper when called with
arguments (#22589 ) (Dunqing)
- fa7c463 semantic: Correct TS enum member symbol spans (#22689 )
(camc314)
- 26b9396 semantic: Resolve parameter decorators outside parameter scope
(#22623 ) (camc314)
- b284045 parser: Switch to module goal eagerly on `export` (#22684 )
(Boshen)
- dfa931d semantic: Propagate unresolved auto-increment enum value
instead of defaulting to 0 (#22646 ) (Dunqing)
- 69a6ba6 transformer/legacy-decorator: Emit Array for ReadonlyArray<T>
in decorator metadata (#22265 ) (Kyle Cannon)
- e421ef0 transformer/legacy-decorator: Return runtime binding for
design:type (#22640 ) (Dunqing)
- d61e1d7 codegen: Preserve verbatim text of pure/no-side-effects
comments (#22525 ) (Dunqing)
- 702b14e minifier: Preserve IIFE structure in DCE-only mode (#22547 )
(Dunqing)
- 917da24 parser: Apply PURE comment through member-access chains
(#22566 ) (Dunqing)
- a069b1c codegen: Preserve quotes for cjs-module-lexer equality strings
(#22551 ) (Dunqing)
### ⚡ Performance
- 2f623b0 semantic: Skip unresolved checks for re-exports (#22660 )
(camc314)
- 0d9553d semantic: Early-exit `check_object_expression` for objects
with <2 properties (#22668 ) (Dunqing)
- d721ad9 semantic: Use direct grandparent lookup for TS type parameters
(#22658 ) (camc314)
- 0aff288 semantic: Reorder numeric literal strict mode checks (#22657 )
(camc314)
- 4d5ddb1 semantic: Reorder binding identifier checks (#22656 ) (camc314)
- e32acd8 semantic: Reorder identifier ambient binding check (#22653 )
(camc314)
- 09fe178 semantic: Reorder ident reference strict mode check (#22652 )
(camc314)
- 4b6add2 semantic: Avoid duplicate ident clone for bindings (#22663 )
(camc314)
- 82f9662 parser: Check identifier kind before context flag (#22662 )
(camc314)
- d7cd951 parser: Fast path identifier parsing and inline operator
helpers (#22650 ) (Boshen)
- 7b84314 semantic: Use direct byte access for numeric leading-zero
check (#22642 ) (camc314)
- 0345a31 semantic: Pre-size class elements hash map (#22618 ) (camc314)
- 04d3065 minifier: Drop per-call buffers in try_fold_concat (#22596 )
(Dunqing)
- 4f289f1 semantic: Resolve_references_for_current_scope without a temp
Vec (#22599 ) (Dunqing)
- e862c15 semantic: Avoid heap alloc for var hoist scope ids (#22603 )
(Dunqing)
- 8ff8674 semantic: Early return if `excess` is `0` in
`Stats::increase_by` (#22616 ) (camc314)
- 7a4120e semantic: Pre-reserve unresolved_references using
Stats::references (#22580 ) (Dunqing)
Co-authored-by: Dunqing <29533304+Dunqing@users.noreply.github.com >
2026-05-26 14:28:43 +08:00
oxc-guard[bot]
63b129182d
release(crates): oxc v0.132.0 ( #22527 )
...
### 🐛 Bug Fixes
- 0f26de6 ecmascript: Resolve identifier value type via tracked
constants (#22234 ) (Alexander Lichter)
- c27a8cf minifier: Normalize `{ x: x }` shorthand so adjacent-if merge
is idempotent (#22401 ) (Dunqing)
- e431a0e parser: Break extends clause loop on fatal error (#22517 )
(Boshen)
- e9ec7c6 minifier: Fold optional chains by base nullishness (#22236 )
(Alexander Lichter)
- e6090e7 transformer: Keep enum IIFE when a non-inlinable value
reference remains (#22501 ) (Dunqing)
- 931b7d6 transformer: Inline const enum members through type-cast
wrappers (#22500 ) (Dunqing)
- b9615b2 codegen: Preserve string quotes in require() calls during
minification (#22475 ) (zennnnnnn11)
- c73c159 transformer/async-to-generator: Reparent parameter initializer
scopes (#22507 ) (camc314)
- ecfd3ca transformer/async-to-generator: Move only parameter bindings
(#22503 ) (camc314)
- 3ce3431 transformer/explicit-resource-managment: Preserve shadowed
for-head block (#22451 ) (camc314)
### ⚡ Performance
- ce92c6c semantic: `#[inline]` `Scoping::get_binding` (#22414 )
(Dunqing)
- 98be95c regular_expression: Track regex flags via bitflags (#22427 )
(Boshen)
- dbbc059 jsdoc: Skip should_attach_jsdoc when no remaining comments
(#22409 ) (Boshen)
- 217d7d8 minifier: Index `SymbolValues` by `SymbolId` (#22441 )
(Dunqing)
- d782b78 minifier: Use BitSet for LiveUsageCollector live references
(#22425 ) (Boshen)
2026-05-18 12:09:14 +01:00
oxc-guard[bot]
564ebbf46f
release(crates): oxc v0.131.0 ( #22459 )
...
### 🚀 Features
- bc91a17 codegen: Expose `Codegen::with_source_type` method (#22432 )
(camc314)
### 🐛 Bug Fixes
- 5ac7e79 minifier: Drop unused-var-init pure IIFEs and preserve
annotation for downstream (#22349 ) (Dunqing)
- 4ab57eb allocator: Fixed-size allocators use `VirtualAlloc` on Windows
(#22124 ) (overlookmotel)
- 66d77eb allocator: Fix segfault on Linux MUSL with fixed-size
allocators (#22388 ) (overlookmotel)
- b8fbc1f transformer/object-rest-spread: Correct scope id when moving
bindings (#22419 ) (camc314)
- 18edc2c codegen: Keep `Object.defineProperty` property name as plain
string in minify (#22400 ) (Dunqing)
- dda33de transformer/explicit-resource-management: Align lexical
binding scopes (#22320 ) (camc314)
- 8e79de8 transformer: Preserve for-await statement bodies (#22361 )
(camc314)
- 0cba210 transformer/class: Replace `new.target` in static blocks
(#22360 ) (camc314)
- 67ab1c9 transformer/es2018/for-await: Hoist for-await generated
bindings (#22355 ) (camc314)
- c3ceb4a transformer/object-rest-spread: Use hoisted scope for `for-of`
temp refs (#22347 ) (camc314)
### ⚡ Performance
- 73a9043 allocator/bitset: Avoid temp heap `String` allocation (#22403 )
(camc314)
- 8b2f4f9 transformer/object-rest-spread: Collect `Vec<SymbolId` over
`Vec<BindingIdentifier>` (#22418 ) (camc314)
- 83679ea parser: Split TriviaBuilder::handle_token hot/cold paths
(#22415 ) (Boshen)
- 2c7d781 codegen: Inline identifier-name accessors (#22411 ) (Boshen)
- 618bc76 diagnostics: Inline `OxcDiagnosticInner` to avoid heap
allocation (#22406 ) (Boshen)
- 0b4e158 parser: Reserve cap `2` for sequence expressions vec (#22374 )
(camc314)
- 5f3bdd0 codegen: Add `#[inline]` to `code`, `code_len` (#22373 )
(camc314)
Co-authored-by: overlookmotel <557937+overlookmotel@users.noreply.github.com >
2026-05-15 15:38:24 +01:00
oxc-guard[bot]
650417ffd0
release(crates): oxc v0.130.0 ( #22316 )
...
### 🚀 Features
- 66c9b01 transformer/typescript: Debug_assert that `enum_eval` ran in
semantic (#22252 ) (Dunqing)
- ffe6475 minifier: Fold `Array` constructor with safe spreads (#22215 )
(camc314)
### 🐛 Bug Fixes
- d3d0b18 traverse: Handle `ChainElement::TSNonNullExpression` in
`GatherNodeParts` (#22247 ) (leaysgur)
- 4e880de transformer/object-rest-spread: Declare temp vars for computed
keys (#22284 ) (camc314)
- a7c3e22 semantic: Clear member write target for computed keys (#22302 )
(camc314)
- 6a8852d codegen: Emit newline after legal-comment orphan flush
(#22304 ) (Dunqing)
- 5da9fda transformer/explicit-resource-management: Preserve class names
(#22306 ) (Dunqing)
- b5d970f transformer/explicit-resource-management: Preserve class names
(#22290 ) (camc314)
- bc54fd4 minifier: Keep function / class names if direct eval is
present in the scope (#22241 ) (sapphi-red)
- 7a810c0 minifier: Refresh direct eval flags after DCE (#21787 )
(Dunqing)
- dd88726 transformer/legacy-decorator: Preserve accessor type
annotation for emitDecoratorMetadata (#21966 ) (Dunqing)
- 29a3cd7 codegen: Swap mapping/indent order for top-level decls
(#22206 ) (Dunqing)
- 73b4f40 minifier: Preserve catch binding with direct eval (#22221 )
(camc314)
- 0e13d17 minifier: Preserve optional chain base side effects (#22219 )
(camc314)
- 0c7c01c transformer/typescript: Inline optional-chain enum member
access (#21834 ) (Dunqing)
- a6aff7e codegen: Emit block/array/object end mapping at close char
(#22200 ) (Dunqing)
- a099b03 codegen: Emit call end mapping at `)` position, not past it
(#22199 ) (Dunqing)
- 5753774 minifier: Cap if-return ternary collapse for firefox (#21841 )
(Gurupungav Narayanan)
- 2493bdd codegen: Correct sourcemap end mappings for closing delimiters
(#22001 ) (Mark Dalgleish)
- 3b385e2 minifier: Bail optimizing `Array` with unknown arg count
(#22188 ) (camc314)
- 9fa2122 parser: Parse array computed class keys (#22159 ) (camc314)
### 📚 Documentation
- a4a6892 napi/parser: Correct code comment (#22278 ) (overlookmotel)
- 9305373 oxc: Update README (#22178 ) (camc314)
Co-authored-by: Cameron <cameron.clark@hey.com >
2026-05-11 16:02:22 +01:00
oxc-guard[bot]
ec00055e64
release(crates): oxc v0.129.0 ( #22108 )
...
### 💥 BREAKING CHANGES
- 0ffbe0d allocator: [**BREAKING**] Remove `Allocator::end_ptr` method
(#21871 ) (overlookmotel)
### 🚀 Features
- 9593ec8 transformer/jsx: Add jsxDEV source metadata for fragments
(#21932 ) (Ido Rosenthal)
### 🐛 Bug Fixes
- 429deac napi/parser: Export `visitorKeys` from `wasm` entrypoint
(#21996 ) (NullVoxPopuli)
- e852911 codegen: Preserve legal comments orphaned by upstream passes
(#21575 ) (Dunqing)
- e3399ec transformer/class-properties: Preserve RHS in
logical-assignment to static private field (#21950 ) (Dunqing)
- c59c199 transformer/typescript: Emit class fields for parameter
properties (#21831 ) (Dunqing)
- aaabde4 parser: Attach legal comments to following token (#21670 )
(Dunqing)
### ⚡ Performance
- 0bf0cb9 allocator: Per-platform `Arena::new_fixed_size`
implementations (#22088 ) (overlookmotel)
### 📚 Documentation
- 62ec410 allocator: Correct doc comment for `Allocator::from_raw_parts`
(#22093 ) (overlookmotel)
- 3e152c6 allocator: Correct typos in comments (#22092 ) (overlookmotel)
- e220855 allocator: Correct doc comment for `Allocator::set_cursor_ptr`
(#21866 ) (overlookmotel)
---------
Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com >
Co-authored-by: Cameron Clark <cameron.clark@hey.com >
2026-05-05 09:59:50 +01:00
oxc-guard[bot]
9951013ece
release(crates): oxc v0.128.0 ( #21837 )
...
### 💥 BREAKING CHANGES
- 502e804 ast: [**BREAKING**] Reduce size of `TSTypePredicateName`
(#21711 ) (overlookmotel)
- 5651539 ast: [**BREAKING**] Reduce size of `JSXExpression` (#21710 )
(overlookmotel)
- c44e280 ast: [**BREAKING**] Reduce size of `ArrayExpressionElement`
(#21709 ) (overlookmotel)
- c5b3deb syntax: [**BREAKING**] Remove `CommentNodeId` (#21679 )
(overlookmotel)
### 🚀 Features
- b738a39 allocator: Add `Allocator::cursor_ptr` method (#21773 )
(overlookmotel)
- 678767e ast: Generate node_id accessors for AST enum wrappers (#21653 )
(camc314)
- f091d77 minifier: Inline constant spread elements into arrays (#21095 )
(Armano)
### 🐛 Bug Fixes
- 0d608c2 minifier: Preserve raw CR in template literals (#21645 )
(Dunqing)
- a889ea9 minifier: Track pure functions in DCE mode (#21722 ) (Dunqing)
- 674dfac allocator: `Arena` retry allocation when chunk size approaches
maximum (#21777 ) (overlookmotel)
- f130cc0 allocator: Fix arithmetic overflow in
`Arena::new_chunk_memory_details` (#21745 ) (overlookmotel)
- b9bf239 allocator: Fix UB in `Arena::grow_zeroed` (#21739 )
(overlookmotel)
- d2b9389 allocator: Clippy warning when building without `testing`
feature (#21681 ) (camc314)
- 503dc86 codegen: Map sourcemaps from visible output starts (#21662 )
(Dunqing)
- c92bd3b transformer: Use SPAN for synthesized helper calls to prevent
comment misattribution (#21578 ) (Dunqing)
- 0d80441 codegen: Add mapping before printing `#` for private ident
(#21619 ) (camc314)
### ⚡ Performance
- 9fa362e napi/parser: Do not generate tokens except in tests (#21811 )
(overlookmotel)
- 0044392 allocator: Reduce branches when allocating new chunk (#21776 )
(overlookmotel)
- 7896bd0 allocator: `Allocator::used_bytes` do not use chunk iterator
(#21771 ) (overlookmotel)
- a5c562f allocator: Remove check in `Arena::new_chunk_memory_details`
(#21750 ) (overlookmotel)
- 35bbe1f allocator: `Arena` use unchecked size round up where
guaranteed no overflow (#21743 ) (overlookmotel)
- ffe229b allocator: Remove unnecessary check from
`Arena::try_alloc_layout_slow_impl` (#21732 ) (overlookmotel)
- 72fece5 allocator: Use `NonNull::offset_from_unsigned` in
`Arena::chunk_capacity` (#21731 ) (overlookmotel)
- cab32ae ast: Add `#[inline(always)]` to `node_id` methods on enums
with all variants unboxed (#21707 ) (overlookmotel)
- b179688 parser: Allocate `TriviaBuilder` comments in the arena
(#21512 ) (Boshen)
- 2290f31 lexer: Fix perf of `Token::set_*` methods on Rust 1.95.0
(#21659 ) (overlookmotel)
- 1b58029 allocator: Move code into cold path in `Arena::alloc_layout`
(#21622 ) (overlookmotel)
- 3cf7cef allocator: Reduce instructions on allocation hot path (#21510 )
(overlookmotel)
### 📚 Documentation
- ce65070 data_structures: Document why `as_ref` and `as_mut` on
`NonNullConst` and `NonNullMut` take `self` (#21800 ) (overlookmotel)
- 93b7dbd allocator: Improve doc comments for `ChunkFooter` (#21733 )
(overlookmotel)
- 295db8d transformer: Fix comment (#21717 ) (overlookmotel)
- 5c93af8 ast: Add comments explaining `#[inline(always)]` to `node_id`
methods on enums (#21706 ) (overlookmotel)
- e4cea25 transform: Use the `node:` namespace in the example (#19998 )
(루밀LuMir)
### 🛡️ Security
- d8076c9 deps: Update rolldown (#21639 ) (renovate)
Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com >
2026-04-27 12:32:32 +01:00
oxc-guard[bot]
161d6b5583
release(crates): oxc v0.127.0 ( #21572 )
...
### 🐛 Bug Fixes
- 48967e8 isolated_declarations: Drop required type check for private
parameter properties on private constructors (#21515 ) (Dunqing)
- 91e5bde transformer/typescript: Preserve computed-key static block
when class has an empty constructor (#21562 ) (Dunqing)
- 50e9d26 mangler: Assign correct slot to shadowed function-expression
names (#21535 ) (Dunqing)
- 065ce47 isolated_declarations: Collect types from private accessors
for paired inference (#21516 ) (Dunqing)
- 00fc136 codegen: Preserve coverage comments before object properties
(#21312 ) (bab)
- d676e0c minifier: Mark LHS of `??=` as read when converting from `==
null &&` (#21546 ) (Gunnlaugur Thor Briem)
### ⚡ Performance
- e45efc5 parser: Reduce `try_parse` usage in favour of `lookahead`
(#21532 ) (Boshen)
- ddb1bf8 parser: Avoid redundant `IdentifierReference` clone in
shorthand property (#21511 ) (Boshen)
- be2b392 allocator: Store pointers directly in `Arena` (#21483 )
(overlookmotel)
Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com >
Co-authored-by: Cameron <cameron.clark@hey.com >
2026-04-20 20:29:50 +01:00
Boshen
836fe9d51c
release(crates): oxc v0.126.0 ( #21471 )
...
### 💥 BREAKING CHANGES
- 24fb7eb allocator: [**BREAKING**] Rename `Box` and `Vec` methods
(#21395 ) (overlookmotel)
### 🚀 Features
- ce5072d parser: Support `turbopack` magic comments (#20803 ) (Kane
Wang)
- f5deb55 napi/transform: Expose `optimizeConstEnums` and
`optimizeEnums` options (#21388 ) (Dunqing)
- 24b03de data_structures: Introduce `NonNullConst` and `NonNullMut`
pointer types (#21425 ) (overlookmotel)
### 🐛 Bug Fixes
- d7a359a ecmascript: Treat update expressions as unconditionally
side-effectful (#21456 ) (Dunqing)
- 56af2f4 transformer/async-to-generator: Correct scope of inferred
named FE in async-to-generator (#21458 ) (Dunqing)
- b3ed467 minifier: Avoid illegal `var;` when folding unused arguments
copy loop (#21421 ) (fazba)
- b0e8f13 minifier: Preserve `var` inside `catch` with same-named
parameter (#21366 ) (Dunqing)
- 4fb73a7 transformer/typescript: Preserve execution order for accessor
with `useDefineForClassFields: false` (#21369 ) (Dunqing)
### ⚡ Performance
- da3cc16 parser: Refactor out `LexerContext` (#21275 ) (Ulrich Stark)
### 📚 Documentation
- c5b19bb allocator: Reformat comments in `Arena` (#21448 )
(overlookmotel)
- 091e88e lexer: Update doc comment about perf benefit of reading
through references (#21423 ) (overlookmotel)
- 922cbee allocator: Remove references to "bump" from comments (#21397 )
(overlookmotel)
Co-authored-by: Dunqing <29533304+Dunqing@users.noreply.github.com >
2026-04-16 09:38:51 +08:00
Boshen
fb6b1b053f
release(crates): oxc v0.125.0 ( #21374 )
...
### 💥 BREAKING CHANGES
- 36cdc31 str: [**BREAKING**] Remove identity `FromIn` impl for `Ident`
(#21251 ) (overlookmotel)
- 382958a span: [**BREAKING**] Remove re-exports of string types from
`oxc_span` crate (#21246 ) (overlookmotel)
- c4aedfa str: [**BREAKING**] Add `static_ident!` macro (#21245 )
(overlookmotel)
### 🚀 Features
- e7e1aea transformer/typescript: Add `optimize_enums` option for
regular enum inlining (#20539 ) (Dunqing)
- 679f57f transformer/typescript: Implement const enum inlining and
declaration removal (#20508 ) (Dunqing)
- 6dd061c semantic: Extend `MemberWriteTarget` to cover all property
modification patterns (#21205 ) (Dunqing)
- f134e24 minifier: Support `property_write_side_effects` option to drop
unused property assignments (#20773 ) (Dunqing)
- 75663c0 semantic: Add enum member value evaluation for const enum
support (#20602 ) (Dunqing)
- 3cfe8ed semantic: Add `MemberWriteTarget` flag to `ReferenceFlags`
(#20772 ) (Dunqing)
### 🐛 Bug Fixes
- af1a586 transformer/class-properties: Use correct property name when
converting parameter properties (#21268 ) (Amal Jossy)
- b43250a allocator: Move allocation tracking into `Bump` (#21342 )
(overlookmotel)
- 36f505f allocator: `StringBuilder` use `Allocator::alloc_layout`
(#21340 ) (overlookmotel)
- 7a08a6f allocator: Fix allocation counting in
`Allocator::alloc_concat_strs_array` (#21336 ) (overlookmotel)
- 2338e28 ecmascript: Treat `this` as potentially having side effects
(#21297 ) (sapphi-red)
- bd8bd39 allocator: Remove unsafe hacks from `from_raw_parts` methods
(#21283 ) (overlookmotel)
- 8f4c340 allocator: Remove dangerous pointer const to mut cast (#21279 )
(overlookmotel)
- aa9259f parser: Add missing error code for optional param diagnostic
(#21258 ) (camc314)
- 04b3c2f str: Fix unsound casting const pointers to mut pointers
(#21242 ) (overlookmotel)
- ceadf6c str: Make `Ident::from_raw` an unsafe function (#21241 )
(overlookmotel)
- eab13b3 transformer/decorators: Avoid accessor storage name collisions
(#21106 ) (Dunqing)
- 07e8a30 transformer/react-refresh: Handle parenthesized variable
initializers (#21047 ) (camc314)
### ⚡ Performance
- c3ca6f6 allocator: `StringBuilder::from_strs_array_in` check for 0
length earlier (#21338 ) (overlookmotel)
- c2422bb allocator: `Allocator::alloc_concat_strs_array` check for 0
length earlier (#21337 ) (overlookmotel)
- 04b0fdc allocator: Mark `Allocator::alloc_layout` as
`#[inline(always)]` (#21335 ) (overlookmotel)
- 17aee9e allocator: Use `offset_from_unsigned` in
`ChunkFooter::as_raw_parts` (#21280 ) (overlookmotel)
- 61adedd minifier: Fix O(n²) perf on very many var decls (#21062 )
(Gunnlaugur Thor Briem)
- addcd02 napi/parser, linter/plugins: Raw transfer deserializer for
`Vec`s use shift instead of multiply where possible (#21142 )
(overlookmotel)
- 3068ded napi/parser, linter/plugins: Shift before add when calculating
positions in raw transfer deserializer (#21141 ) (overlookmotel)
- eb400b8 napi/parser, linter/plugins: Remove `uint32` buffer view
(#21140 ) (overlookmotel)
- 2675085 napi/parser: Lazy deserialization use only `Int32Array`
(#21139 ) (overlookmotel)
- 5b35a53 napi/parser: Deserializing tokens use only `int32` array
(#21138 ) (overlookmotel)
- f163d10 parser: Tokens raw deserialization use `Int32Array` (#21137 )
(overlookmotel)
- 7a86613 linter/plugins: Use `Int32Array`s for tokens and comments
buffers (#21136 ) (overlookmotel)
- 8c51121 napi/parser, linter/plugins: Raw transfer deserialize `Span`
fields as `i32`s (#21135 ) (overlookmotel)
- bc1bcdd napi/parser, linter/plugins: Inline trivial raw transfer field
deserializers into node object definitions (#21134 ) (overlookmotel)
- c0278ab napi/parser, linter/plugins: Use `Int32Array` in raw transfer
deserializer (#21132 ) (overlookmotel)
- 43482c7 linter/plugins: Use `>>` not `>>>` in binary search loops
(#21129 ) (overlookmotel)
### 📚 Documentation
- f5e1845 allocator: Upgrade headers in doc comments for `Bump` (#21263 )
(overlookmotel)
- 2870174 allocator: Upper case `SAFETY` in comments (#21253 )
(overlookmotel)
- 01bc269 str: Reformat `Ident` doc comments (#21240 ) (overlookmotel)
- dd47359 allocator: Add doc comments for panics and errors (#21230 )
(overlookmotel)
2026-04-13 11:25:53 +01:00
overlookmotel
36cdc31633
feat(str)!: remove identity FromIn impl for Ident ( #21251 )
...
`Ident` had an identity implementation of `FromIn` trait:
```rust
impl<'a> FromIn<'a, &Ident<'a>> for Ident<'a> {
fn from_in(s: &Ident<'a>, _: &'a Allocator) -> Self {
*s
}
}
```
`FromIn` is intended for conversion from one type to another, not a type to itself, and it's dead code anyway. So remove it.
2026-04-09 13:07:25 +00:00
overlookmotel
4a4850eb68
refactor(str): re-order Ident trait impls ( #21250 )
...
Pure refactor. Re-order trait impls for `Ident` to stardard order - stdlib traits first in order of importance, then Oxc traits (e.g. `CloneIn`, `FromIn`).
The PR does not alter any code at all, just moves it.
2026-04-09 13:01:39 +00:00
overlookmotel
c4aedfafe1
feat(str)!: add static_ident! macro ( #21245 )
...
Previously, `oxc_str` crate exported various constants for static idents e.g. `pub const ARGUMENTS: Ident<'static> = Ident::new_const("arguments");`.
These consts have no advantage over direct `Ident::new_const` calls, as `const`s are inlined into everywhere they're used. It does not avoid the hash having to be calculated multiple times at compile time.
`Ident` also exposed a `new_const` method, but it didn't enforce that the argument passed to it is a `'static` string.
Remove the consts, remove `new_const` method, and introduce a `static_ident!` macro instead to generate an `Ident<'static>`.
The macro is a declarative macro (not proc macro) and its implementation is trivial. It will not have any measurable effect on compile times.
Using a macro has 2 advantages:
1\. It constrains what can be passed to it (e.g. `static_ident!(dynamic_str)` is illegal). This prevents patterns which were possible before, which compiler may not be able to const-fold e.g.:
```rust
let id = Ident::new_const(
if is_it {
"yes"
} else {
"no"
}
);
```
Using the macro, this becomes:
```rust
let id = if is_it {
static_ident!("yes")
} else {
static_ident!("no")
};
```
The compiler can fully const-fold the macro version, and probably make it branchless too.
2\. It makes it clearer which `Ident`s are static and which are dynamic - `static_ident!("x")` vs `Ident::from(s)`. This makes it clearer where you're incurring the cost of hashing the string at runtime.
In future we may codegen the macro from a list of known strings, so we can calculate hashes at codegen time (once) instead of compile time (on every compilation), and also pack all the strings together into a single `static &str`.
2026-04-09 12:06:20 +00:00
overlookmotel
5e407e2cd7
refactor(str): introduce LenAndHash abstraction ( #21244 )
...
Refactor to `Ident`.
`len` and `hash` fields are stored packed as a single `u64` on 64-bit platforms, but as 2 separate `u32`s on 32-bit. This reduces size of `Ident` to 12 bytes on 32-bit.
Introduce a `LenAndHash` struct which abstracts away this platform difference, so that all other methods can be written once, rather than having to have separate `#[cfg(target_pointer_width = "64")]` and `#[cfg(not(target_pointer_width = "64"))]` implementations, which need to be kept in sync with each other.
2026-04-09 12:06:20 +00:00
overlookmotel
8cc87dbd47
refactor(str): move Display impl to before Debug impl ( #21247 )
...
Pure refactor. Re-order trait impls, to our conventional order.
2026-04-09 12:06:20 +00:00
overlookmotel
24e9ee5b89
refactor(str): import traits at top level ( #21243 )
...
Pure refactor. Shorten and simplify code by importing traits like `Display` at top level.
2026-04-09 12:06:19 +00:00
overlookmotel
04b3c2f8ff
fix(str): fix unsound casting const pointers to mut pointers ( #21242 )
...
Previously we cast a `const` pointer to a `mut` pointer using `cast_mut`. This is possibly unsound.
Instead, create a `NonNull` directly with `NonNull::from_ref`. This also removes the need for `unsafe` code.
2026-04-09 12:06:19 +00:00
overlookmotel
ceadf6cff4
fix(str): make Ident::from_raw an unsafe function ( #21241 )
...
`Ident::from_raw` was not an `unsafe fn`, but has safety invariants. It was trivial to trigger UB with only safe code:
```rust
let ident = Ident::from_raw(NonNull::dangling(), 10, 0);
println!("{}", ident); // Segfault!
```
Make this method an `unsafe fn`, document its safety preconditions, and document at call sites how the invariants are upheld.
2026-04-09 12:06:19 +00:00
overlookmotel
01bc2697c1
docs(str): reformat Ident doc comments ( #21240 )
...
Just reformat doc comments.
2026-04-09 12:06:19 +00:00
Boshen
38aea543e4
release(crates): oxc v0.124.0 ( #21084 )
...
### 🐛 Bug Fixes
- fc7f60c allocator: Revert changes to
`get_current_chunk_footer_field_offset` (#20964 ) (overlookmotel)
- 31316c8 semantic: Rebind class expressions before identifier checks
(#20916 ) (camc314)
### ⚡ Performance
- fb52383 napi/parser, linter/plugins: Clear buffers and source texts
earlier (#21025 ) (overlookmotel)
- 3b7dec4 napi/parser, linter/plugins: Use `utf8Slice` for decoding
UTF-8 strings (#21022 ) (overlookmotel)
- 012c924 napi/parser, linter/plugins: Speed up decoding strings in raw
transfer (#21021 ) (overlookmotel)
- 55e1e9b napi/parser, linter/plugins: Initialize vars as 0 (#21020 )
(overlookmotel)
- c25ef02 napi/parser, linter/plugins: Simplify branch condition in
`deserializeStr` (#21019 ) (overlookmotel)
- 9f494c3 napi/parser, linter/plugins: Raw transfer use
`String.fromCharCode` in string decoding (#21018 ) (overlookmotel)
- 91cf105 allocator: Increase initial chunk size from 512B to 16KB
(#20968 ) (overlookmotel)
- cbc0c21 allocator: Add `#[cold]` to to error handling functions
(#20967 ) (overlookmotel)
- 0503a78 napi/parser, linter/plugins: Faster deserialization of `raw`
fields (#20923 ) (overlookmotel)
- a24f75e napi/parser: Optimize string deserialization for non-ASCII
sources (#20834 ) (Joshua Tuddenham)
### 📚 Documentation
- c78a57a syntax: Fix typo (#21044 ) (camc314)
- f5e228f allocator: Fix typo in comment (#20972 ) (overlookmotel)
- 7159d51 allocator: Improve doc comment examples for `vec2::Vec`
(#20969 ) (overlookmotel)
- b1da750 allocator, data_structures: Correct comments (#20966 )
(overlookmotel)
Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com >
2026-04-07 09:34:33 +09:00
overlookmotel
a04f405cbe
refactor(ast): simplify ESTree serialization of Ident ( #20932 )
...
`Ident` is always JSON-safe (cannot contain characters which require escaping in JSON). Remove `#[estree(json_safe)]` from fields containing `Ident`, and apply the JSON-safe optimization as part of `Ident`'s `ESTree` impl.
This also fixes one `Ident` we'd missed flagging as JSON-safe previously - the `Ident` in `PrivateIdentifier` - which will be a small perf boost.
2026-04-01 12:08:09 +00:00
Boshen
990763453c
release(crates): oxc v0.123.0 ( #20862 )
2026-03-30 18:00:11 +08:00
overlookmotel
c9cd809e50
refactor(str)!: rename Atom to Str ( #20835 )
...
Pure refactor.
Rename `Atom` to `Str`. The name "Atom" is a leftover from when we used to intern strings (years ago), and is misleading now.
Just call it `Str`. This follows the naming convention we have for arena-allocated versions of other types e.g. `Box`, `Vec`, `HashMap` - which we name the same as the native equivalents but with a lifetime (`Box<'a>` not `ArenaBox<'a>`, so `Str<'a>` not `ArenaStr<'a>`).
Rename all variables that contained "atom", and methods which relate to `Str`s to match the new type name.
Rename `as_atom` methods to `as_arena_str`. The longer name is required here to disambiguate from `as_str` methods which return a `&str`.
Some variables called "atom" still exist in `oxc_regular_expression` crate - that's a different meaning of "atom" - the meaning defined in regexp spec.
The diff of this PR is large but it's 100% renaming. No substantive or unrelated changes whatsoever.
2026-03-30 02:40:33 +00:00
Boshen
9dd33b080c
release(crates): oxc v0.122.0 ( #20648 )
2026-03-23 17:59:21 +08:00
Boshen
6cd513ffae
release(crates): oxc v0.121.0 ( #20515 )
...
### 🚀 Features
- 7215d9e transformer: Support lowering `accessor` with legacy
decorators (#20348 ) (Dunqing)
### 🐛 Bug Fixes
- 3bbd0cd transformer: Emit `Object` instead of `void 0` for untyped
getter/setter `design:type` metadata (#20488 ) (Dunqing)
- 4ae3f3f ecmascript: Apply coercion-is-pure assumption to constructor
side-effect detection (#20420 ) (Dunqing)
- 11f9695 transformer: Legacy decorator on computed property key leaves
variable unassigned (#20430 ) (bab)
- efeba28 ecmascript: Add argument validation for NewExpression
side-effect detection (#20395 ) (Dunqing)
Co-authored-by: Boshen <1430279+Boshen@users.noreply.github.com >
2026-03-19 14:31:00 +08:00