Skip to content

refactor(ecmascript): extract semantic_builder_for_transform helper#9326

Merged
graphite-app[bot] merged 1 commit into
mainfrom
refactor/semantic-builder-for-transform
May 12, 2026
Merged

refactor(ecmascript): extract semantic_builder_for_transform helper#9326
graphite-app[bot] merged 1 commit into
mainfrom
refactor/semantic-builder-for-transform

Conversation

@Dunqing

@Dunqing Dunqing commented May 8, 2026

Copy link
Copy Markdown
Contributor

Summary

Centralize the with_enum_eval(true) invariant required for any Scoping that will be passed to Transformer::build_with_scoping. After #9325 the same option needed to be set at five call sites; missing it at any one of them recreates the string-enum-alias bug. Wrapping it in a single helper makes the invariant a property of the function name instead of a footgun spread across crates.

Cause

Five call sites that hand a Scoping to the transformer were each spelling out SemanticBuilder::new().with_enum_eval(true) (or worse, omitting the flag and silently producing the buggy reverse-mapping form for string-enum aliases). Adding a new transformer entry point in the future would require remembering this same invariant.

Fix

Add pub fn semantic_builder_for_transform() in crates/rolldown_ecmascript/src/ecma_ast/helpers.rs, re-exported from rolldown_ecmascript::*. The doc comment on the helper captures the WHY (get_enum_member_value is only populated when enum_eval is on; without it, string-enum aliases get the corrupt Foo[Foo["x"] = init] = "x" form).

Migrate all five call sites to start from the helper:

  • crates/rolldown/src/utils/pre_process_ecma_ast.rs — initial bundler build (chains with_check_syntax_error).
  • crates/rolldown/src/utils/pre_process_ecma_ast.rs::recreate_scoping — post-define fallback (chains with_stats).
  • crates/rolldown_common/src/utils/enhanced_transform.rs — initial build for transformSync.
  • crates/rolldown_common/src/utils/enhanced_transform.rs — fallback rebuild after ReplaceGlobalDefines.
  • crates/rolldown_plugin_vite_transform/src/lib.rs — vite TS transform plugin.

The post-transformer rebuild for InjectGlobalVariables (enhanced_transform.rs:406) is intentionally left as a bare SemanticBuilder::new() — enum_eval is semantically irrelevant after enums have been lowered.

Adds rolldown_ecmascript = { workspace = true } to crates/rolldown_plugin_vite_transform/Cargo.toml so the plugin can reach the helper.

Test plan

  • No new test surface — covered by the regression tests already in fix(transform): enable enum_eval for transformSync and vite TS transform #9325 (Rust fixture rolldown/issues/9312/, TS unit tests in packages/rolldown/tests/utils/transform.test.ts).
  • All 24 enum-related Rust tests, 38 define-related tests, and 49 transform.test.ts cases pass.
  • cargo clippy -p rolldown_ecmascript -p rolldown_common -p rolldown_plugin_vite_transform -- -D warnings clean.

Dunqing commented May 8, 2026

Copy link
Copy Markdown
Contributor Author

How to use the Graphite Merge Queue

Add the label graphite: merge-when-ready to this PR to add it to 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.

@Dunqing Dunqing marked this pull request as ready for review May 11, 2026 08:22
@codspeed-hq

codspeed-hq Bot commented May 11, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 4 untouched benchmarks
⏩ 10 skipped benchmarks1


Comparing refactor/semantic-builder-for-transform (4a1bd60) with fix/transform-sync-enum-eval (d0b9526)

Open in CodSpeed

Footnotes

  1. 10 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.

@Dunqing Dunqing force-pushed the refactor/semantic-builder-for-transform branch from f442987 to 4a1bd60 Compare May 11, 2026 08:48

Dunqing commented May 12, 2026

Copy link
Copy Markdown
Contributor Author

Merge activity

  • May 12, 8:32 AM UTC: The merge label 'graphite: merge-when-ready' was detected. This PR will be added to the Graphite merge queue once it meets the requirements.
  • May 12, 8:32 AM UTC: Dunqing added this pull request to the Graphite merge queue.
  • May 12, 8:42 AM UTC: Merged by the Graphite merge queue.

…9326)

## Summary

Centralize the `with_enum_eval(true)` invariant required for any `Scoping` that will be passed to `Transformer::build_with_scoping`. After #9325 the same option needed to be set at five call sites; missing it at any one of them recreates the string-enum-alias bug. Wrapping it in a single helper makes the invariant a property of the function name instead of a footgun spread across crates.

## Cause

Five call sites that hand a `Scoping` to the transformer were each spelling out `SemanticBuilder::new().with_enum_eval(true)` (or worse, omitting the flag and silently producing the buggy reverse-mapping form for string-enum aliases). Adding a new transformer entry point in the future would require remembering this same invariant.

## Fix

Add `pub fn semantic_builder_for_transform()` in `crates/rolldown_ecmascript/src/ecma_ast/helpers.rs`, re-exported from `rolldown_ecmascript::*`. The doc comment on the helper captures the WHY (`get_enum_member_value` is only populated when `enum_eval` is on; without it, string-enum aliases get the corrupt `Foo[Foo["x"] = init] = "x"` form).

Migrate all five call sites to start from the helper:

- `crates/rolldown/src/utils/pre_process_ecma_ast.rs` — initial bundler build (chains `with_check_syntax_error`).
- `crates/rolldown/src/utils/pre_process_ecma_ast.rs::recreate_scoping` — post-define fallback (chains `with_stats`).
- `crates/rolldown_common/src/utils/enhanced_transform.rs` — initial build for `transformSync`.
- `crates/rolldown_common/src/utils/enhanced_transform.rs` — fallback rebuild after `ReplaceGlobalDefines`.
- `crates/rolldown_plugin_vite_transform/src/lib.rs` — vite TS transform plugin.

The post-transformer rebuild for `InjectGlobalVariables` (`enhanced_transform.rs:406`) is intentionally left as a bare `SemanticBuilder::new()` — enum_eval is semantically irrelevant after enums have been lowered.

Adds `rolldown_ecmascript = { workspace = true }` to `crates/rolldown_plugin_vite_transform/Cargo.toml` so the plugin can reach the helper.

## Test plan

- [x] No new test surface — covered by the regression tests already in #9325 (Rust fixture `/issues/9312/`, TS unit tests in `packages/rolldown/tests/utils/transform.test.ts`).
- [x] All 24 enum-related Rust tests, 38 define-related tests, and 49 `transform.test.ts` cases pass.
- [x] `cargo clippy -p rolldown_ecmascript -p rolldown_common -p rolldown_plugin_vite_transform -- -D warnings` clean.
@graphite-app graphite-app Bot force-pushed the fix/transform-sync-enum-eval branch from d0b9526 to ef5796f Compare May 12, 2026 08:37
@graphite-app graphite-app Bot force-pushed the refactor/semantic-builder-for-transform branch from 4a1bd60 to 6aa5eeb Compare May 12, 2026 08:37
Base automatically changed from fix/transform-sync-enum-eval to main May 12, 2026 08:41
@graphite-app graphite-app Bot merged commit 6aa5eeb into main May 12, 2026
29 of 30 checks passed
@graphite-app graphite-app Bot deleted the refactor/semantic-builder-for-transform branch May 12, 2026 08:42
@rolldown-guard rolldown-guard Bot mentioned this pull request May 13, 2026
shulaoda added a commit that referenced this pull request May 13, 2026
## [1.0.1] - 2026-05-13

### 🚀 Features

- experimental/lazy-barrel: advice on oversized barrel modules (#9236) by @shulaoda
- rolldown: inline optional-chain enum access (#9379) by @Dunqing
- chunk-optimization: dedupe already-loaded dynamic deps (#9305) by @IWANABETHATGUY
- binding: call moduleParsed hook in ParallelJsPlugin (#9318) by @jaehafe

### 🐛 Bug Fixes

- transform: enable `enum_eval` for `transformSync` and vite TS transform (#9325) by @Dunqing
- error: remove severity prefix from diagnostic messages (#9262) by @Kyujenius
- deps: pin pnpm to 10.23.0 to work around catalog mismatch on Netlify (#9364) by @shulaoda
- ci: pin mimalloc-safe to 0.1.58 (#9361) by @shulaoda
- dev/lazy: fix exports of lazy requests in lazy chunks (#9249) by @h-a-n-a
- rolldown_plugin_vite_resolve: handle errors in `resolveSubpathImports` callback (#9355) by @sapphi-red
- rolldown_plugin_lazy_compilation: use loadExports for fetched proxy to preserve original export names (#9132) by @h-a-n-a
- common: include offending index in HybridIndexVec panic message (#9296) by @SAY-5

### 🚜 Refactor

- ecmascript: extract semantic_builder_for_transform helper (#9326) by @Dunqing
- test: extract reusable static-import-cycle helper (#9332) by @IWANABETHATGUY

### 📚 Documentation

- clarify scope of `topLevelVar` (#9380) by @IWANABETHATGUY
- meta/design: add ast-mutation design doc (#9338) by @hyf0
- feat: add ai policy in contribution guide (#9315) by @mdong1909

### ⚡ Performance

- binding: enable mimalloc v3 to reduce idle memory (#9349) by @shulaoda

### 🧪 Testing

- mcs: cover require() in `$initial` group (#9376) by @hyf0
- add regression for CJS facade chunk merge into entry (#9351) by @IWANABETHATGUY

### ⚙️ Miscellaneous Tasks

- switch prepare-release to manual dispatch with version input (#9383) by @shulaoda
- migrate `@rolldown/pluginutils` to `rolldown/plugins` (#9317) by @shulaoda
- deps: pin libmimalloc-sys2 to 0.1.54 (#9372) by @shulaoda
- replace `igorskyflyer/action-readfile` with `cat` (#9369) by @sapphi-red
- deps: update test262 submodule for tests (#9371) by @rolldown-guard[bot]
- use app token for test dep update PRs (#9368) by @sapphi-red
- replace some actions with gh commands (#9367) by @sapphi-red
- replace action-semantic-pull-request with inline regex (#9366) by @sapphi-red
- remove pull_request_target workflows (#9188) by @Boshen
- deps: upgrade oxc to 0.130.0 (#9360) by @shulaoda
- deps: update github actions (major) (#9348) by @renovate[bot]
- deps: update github actions (#9341) by @renovate[bot]
- deps: update rust crates (#9344) by @renovate[bot]
- deps: update crate-ci/typos action to v1.46.1 (#9357) by @renovate[bot]
- deps: update npm packages (#9343) by @renovate[bot]
- deps: update pnpm to v10.33.4 (#9347) by @renovate[bot]
- deps: update dependency rolldown-plugin-dts to ^0.25.0 (#9346) by @renovate[bot]
- .claude: add rolldown-repl encoder, rename decode skill (#9352) by @IWANABETHATGUY
- deps: update crate-ci/typos action to v1.46.0 (#9345) by @renovate[bot]
- deps: update napi to v3.8.6 (#9342) by @renovate[bot]
- deps: update dependency vite-plus to v0.1.20 (#9340) by @renovate[bot]
- enable rollup chunking-form test (#9335) by @IWANABETHATGUY
- typo: fix typo in watcher options comment (#9324) by @thescripted

### ❤️ New Contributors

* @Kyujenius made their first contribution in [#9262](#9262)
* @SAY-5 made their first contribution in [#9296](#9296)
* @thescripted made their first contribution in [#9324](#9324)

Co-authored-by: shulaoda <[email protected]>
IWANABETHATGUY pushed a commit that referenced this pull request May 18, 2026
…9326)

## Summary

Centralize the `with_enum_eval(true)` invariant required for any `Scoping` that will be passed to `Transformer::build_with_scoping`. After #9325 the same option needed to be set at five call sites; missing it at any one of them recreates the string-enum-alias bug. Wrapping it in a single helper makes the invariant a property of the function name instead of a footgun spread across crates.

## Cause

Five call sites that hand a `Scoping` to the transformer were each spelling out `SemanticBuilder::new().with_enum_eval(true)` (or worse, omitting the flag and silently producing the buggy reverse-mapping form for string-enum aliases). Adding a new transformer entry point in the future would require remembering this same invariant.

## Fix

Add `pub fn semantic_builder_for_transform()` in `crates/rolldown_ecmascript/src/ecma_ast/helpers.rs`, re-exported from `rolldown_ecmascript::*`. The doc comment on the helper captures the WHY (`get_enum_member_value` is only populated when `enum_eval` is on; without it, string-enum aliases get the corrupt `Foo[Foo["x"] = init] = "x"` form).

Migrate all five call sites to start from the helper:

- `crates/rolldown/src/utils/pre_process_ecma_ast.rs` — initial bundler build (chains `with_check_syntax_error`).
- `crates/rolldown/src/utils/pre_process_ecma_ast.rs::recreate_scoping` — post-define fallback (chains `with_stats`).
- `crates/rolldown_common/src/utils/enhanced_transform.rs` — initial build for `transformSync`.
- `crates/rolldown_common/src/utils/enhanced_transform.rs` — fallback rebuild after `ReplaceGlobalDefines`.
- `crates/rolldown_plugin_vite_transform/src/lib.rs` — vite TS transform plugin.

The post-transformer rebuild for `InjectGlobalVariables` (`enhanced_transform.rs:406`) is intentionally left as a bare `SemanticBuilder::new()` — enum_eval is semantically irrelevant after enums have been lowered.

Adds `rolldown_ecmascript = { workspace = true }` to `crates/rolldown_plugin_vite_transform/Cargo.toml` so the plugin can reach the helper.

## Test plan

- [x] No new test surface — covered by the regression tests already in #9325 (Rust fixture `/issues/9312/`, TS unit tests in `packages/rolldown/tests/utils/transform.test.ts`).
- [x] All 24 enum-related Rust tests, 38 define-related tests, and 49 `transform.test.ts` cases pass.
- [x] `cargo clippy -p rolldown_ecmascript -p rolldown_common -p rolldown_plugin_vite_transform -- -D warnings` clean.
IWANABETHATGUY pushed a commit that referenced this pull request May 18, 2026
## [1.0.1] - 2026-05-13

### 🚀 Features

- experimental/lazy-barrel: advice on oversized barrel modules (#9236) by @shulaoda
- rolldown: inline optional-chain enum access (#9379) by @Dunqing
- chunk-optimization: dedupe already-loaded dynamic deps (#9305) by @IWANABETHATGUY
- binding: call moduleParsed hook in ParallelJsPlugin (#9318) by @jaehafe

### 🐛 Bug Fixes

- transform: enable `enum_eval` for `transformSync` and vite TS transform (#9325) by @Dunqing
- error: remove severity prefix from diagnostic messages (#9262) by @Kyujenius
- deps: pin pnpm to 10.23.0 to work around catalog mismatch on Netlify (#9364) by @shulaoda
- ci: pin mimalloc-safe to 0.1.58 (#9361) by @shulaoda
- dev/lazy: fix exports of lazy requests in lazy chunks (#9249) by @h-a-n-a
- rolldown_plugin_vite_resolve: handle errors in `resolveSubpathImports` callback (#9355) by @sapphi-red
- rolldown_plugin_lazy_compilation: use loadExports for fetched proxy to preserve original export names (#9132) by @h-a-n-a
- common: include offending index in HybridIndexVec panic message (#9296) by @SAY-5

### 🚜 Refactor

- ecmascript: extract semantic_builder_for_transform helper (#9326) by @Dunqing
- test: extract reusable static-import-cycle helper (#9332) by @IWANABETHATGUY

### 📚 Documentation

- clarify scope of `topLevelVar` (#9380) by @IWANABETHATGUY
- meta/design: add ast-mutation design doc (#9338) by @hyf0
- feat: add ai policy in contribution guide (#9315) by @mdong1909

### ⚡ Performance

- binding: enable mimalloc v3 to reduce idle memory (#9349) by @shulaoda

### 🧪 Testing

- mcs: cover require() in `$initial` group (#9376) by @hyf0
- add regression for CJS facade chunk merge into entry (#9351) by @IWANABETHATGUY

### ⚙️ Miscellaneous Tasks

- switch prepare-release to manual dispatch with version input (#9383) by @shulaoda
- migrate `@rolldown/pluginutils` to `rolldown/plugins` (#9317) by @shulaoda
- deps: pin libmimalloc-sys2 to 0.1.54 (#9372) by @shulaoda
- replace `igorskyflyer/action-readfile` with `cat` (#9369) by @sapphi-red
- deps: update test262 submodule for tests (#9371) by @rolldown-guard[bot]
- use app token for test dep update PRs (#9368) by @sapphi-red
- replace some actions with gh commands (#9367) by @sapphi-red
- replace action-semantic-pull-request with inline regex (#9366) by @sapphi-red
- remove pull_request_target workflows (#9188) by @Boshen
- deps: upgrade oxc to 0.130.0 (#9360) by @shulaoda
- deps: update github actions (major) (#9348) by @renovate[bot]
- deps: update github actions (#9341) by @renovate[bot]
- deps: update rust crates (#9344) by @renovate[bot]
- deps: update crate-ci/typos action to v1.46.1 (#9357) by @renovate[bot]
- deps: update npm packages (#9343) by @renovate[bot]
- deps: update pnpm to v10.33.4 (#9347) by @renovate[bot]
- deps: update dependency rolldown-plugin-dts to ^0.25.0 (#9346) by @renovate[bot]
- .claude: add rolldown-repl encoder, rename decode skill (#9352) by @IWANABETHATGUY
- deps: update crate-ci/typos action to v1.46.0 (#9345) by @renovate[bot]
- deps: update napi to v3.8.6 (#9342) by @renovate[bot]
- deps: update dependency vite-plus to v0.1.20 (#9340) by @renovate[bot]
- enable rollup chunking-form test (#9335) by @IWANABETHATGUY
- typo: fix typo in watcher options comment (#9324) by @thescripted

### ❤️ New Contributors

* @Kyujenius made their first contribution in [#9262](#9262)
* @SAY-5 made their first contribution in [#9296](#9296)
* @thescripted made their first contribution in [#9324](#9324)

Co-authored-by: shulaoda <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants