Use keyed cells for used_exports and export_circuit_breakers in BindingUsageInfo (#91306)
## What?
Apply the `cell = "keyed"` pattern to `used_exports` (`FxHashMap`) and
`export_circuit_breakers` (`FxHashSet`) in `BindingUsageInfo`, matching
the existing pattern already used for `unused_references`.
## Why?
Previously, `used_exports` and `export_circuit_breakers` were stored as
plain inline collections within `BindingUsageInfo`. Any change to any
module's export usage would invalidate **all** callers of
`used_exports()`, even those querying unrelated modules. This causes
unnecessary recomputation during incremental rebuilds.
With keyed cells, lookups like `self.used_exports.get(&module)` and
`self.export_circuit_breakers.contains_key(&module)` only invalidate
callers that queried the specific module whose export usage changed,
providing per-module invalidation granularity.
## How?
1. **New keyed transparent value types** — `UsedExportsMap` and
`ExportCircuitBreakers` wrappers with `#[turbo_tasks::value(transparent,
cell = "keyed")]`.
2. **Fields changed to `ResolvedVc`** — `used_exports` and
`export_circuit_breakers` fields are now `ResolvedVc<UsedExportsMap>`
and `ResolvedVc<ExportCircuitBreakers>` instead of inline
`FxHashMap`/`FxHashSet`.
3. **`used_exports()` becomes a `#[turbo_tasks::function]`** — Moved
into a `#[turbo_tasks::value_impl]` block so it's a tracked task
function. Callers (`BrowserChunkingContext`, `NodeJsChunkingContext`) no
longer need `.await?` — they call it directly and get a
`Vc<ModuleExportUsage>`.
4. **Per-key lookups** — `contains_key(&module).await?` and
`get(&module).await?` leverage the keyed cell pattern for fine-grained
invalidation.
### Files changed
-
`turbopack/crates/turbopack-core/src/module_graph/binding_usage_info.rs`
— Core changes: new keyed types, field type changes, `used_exports()` as
tracked function
- `turbopack/crates/turbopack-browser/src/chunking_context.rs` —
Simplified call site (no `.await?`)
- `turbopack/crates/turbopack-nodejs/src/chunking_context.rs` —
Simplified call site (no `.await?`)
---------
Co-authored-by: Tobias Koppers <sokra@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>