refactor(ecmascript): extract semantic_builder_for_transform helper#9326
Conversation
How to use the Graphite Merge QueueAdd 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. |
Merging this PR will not alter performance
Comparing Footnotes
|
f442987 to
4a1bd60
Compare
Merge activity
|
…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.
d0b9526 to
ef5796f
Compare
4a1bd60 to
6aa5eeb
Compare
## [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]>
…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.
## [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]>

Summary
Centralize the
with_enum_eval(true)invariant required for anyScopingthat will be passed toTransformer::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
Scopingto the transformer were each spelling outSemanticBuilder::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()incrates/rolldown_ecmascript/src/ecma_ast/helpers.rs, re-exported fromrolldown_ecmascript::*. The doc comment on the helper captures the WHY (get_enum_member_valueis only populated whenenum_evalis on; without it, string-enum aliases get the corruptFoo[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 (chainswith_check_syntax_error).crates/rolldown/src/utils/pre_process_ecma_ast.rs::recreate_scoping— post-define fallback (chainswith_stats).crates/rolldown_common/src/utils/enhanced_transform.rs— initial build fortransformSync.crates/rolldown_common/src/utils/enhanced_transform.rs— fallback rebuild afterReplaceGlobalDefines.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 bareSemanticBuilder::new()— enum_eval is semantically irrelevant after enums have been lowered.Adds
rolldown_ecmascript = { workspace = true }tocrates/rolldown_plugin_vite_transform/Cargo.tomlso the plugin can reach the helper.Test plan
enum_evalfortransformSyncand vite TS transform #9325 (Rust fixturerolldown/issues/9312/, TS unit tests inpackages/rolldown/tests/utils/transform.test.ts).transform.test.tscases pass.cargo clippy -p rolldown_ecmascript -p rolldown_common -p rolldown_plugin_vite_transform -- -D warningsclean.