Skip to content

feat(transformer/typescript): add optimize_enums option for regular enum inlining#20539

Merged
graphite-app[bot] merged 1 commit intomainfrom
feat/optimize-enums-option
Apr 13, 2026
Merged

feat(transformer/typescript): add optimize_enums option for regular enum inlining#20539
graphite-app[bot] merged 1 commit intomainfrom
feat/optimize-enums-option

Conversation

@Dunqing
Copy link
Copy Markdown
Member

@Dunqing Dunqing commented Mar 20, 2026

This is required in Rolldown to align with esbuild, which could inline a regular enum as long as all its enum members can be evaluated. See rolldown/rolldown#8796

Summary

Depends on #20508.

  • Add optimize_enums option to TypeScriptOptions that treats regular enums with all-evaluable members the same as const enums: inlines member accesses and removes non-exported declarations
  • Regular enums are only removed when no runtime value references remain (e.g., typeof Foo, passing as argument)
  • Includes 14 conformance test fixtures covering basic, string values, binary expressions, cross-member/cross-enum references, merged enums, exported (kept), non-evaluable (kept), template literals, unary expressions, typeof/value-usage/passed-as-argument (kept), and re-exported (kept)

Test plan

  • 14 new conformance test fixtures under optimize-enums/
  • cargo run -p oxc_transform_conformance passes
  • cargo test -p oxc_transformer passes

Copy link
Copy Markdown
Member Author

Dunqing commented Mar 20, 2026


How to use the Graphite Merge Queue

Add either label to this PR to merge it via the merge queue:

  • 0-merge - adds this PR to the back of the merge queue
  • hotfix - for urgent changes, fast-track this PR to the front of the merge queue

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

This stack of pull requests is managed by Graphite. Learn more about stacking.

@github-actions github-actions Bot added A-transformer Area - Transformer / Transpiler C-enhancement Category - New feature or request labels Mar 20, 2026
@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Mar 20, 2026

Merging this PR will not alter performance

✅ 49 untouched benchmarks
⏩ 7 skipped benchmarks1


Comparing feat/optimize-enums-option (91a19e1) with feat/const-enum-support (197cc6a)2

Open in CodSpeed

Footnotes

  1. 7 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

  2. No successful run was found on feat/const-enum-support (805f2fc) during the generation of this report, so 57231bc was used instead as the comparison base. There might be some changes unrelated to this pull request in this report.

@Dunqing Dunqing force-pushed the feat/optimize-enums-option branch 2 times, most recently from 1a68323 to 82245f6 Compare March 21, 2026 04:35
@Dunqing Dunqing force-pushed the feat/const-enum-support branch from f0dee0e to 9a262fb Compare March 21, 2026 04:35
@Dunqing Dunqing force-pushed the feat/optimize-enums-option branch from 82245f6 to 7cb32b6 Compare March 21, 2026 04:39
@Dunqing Dunqing force-pushed the feat/const-enum-support branch from ae6471c to 197cc6a Compare March 21, 2026 04:39
@Dunqing Dunqing force-pushed the feat/optimize-enums-option branch from 7cb32b6 to 91a19e1 Compare March 21, 2026 13:41
@Dunqing Dunqing force-pushed the feat/const-enum-support branch from 197cc6a to 805f2fc Compare March 21, 2026 13:41
@Dunqing Dunqing changed the title feat(transformer): add optimize_enums option to inline and remove regular enum declarations feat(transformer): add optimize_enums option for regular enum inlining Mar 21, 2026
@Dunqing Dunqing force-pushed the feat/optimize-enums-option branch from 91a19e1 to 323c6c2 Compare March 23, 2026 03:07
@Dunqing Dunqing changed the base branch from feat/const-enum-support to graphite-base/20539 March 23, 2026 03:07
@github-actions github-actions Bot added the A-semantic Area - Semantic label Mar 23, 2026
@Dunqing Dunqing force-pushed the feat/optimize-enums-option branch from 323c6c2 to 9dd8ff1 Compare March 23, 2026 04:57
@Dunqing Dunqing force-pushed the graphite-base/20539 branch 2 times, most recently from 5f493f5 to 4eddfb3 Compare March 23, 2026 05:55
@Dunqing Dunqing force-pushed the feat/optimize-enums-option branch 2 times, most recently from e3c18a0 to 96800b1 Compare March 23, 2026 06:05
@Dunqing Dunqing force-pushed the graphite-base/20539 branch from 4eddfb3 to a4f3a5b Compare March 23, 2026 06:05
@Dunqing Dunqing changed the title feat(transformer): add optimize_enums option for regular enum inlining feat(transformer/typescript): add optimize_enums option for regular enum inlining Mar 23, 2026
@Dunqing Dunqing changed the title feat(transformer/typescript): add optimize_enums option for regular enum inlining feat(transformer/typescript): add optimize_enums option for regular enum inlining Mar 23, 2026
@Dunqing Dunqing force-pushed the graphite-base/20539 branch from a4f3a5b to b2b068f Compare March 23, 2026 06:50
@Dunqing Dunqing force-pushed the feat/optimize-enums-option branch 2 times, most recently from 355c1f1 to 2ed8fb8 Compare March 23, 2026 07:17
@Dunqing Dunqing force-pushed the graphite-base/20539 branch from b2b068f to cfa7202 Compare March 23, 2026 07:17
@Dunqing Dunqing marked this pull request as ready for review March 23, 2026 07:35
@Dunqing Dunqing requested a review from overlookmotel as a code owner March 23, 2026 07:35
@Dunqing Dunqing force-pushed the feat/optimize-enums-option branch from 2ed8fb8 to 3874d8f Compare April 3, 2026 01:00
@Dunqing Dunqing force-pushed the graphite-base/20539 branch from cfa7202 to 3d0def0 Compare April 3, 2026 01:00
@Dunqing Dunqing force-pushed the feat/optimize-enums-option branch from 3874d8f to 04799c5 Compare April 7, 2026 06:57
@Dunqing Dunqing force-pushed the graphite-base/20539 branch 2 times, most recently from 816f76e to 6a30237 Compare April 7, 2026 07:54
@Dunqing Dunqing force-pushed the feat/optimize-enums-option branch from 04799c5 to 54abab1 Compare April 7, 2026 07:54
@graphite-app graphite-app Bot added the 0-merge Merge with Graphite Merge Queue label Apr 7, 2026
@Dunqing Dunqing force-pushed the graphite-base/20539 branch from 6a30237 to 7bd1a40 Compare April 13, 2026 03:24
@Dunqing Dunqing force-pushed the feat/optimize-enums-option branch from 54abab1 to 420f2bf Compare April 13, 2026 03:24
@Dunqing Dunqing changed the base branch from graphite-base/20539 to feat/const-enum-support April 13, 2026 03:25
@graphite-app graphite-app Bot changed the base branch from feat/const-enum-support to graphite-base/20539 April 13, 2026 03:29
@graphite-app graphite-app Bot force-pushed the feat/optimize-enums-option branch from 420f2bf to 98c89b5 Compare April 13, 2026 03:33
@graphite-app graphite-app Bot force-pushed the graphite-base/20539 branch from 7bd1a40 to 679f57f Compare April 13, 2026 03:33
@graphite-app graphite-app Bot changed the base branch from graphite-base/20539 to main April 13, 2026 03:34
@graphite-app graphite-app Bot force-pushed the feat/optimize-enums-option branch from 98c89b5 to ff89f68 Compare April 13, 2026 03:34
@Dunqing Dunqing force-pushed the feat/optimize-enums-option branch 2 times, most recently from 07d6574 to 8496bbe Compare April 13, 2026 08:44
@graphite-app
Copy link
Copy Markdown
Contributor

graphite-app Bot commented Apr 13, 2026

Merge activity

… enum inlining (#20539)

This is required in Rolldown to align with `esbuild`, which could inline a regular enum as long as all its enum members can be evaluated. See rolldown/rolldown#8796
## Summary

Depends on #20508.

- Add `optimize_enums` option to `TypeScriptOptions` that treats regular enums with all-evaluable members the same as const enums: inlines member accesses and removes non-exported declarations
- Regular enums are only removed when no runtime value references remain (e.g., `typeof Foo`, passing as argument)
- Includes 14 conformance test fixtures covering basic, string values, binary expressions, cross-member/cross-enum references, merged enums, exported (kept), non-evaluable (kept), template literals, unary expressions, typeof/value-usage/passed-as-argument (kept), and re-exported (kept)

## Test plan

- [x] 14 new conformance test fixtures under `optimize-enums/`
- [x] `cargo run -p oxc_transform_conformance` passes
- [x] `cargo test -p oxc_transformer` passes
@graphite-app graphite-app Bot force-pushed the feat/optimize-enums-option branch from 8496bbe to e7e1aea Compare April 13, 2026 08:49
@graphite-app graphite-app Bot merged commit e7e1aea into main Apr 13, 2026
26 checks passed
@graphite-app graphite-app Bot removed the 0-merge Merge with Graphite Merge Queue label Apr 13, 2026
@graphite-app graphite-app Bot deleted the feat/optimize-enums-option branch April 13, 2026 08:53
camc314 pushed a commit that referenced this pull request Apr 13, 2026
### 💥 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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-semantic Area - Semantic A-transformer Area - Transformer / Transpiler C-enhancement Category - New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant