Skip to content

Commit 8813dea

Browse files
committed
unify into BindingUsage
1 parent 7125ef1 commit 8813dea

File tree

9 files changed

+103
-95
lines changed

9 files changed

+103
-95
lines changed

crates/next-core/src/next_client_reference/visit_client_reference.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,9 +192,9 @@ impl Visit<FindServerEntriesNode> for FindServerEntries {
192192

193193
let referenced_modules = referenced_modules
194194
.iter()
195-
.flat_map(|(_, chunking_type, _, _, modules)| match chunking_type {
195+
.flat_map(|(_, resolved)| match resolved.chunking_type {
196196
ChunkingType::Traced => None,
197-
_ => Some(modules.iter()),
197+
_ => Some(resolved.modules.iter()),
198198
})
199199
.flatten()
200200
.map(async |module| {

turbopack/crates/turbopack-core/src/chunk/mod.rs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ use crate::{
4646
},
4747
output::OutputAssets,
4848
reference::ModuleReference,
49-
resolve::{ExportUsage, ImportUsage},
49+
resolve::BindingUsage,
5050
};
5151

5252
/// A module id, which can be a number or string
@@ -422,13 +422,8 @@ pub trait ChunkableModuleReference: ModuleReference + ValueToString {
422422
}
423423

424424
#[turbo_tasks::function]
425-
fn export_usage(self: Vc<Self>) -> Vc<ExportUsage> {
426-
ExportUsage::all()
427-
}
428-
429-
#[turbo_tasks::function]
430-
fn import_usage(self: Vc<Self>) -> Vc<ImportUsage> {
431-
ImportUsage::global()
425+
fn binding_usage(self: Vc<Self>) -> Vc<BindingUsage> {
426+
BindingUsage::all()
432427
}
433428
}
434429

turbopack/crates/turbopack-core/src/module_graph/binding_usage_info.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ pub async fn compute_binding_usage_info(
109109

110110
if remove_unused_imports {
111111
// If the current edge is an unused import, skip it
112-
match &ref_data.import {
112+
match &ref_data.binding_usage.import {
113113
ImportUsage::Exports(exports) => {
114114
let source_used_exports = used_exports.get(&parent).unwrap();
115115
if exports
@@ -118,7 +118,7 @@ pub async fn compute_binding_usage_info(
118118
{
119119
debug_unused_references_name.insert((
120120
parent,
121-
ref_data.export.clone(),
121+
ref_data.binding_usage.export.clone(),
122122
target,
123123
));
124124
unused_references_edges.insert(edge);
@@ -128,7 +128,7 @@ pub async fn compute_binding_usage_info(
128128
} else {
129129
debug_unused_references_name.remove(&(
130130
parent,
131-
ref_data.export.clone(),
131+
ref_data.binding_usage.export.clone(),
132132
target,
133133
));
134134
unused_references_edges.remove(&edge);
@@ -139,7 +139,7 @@ pub async fn compute_binding_usage_info(
139139
ImportUsage::Global => {
140140
debug_unused_references_name.remove(&(
141141
parent,
142-
ref_data.export.clone(),
142+
ref_data.binding_usage.export.clone(),
143143
target,
144144
));
145145
unused_references_edges.remove(&edge);
@@ -151,7 +151,7 @@ pub async fn compute_binding_usage_info(
151151

152152
let entry = used_exports.entry(target);
153153
let is_first_visit = matches!(entry, Entry::Vacant(_));
154-
if entry.or_default().add(&ref_data.export) || is_first_visit {
154+
if entry.or_default().add(&ref_data.binding_usage.export) || is_first_visit {
155155
// First visit, or the used exports changed. This can cause more imports to get used
156156
// downstream.
157157
Ok(GraphTraversalAction::Continue)

turbopack/crates/turbopack-core/src/module_graph/merged_modules.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,9 @@ pub async fn compute_merged_modules(module_graph: Vc<ModuleGraph>) -> Result<Vc<
491491
// necessarily needed for browser),
492492
exposed_modules_imported.insert(module);
493493
}
494-
if parent_info.is_some_and(|(_, r)| matches!(r.export, ExportUsage::All)) {
494+
if parent_info
495+
.is_some_and(|(_, r)| matches!(r.binding_usage.export, ExportUsage::All))
496+
{
495497
// This module needs to be exposed:
496498
// - namespace import from another group
497499
exposed_modules_namespace.insert(module);

turbopack/crates/turbopack-core/src/module_graph/mod.rs

Lines changed: 29 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use crate::{
3737
traced_di_graph::TracedDiGraph,
3838
},
3939
reference::{ModuleReference, primary_chunkable_referenced_modules},
40-
resolve::{ExportUsage, ImportUsage},
40+
resolve::BindingUsage,
4141
};
4242

4343
pub mod async_module_info;
@@ -225,8 +225,7 @@ pub struct SingleModuleGraph {
225225
)]
226226
pub struct RefData {
227227
pub chunking_type: ChunkingType,
228-
pub export: ExportUsage,
229-
pub import: ImportUsage,
228+
pub binding_usage: BindingUsage,
230229
pub reference: ResolvedVc<Box<dyn ModuleReference>>,
231230
}
232231

@@ -246,16 +245,15 @@ impl SingleModuleGraph {
246245
.map(|e| async move {
247246
Ok(SingleModuleGraphBuilderEdge {
248247
to: SingleModuleGraphBuilderNode::new_module(emit_spans, e).await?,
249-
export: ExportUsage::All,
250-
import: ImportUsage::Global,
248+
binding_usage: BindingUsage::default(),
251249
reference: None,
252250
})
253251
})
254252
.try_join()
255253
.await?;
256254

257255
let (children_nodes_iter, visited_nodes) = AdjacencyMap::new()
258-
.skip_duplicates_with_key(|node: &(SingleModuleGraphBuilderNode, _, _, _)| &node.0)
256+
.skip_duplicates_with_key(|node: &(SingleModuleGraphBuilderNode, _, _)| &node.0)
259257
.visit(
260258
root_edges,
261259
SingleModuleGraphBuilder {
@@ -282,16 +280,15 @@ impl SingleModuleGraph {
282280
FxHashMap::with_capacity_and_hasher(node_count, Default::default());
283281
{
284282
let _span = tracing::info_span!("build module graph").entered();
285-
for (parent, (current, reference, export, import)) in
283+
for (parent, (current, reference, binding_usage)) in
286284
children_nodes_iter.into_breadth_first_edges()
287285
{
288286
let parent_edge = match parent.map(|v| v.0) {
289287
Some(SingleModuleGraphBuilderNode::Module { module, .. }) => Some((
290288
*modules.get(&module).unwrap(),
291289
RefData {
292290
chunking_type: COMMON_CHUNKING_TYPE,
293-
export,
294-
import,
291+
binding_usage,
295292
reference: reference.unwrap(),
296293
},
297294
)),
@@ -1562,8 +1559,7 @@ impl SingleModuleGraphBuilderNode {
15621559
}
15631560
struct SingleModuleGraphBuilderEdge {
15641561
to: SingleModuleGraphBuilderNode,
1565-
export: ExportUsage,
1566-
import: ImportUsage,
1562+
binding_usage: BindingUsage,
15671563
reference: Option<ResolvedVc<Box<dyn ModuleReference>>>,
15681564
}
15691565

@@ -1586,8 +1582,7 @@ impl
15861582
Visit<(
15871583
SingleModuleGraphBuilderNode,
15881584
Option<ResolvedVc<Box<dyn ModuleReference>>>,
1589-
ExportUsage,
1590-
ImportUsage,
1585+
BindingUsage,
15911586
)> for SingleModuleGraphBuilder<'_>
15921587
{
15931588
type Edge = SingleModuleGraphBuilderEdge;
@@ -1600,29 +1595,23 @@ impl
16001595
) -> VisitControlFlow<(
16011596
SingleModuleGraphBuilderNode,
16021597
Option<ResolvedVc<Box<dyn ModuleReference>>>,
1603-
ExportUsage,
1604-
ImportUsage,
1598+
BindingUsage,
16051599
)> {
16061600
match edge.to {
16071601
SingleModuleGraphBuilderNode::Module { .. } => {
1608-
VisitControlFlow::Continue((edge.to, edge.reference, edge.export, edge.import))
1602+
VisitControlFlow::Continue((edge.to, edge.reference, edge.binding_usage))
16091603
}
16101604
SingleModuleGraphBuilderNode::ChunkableReference { ref ref_data, .. } => {
16111605
match &ref_data.chunking_type {
16121606
ChunkingType::Traced => {
1613-
VisitControlFlow::Skip((edge.to, edge.reference, edge.export, edge.import))
1607+
VisitControlFlow::Skip((edge.to, edge.reference, edge.binding_usage))
16141608
}
1615-
_ => VisitControlFlow::Continue((
1616-
edge.to,
1617-
edge.reference,
1618-
edge.export,
1619-
edge.import,
1620-
)),
1609+
_ => VisitControlFlow::Continue((edge.to, edge.reference, edge.binding_usage)),
16211610
}
16221611
}
16231612
// Module was already visited previously
16241613
SingleModuleGraphBuilderNode::VisitedModule { .. } => {
1625-
VisitControlFlow::Skip((edge.to, edge.reference, edge.export, edge.import))
1614+
VisitControlFlow::Skip((edge.to, edge.reference, edge.binding_usage))
16261615
}
16271616
}
16281617
}
@@ -1634,8 +1623,7 @@ impl
16341623
(node, ..): &(
16351624
SingleModuleGraphBuilderNode,
16361625
Option<ResolvedVc<Box<dyn ModuleReference>>>,
1637-
ExportUsage,
1638-
ImportUsage,
1626+
BindingUsage,
16391627
),
16401628
) -> Self::EdgesFuture {
16411629
// Destructure beforehand to not have to clone the whole node when entering the async block
@@ -1645,12 +1633,7 @@ impl
16451633
target, ref_data, ..
16461634
} => (
16471635
None,
1648-
Some((
1649-
*target,
1650-
ref_data.reference,
1651-
ref_data.export.clone(),
1652-
ref_data.import.clone(),
1653-
)),
1636+
Some((*target, ref_data.reference, ref_data.binding_usage.clone())),
16541637
),
16551638
// These are always skipped in `visit()`
16561639
SingleModuleGraphBuilderNode::VisitedModule { .. } => unreachable!(),
@@ -1670,12 +1653,17 @@ impl
16701653
};
16711654

16721655
refs.iter()
1673-
.flat_map(|(reference, ty, export, import, modules)| {
1674-
modules.iter().map(|m| {
1675-
(*reference, ty.clone(), export.clone(), import.clone(), *m)
1656+
.flat_map(|(reference, resolved)| {
1657+
resolved.modules.iter().map(|m| {
1658+
(
1659+
*reference,
1660+
resolved.chunking_type.clone(),
1661+
resolved.binding_usage.clone(),
1662+
*m,
1663+
)
16761664
})
16771665
})
1678-
.map(async |(reference, ty, export, import, target)| {
1666+
.map(async |(reference, ty, binding_usage, target)| {
16791667
let to = if ty == COMMON_CHUNKING_TYPE {
16801668
if let Some(idx) = visited_modules.get(&target) {
16811669
SingleModuleGraphBuilderNode::new_visited_module(target, *idx)
@@ -1690,24 +1678,22 @@ impl
16901678
target,
16911679
RefData {
16921680
chunking_type: ty,
1693-
export: export.clone(),
1694-
import: import.clone(),
1681+
binding_usage: binding_usage.clone(),
16951682
reference,
16961683
},
16971684
)
16981685
.await?
16991686
};
17001687
Ok(SingleModuleGraphBuilderEdge {
17011688
to,
1702-
export,
1703-
import,
1689+
binding_usage,
17041690
reference: Some(reference),
17051691
})
17061692
})
17071693
.try_join()
17081694
.await?
17091695
}
1710-
(None, Some((chunkable_ref_target, reference, export, import))) => {
1696+
(None, Some((chunkable_ref_target, reference, binding_usage))) => {
17111697
vec![SingleModuleGraphBuilderEdge {
17121698
to: if let Some(idx) = visited_modules.get(&chunkable_ref_target) {
17131699
SingleModuleGraphBuilderNode::new_visited_module(
@@ -1721,8 +1707,7 @@ impl
17211707
)
17221708
.await?
17231709
},
1724-
export,
1725-
import,
1710+
binding_usage,
17261711
reference: Some(reference),
17271712
}]
17281713
}
@@ -1736,8 +1721,7 @@ impl
17361721
(node, ..): &(
17371722
SingleModuleGraphBuilderNode,
17381723
Option<ResolvedVc<Box<dyn ModuleReference>>>,
1739-
ExportUsage,
1740-
ImportUsage,
1724+
BindingUsage,
17411725
),
17421726
) -> tracing::Span {
17431727
if !self.emit_spans {

turbopack/crates/turbopack-core/src/reference/mod.rs

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
use std::collections::HashSet;
22

33
use anyhow::Result;
4+
use serde::{Deserialize, Serialize};
45
use turbo_rcstr::RcStr;
56
use turbo_tasks::{
6-
FxIndexSet, ReadRef, ResolvedVc, TryFlatJoinIterExt, TryJoinIterExt, ValueToString, Vc,
7+
FxIndexSet, NonLocalValue, ReadRef, ResolvedVc, TryFlatJoinIterExt, TryJoinIterExt,
8+
ValueToString, Vc,
9+
debug::ValueDebugFormat,
710
graph::{AdjacencyMap, GraphTraversal},
11+
trace::TraceRawVcs,
812
};
913

1014
use crate::{
1115
chunk::{ChunkableModuleReference, ChunkingType, ChunkingTypeOption},
1216
module::{Module, Modules},
1317
output::{OutputAsset, OutputAssets},
1418
raw_module::RawModule,
15-
resolve::{ExportUsage, ImportUsage, ModuleResolveResult, RequestKey},
19+
resolve::{BindingUsage, ExportUsage, ImportUsage, ModuleResolveResult, RequestKey},
1620
};
1721
pub mod source_map;
1822

@@ -119,8 +123,12 @@ impl ChunkableModuleReference for SingleChunkableModuleReference {
119123
}
120124

121125
#[turbo_tasks::function]
122-
fn export_usage(&self) -> Vc<ExportUsage> {
123-
*self.export
126+
async fn binding_usage(&self) -> Result<Vc<BindingUsage>> {
127+
Ok(BindingUsage {
128+
import: ImportUsage::Global,
129+
export: self.export.owned().await?,
130+
}
131+
.cell())
124132
}
125133
}
126134

@@ -285,16 +293,17 @@ pub async fn primary_referenced_modules(module: Vc<Box<dyn Module>>) -> Result<V
285293
Ok(Vc::cell(modules))
286294
}
287295

296+
#[derive(
297+
Clone, Serialize, Deserialize, Eq, PartialEq, ValueDebugFormat, TraceRawVcs, NonLocalValue,
298+
)]
299+
pub struct ResolvedReference {
300+
pub chunking_type: ChunkingType,
301+
pub binding_usage: BindingUsage,
302+
pub modules: ReadRef<Modules>,
303+
}
304+
288305
#[turbo_tasks::value(transparent)]
289-
pub struct ModulesWithRefData(
290-
Vec<(
291-
ResolvedVc<Box<dyn ModuleReference>>,
292-
ChunkingType,
293-
ExportUsage,
294-
ImportUsage,
295-
ReadRef<Modules>,
296-
)>,
297-
);
306+
pub struct ModulesWithRefData(Vec<(ResolvedVc<Box<dyn ModuleReference>>, ResolvedReference)>);
298307

299308
/// Aggregates all primary [Module]s referenced by an [Module] via [ChunkableModuleReference]s.
300309
/// This does not include transitively referenced [Module]s, only includes
@@ -325,15 +334,15 @@ pub async fn primary_chunkable_referenced_modules(
325334
.await?
326335
.primary_modules()
327336
.await?;
328-
let export = reference.export_usage().owned().await?;
329-
let import = reference.import_usage().owned().await?;
337+
let binding_usage = reference.binding_usage().owned().await?;
330338

331339
return Ok(Some((
332340
ResolvedVc::upcast(reference),
333-
chunking_type.clone(),
334-
export,
335-
import,
336-
resolved,
341+
ResolvedReference {
342+
chunking_type: chunking_type.clone(),
343+
binding_usage,
344+
modules: resolved,
345+
},
337346
)));
338347
}
339348
Ok(None)

0 commit comments

Comments
 (0)