Skip to content

refactor: precompute wrapped-ESM init metadata in generate stage#9712

Merged
IWANABETHATGUY merged 2 commits into
mainfrom
refactor/precompute-wrapped-esm-init-metadata
Jun 11, 2026
Merged

refactor: precompute wrapped-ESM init metadata in generate stage#9712
IWANABETHATGUY merged 2 commits into
mainfrom
refactor/precompute-wrapped-esm-init-metadata

Conversation

@IWANABETHATGUY

Copy link
Copy Markdown
Member

Move the transitive ESM-init DFS out of the module finalizer into a
generate-stage pre-finalization pass, merged with compute_init_is_noop
into a single compute_wrapped_esm_init_metadata pass that stores
per-statement init targets in LinkingMetadata. The finalizer now only
does a map lookup plus AST emission, and three of the four duplicated
init-call construction sites share one wrapped_esm_init_call_expr
helper.

Behavior-preserving: the full test suite passes with zero snapshot
changes.

🤖 Generated with Claude Code

Co-Authored-By: Claude Fable 5 noreply@anthropic.com

Move the transitive ESM-init DFS out of the module finalizer into a
generate-stage pre-finalization pass, merged with `compute_init_is_noop`
into a single `compute_wrapped_esm_init_metadata` pass that stores
per-statement init targets in `LinkingMetadata`. The finalizer now only
does a map lookup plus AST emission, and three of the four duplicated
init-call construction sites share one `wrapped_esm_init_call_expr`
helper.

Behavior-preserving: the full test suite passes with zero snapshot
changes.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

Copy link
Copy Markdown
Member 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.

@IWANABETHATGUY IWANABETHATGUY marked this pull request as ready for review June 10, 2026 17:09
@codspeed-hq

codspeed-hq Bot commented Jun 10, 2026

Copy link
Copy Markdown

Merging this PR will not alter performance

✅ 4 untouched benchmarks
⏩ 10 skipped benchmarks1


Comparing refactor/precompute-wrapped-esm-init-metadata (9e4a2c2) with main (289c520)2

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.

  2. No successful run was found on main (76e539d) during the generation of this report, so 289c520 was used instead as the comparison base. There might be some changes unrelated to this pull request in this report.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR refactors wrapped-ESM init_*() handling by moving transitive init-target discovery and “init is no-op” classification out of the module finalizer and into a dedicated generate-stage pre-pass (compute_wrapped_esm_init_metadata). The goal is to reduce per-module finalization work (now largely a metadata lookup + AST emission) while preserving strict execution-order semantics for tree-shaken re-export statements.

Changes:

  • Introduces compute_wrapped_esm_init_metadata (generate stage) to compute both init_is_noop and per-statement transitive_esm_init_targets, storing the results in LinkingMetadata.
  • Removes the old compute_init_is_noop pass and updates the generate stage pipeline to call the new combined pass.
  • Refactors module finalizer init-call construction to use a shared wrapped_esm_init_call_expr helper and switches strict-exec-order excluded re-export init emission to use precomputed metadata.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated no comments.

Show a summary per file
File Description
crates/rolldown/tests/rolldown/issues/9028/cycle-a.js Updates fixture commentary to reflect the renamed transitive-init collector.
crates/rolldown/tests/rolldown/issues/9028/barrel.js Updates fixture commentary to reflect the new generate-stage pass name.
crates/rolldown/src/types/linking_metadata.rs Adds transitive_esm_init_targets to LinkingMetadata and updates related docs.
crates/rolldown/src/stages/generate_stage/mod.rs Replaces compute_init_is_noop with compute_wrapped_esm_init_metadata in the generate pipeline.
crates/rolldown/src/stages/generate_stage/compute_wrapped_esm_init_metadata.rs New combined pass implementing noop-init classification and transitive init-target computation.
crates/rolldown/src/stages/generate_stage/compute_init_is_noop.rs Removes the now-obsolete standalone noop-init computation pass.
crates/rolldown/src/module_finalizers/mod.rs Switches strict-order excluded re-export init emission to precomputed targets; adds wrapped_esm_init_call_expr helper and unifies several init-call construction sites.
crates/rolldown/src/module_finalizers/impl_visit_mut.rs Updates the debug-assert commentary to reference the new generate-stage metadata pass.

@netlify

netlify Bot commented Jun 10, 2026

Copy link
Copy Markdown

Deploy Preview for rolldown-rs canceled.

Name Link
🔨 Latest commit 572b488
🔍 Latest deploy log https://app.netlify.com/projects/rolldown-rs/deploys/6a299a3d8f8acf000872c491

@netlify

netlify Bot commented Jun 10, 2026

Copy link
Copy Markdown

Deploy Preview for rolldown-rs canceled.

Name Link
🔨 Latest commit 9e4a2c2
🔍 Latest deploy log https://app.netlify.com/projects/rolldown-rs/deploys/6a299f315ad32d0008d047f4

@IWANABETHATGUY IWANABETHATGUY merged commit ceab287 into main Jun 11, 2026
34 checks passed
@IWANABETHATGUY IWANABETHATGUY deleted the refactor/precompute-wrapped-esm-init-metadata branch June 11, 2026 02:14
@shulaoda shulaoda mentioned this pull request Jun 11, 2026
@rolldown-guard rolldown-guard Bot mentioned this pull request Jun 11, 2026
shulaoda pushed a commit that referenced this pull request Jun 11, 2026
## [1.1.1] - 2026-06-11

### 🚀 Features

- ecmascript_utils: introduce AstFactory for AST construction (#9682) by @hyf0
- drop no-op init calls for empty wrapped-ESM modules (#9678) by @IWANABETHATGUY

### 🐛 Bug Fixes

- resolver: honor package.json#type for .jsx/.tsx extensions (#9690) (#9699) by @IWANABETHATGUY
- hmr: report the full-reload reason for the invalidate-loop case (#9708) by @hyf0
- explicit `moduleSideEffects` from a hook must take priority over the `package.json#sideEffects` (#9688) by @sapphi-red
- keep the `rolldown-runtime` name for the standalone runtime chunk (#9685) by @shulaoda
- lazy-barrel: request all exports for entry barrels on first encounter (#9672) by @shulaoda
- finalizer: skip init_*() for tree-shaken wrapped ESM owners (#9669) by @IWANABETHATGUY
- order `chunk.imports` by execution order (#9654) by @chuganzy
- vite-resolve: preserve slash separators for Sass partial exports (#9546) by @cjc0013
- cross-chunk CJS wrapper shadowed by author-local binding (#9648) by @IWANABETHATGUY

### 🚜 Refactor

- precompute wrapped-ESM init metadata in generate stage (#9712) by @IWANABETHATGUY
- ecmascript_utils: fold construction ext traits onto AstFactory and delete AstSnippet (#9702) by @hyf0
- finalizer: finish ScopeHoistingFinalizer migration to AstFactory (#9701) by @hyf0
- finalizer: migrate module_finalizers/mod.rs to AstFactory (#9700) by @hyf0
- hmr: migrate hmr finalizer to AstFactory (#9695) by @hyf0
- plugin: migrate vite_build_import_analysis to AstFactory (#9693) by @hyf0
- scanner: migrate tweak_ast_for_scanning to AstFactory (#9683) by @hyf0
- always split runtime module first (#9419) by @IWANABETHATGUY

### 📚 Documentation

- tsconfig: correct auto-discovery resolution to match TypeScript (#9714) by @shulaoda
- design: plan to unify all internal AST construction (#9673) by @hyf0
- tsconfig: align reference resolution docs with TypeScript behavior (#9641) by @shulaoda

### ⚡ Performance

- avoid per-module join Strings in scope-hoisting concatenation (#9645) by @Boshen
- avoid intermediate Strings in the ESM export clause (#9644) by @Boshen
- reuse a scratch buffer for facade namespace names in the scanner (#9642) by @Boshen
- reuse the import-matching tracker stack across named imports (#9643) by @Boshen
- avoid cloning the per-chunk export-items map in render_chunk_exports (#9639) by @Boshen
- avoid CompactStr allocation in sorted-exports membership check (#9640) by @Boshen

### 🧪 Testing

- add more `moduleSideEffects` precedence tests (#9689) by @sapphi-red
- 9651: drop shimMissingExports from regression fixture (#9674) by @IWANABETHATGUY

### ⚙️ Miscellaneous Tasks

- update react repo links (#9711) by @iiio2
- remove outdated pnpm configurations (#9666) by @btea
- deps: update github actions to v2.81.5 (#9665) by @renovate[bot]
- testing: migrate test harness off deprecated inlineDynamicImports (#9710) by @IWANABETHATGUY
- hmr: delete commented-out dead code left from old register-module codegen (#9707) by @hyf0
- deps: update napi-rs toolchain (#9706) by @shulaoda
- deps: update rollup submodule for tests to v4.61.1 (#9676) by @rolldown-guard[bot]
- deps: update test262 submodule for tests (#9677) by @rolldown-guard[bot]
- deps: update oxc to 0.135.0 (#9670) by @Boshen
- pass ALGOLIA_APP_ID and ALGOLIA_API_KEY to void deploy (#9667) by @Boshen
- deps: update github actions (#9662) by @renovate[bot]
- deps: update rust crates (#9663) by @renovate[bot]
- deps: update rolldown-plugin-dts to v0.25.2 (#9661) by @renovate[bot]
- deps: update typos to v1.47.2 (#9660) by @renovate[bot]
- deps: update docs dependencies (#9657) by @bddjr
- deps: update typos to v1.47.1 (#9655) by @renovate[bot]
- deploy website in its own workflow, only on docs output change (#9650) by @Boshen
- publish to pkg.pr.new add pm and `commentWithDev` option (#9638) by @btea

### ❤️ New Contributors

* @chuganzy made their first contribution in [#9654](#9654)
* @cjc0013 made their first contribution in [#9546](#9546)
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.

3 participants