Skip to content

Commit 4b5d6ac

Browse files
committed
Merge export and import usage info
1 parent 63abd11 commit 4b5d6ac

File tree

22 files changed

+423
-404
lines changed

22 files changed

+423
-404
lines changed

crates/next-api/src/analyze.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -416,13 +416,15 @@ pub async fn analyze_module_graphs(module_graphs: Vc<ModuleGraphs>) -> Result<Vc
416416
let mut all_async_edges = FxIndexSet::default();
417417
for &module_graph in module_graphs.await? {
418418
let module_graph = module_graph.read_graphs().await?;
419-
module_graph.traverse_all_edges_unordered(|(parent_node, reference, _), node| {
420-
match reference.chunking_type {
421-
ChunkingType::Async => {
422-
all_async_edges.insert((parent_node, node));
423-
}
424-
_ => {
425-
all_edges.insert((parent_node, node));
419+
module_graph.traverse_all_edges_unordered(|parent, node| {
420+
if let Some((parent_node, reference, _)) = parent {
421+
match reference.chunking_type {
422+
ChunkingType::Async => {
423+
all_async_edges.insert((parent_node, node));
424+
}
425+
_ => {
426+
all_edges.insert((parent_node, node));
427+
}
426428
}
427429
}
428430
Ok(())

crates/next-api/src/module_graph.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ impl NextDynamicGraph {
101101
&mut (),
102102
|parent_info, node, _| {
103103
let module = node;
104-
let Some((parent_node, _)) = parent_info else {
104+
let Some((parent_node, _, _)) = parent_info else {
105105
state_map.insert(module, VisitState::Entry);
106106
return Ok(GraphTraversalAction::Continue);
107107
};
@@ -544,7 +544,7 @@ async fn validate_pages_css_imports(
544544

545545
// If we're at a root node, there is nothing importing this module and we can skip
546546
// any further validations.
547-
let Some((parent_node, _)) = parent_info else {
547+
let Some((parent_node, _, _)) = parent_info else {
548548
return Ok(GraphTraversalAction::Continue);
549549
};
550550
let parent_module = parent_node;

crates/next-api/src/project.rs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ use turbopack_core::{
6464
module::Module,
6565
module_graph::{
6666
GraphEntries, ModuleGraph, SingleModuleGraph, VisitedModules,
67+
binding_usage_info::{OptionBindingUsageInfo, compute_binding_usage_info},
6768
chunk_group_info::ChunkGroupEntry,
68-
export_usage::{OptionExportUsageInfo, compute_export_usage_info},
6969
},
7070
output::{OutputAsset, OutputAssets},
7171
resolve::{FindContextFileResult, find_context_file},
@@ -1869,15 +1869,35 @@ impl Project {
18691869

18701870
/// Compute the used exports for each module.
18711871
#[turbo_tasks::function]
1872-
pub async fn export_usage(self: Vc<Self>) -> Result<Vc<OptionExportUsageInfo>> {
1872+
pub async fn export_usage(self: Vc<Self>) -> Result<Vc<OptionBindingUsageInfo>> {
18731873
if *self
18741874
.next_config()
18751875
.turbopack_remove_unused_exports(self.next_mode())
18761876
.await?
18771877
{
18781878
let module_graphs = self.whole_app_module_graphs().await?;
18791879
Ok(Vc::cell(Some(
1880-
compute_export_usage_info(module_graphs.full)
1880+
compute_binding_usage_info(module_graphs.full)
1881+
// As a performance optimization, we resolve strongly consistently
1882+
.resolve_strongly_consistent()
1883+
.await?,
1884+
)))
1885+
} else {
1886+
Ok(Vc::cell(None))
1887+
}
1888+
}
1889+
1890+
/// Compute the used exports for each module.
1891+
#[turbo_tasks::function]
1892+
pub async fn unused_references(self: Vc<Self>) -> Result<Vc<OptionBindingUsageInfo>> {
1893+
if *self
1894+
.next_config()
1895+
.turbopack_remove_unused_imports(self.next_mode())
1896+
.await?
1897+
{
1898+
let module_graphs = self.whole_app_module_graphs().await?;
1899+
Ok(Vc::cell(Some(
1900+
compute_binding_usage_info(module_graphs.full)
18811901
// As a performance optimization, we resolve strongly consistently
18821902
.resolve_strongly_consistent()
18831903
.await?,

crates/next-api/src/webpack_stats.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,14 @@ where
5858
let asset_reasons = {
5959
let module_graph = module_graph.read_graphs().await?;
6060
let mut edges = vec![];
61-
module_graph.traverse_all_edges_unordered(|(parent_node, r, _), current| {
62-
edges.push((
63-
parent_node,
64-
RcStr::from(format!("{}: {}", r.chunking_type, r.export)),
65-
current,
66-
));
61+
module_graph.traverse_all_edges_unordered(|parent, current| {
62+
if let Some((parent_node, r, _)) = parent {
63+
edges.push((
64+
parent_node,
65+
RcStr::from(format!("{}: {}", r.chunking_type, r.export)),
66+
current,
67+
));
68+
}
6769
Ok(())
6870
})?;
6971

crates/next-core/src/next_client/context.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use turbopack_core::{
2525
compile_time_info::{CompileTimeDefines, CompileTimeInfo, FreeVarReference, FreeVarReferences},
2626
environment::{BrowserEnvironment, Environment, ExecutionEnvironment},
2727
free_var_references,
28-
module_graph::export_usage::OptionExportUsageInfo,
28+
module_graph::binding_usage_info::OptionBindingUsageInfo,
2929
resolve::{parse::Request, pattern::Pattern},
3030
};
3131
use turbopack_ecmascript::{AnalyzeMode, TypeofWindow, chunk::EcmascriptChunkType};
@@ -421,7 +421,7 @@ pub struct ClientChunkingContextOptions {
421421
pub chunk_suffix_path: Vc<Option<RcStr>>,
422422
pub environment: Vc<Environment>,
423423
pub module_id_strategy: Vc<Box<dyn ModuleIdStrategy>>,
424-
pub export_usage: Vc<OptionExportUsageInfo>,
424+
pub export_usage: Vc<OptionBindingUsageInfo>,
425425
pub minify: Vc<bool>,
426426
pub source_maps: Vc<bool>,
427427
pub no_mangling: Vc<bool>,

crates/next-core/src/next_client_reference/ecmascript_client_reference/ecmascript_client_reference_module.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use turbopack_core::{
1515
context::AssetContext,
1616
ident::AssetIdent,
1717
module::Module,
18-
module_graph::{ModuleGraph, export_usage::ModuleExportUsageInfo},
18+
module_graph::{ModuleGraph, binding_usage_info::ModuleExportUsageInfo},
1919
reference::{ModuleReference, ModuleReferences},
2020
reference_type::ReferenceType,
2121
resolve::ModuleResolveResult,

crates/next-core/src/next_edge/context.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use turbopack_core::{
1313
compile_time_info::{CompileTimeDefines, CompileTimeInfo, FreeVarReference, FreeVarReferences},
1414
environment::{EdgeWorkerEnvironment, Environment, ExecutionEnvironment, NodeJsVersion},
1515
free_var_references,
16-
module_graph::export_usage::OptionExportUsageInfo,
16+
module_graph::binding_usage_info::OptionBindingUsageInfo,
1717
};
1818
use turbopack_ecmascript::chunk::EcmascriptChunkType;
1919
use turbopack_node::execution_context::ExecutionContext;
@@ -203,7 +203,7 @@ pub struct EdgeChunkingContextOptions {
203203
pub output_root_to_root_path: Vc<RcStr>,
204204
pub environment: Vc<Environment>,
205205
pub module_id_strategy: Vc<Box<dyn ModuleIdStrategy>>,
206-
pub export_usage: Vc<OptionExportUsageInfo>,
206+
pub export_usage: Vc<OptionBindingUsageInfo>,
207207
pub turbo_minify: Vc<bool>,
208208
pub turbo_source_maps: Vc<bool>,
209209
pub no_mangling: Vc<bool>,

crates/next-core/src/next_server/context.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use turbopack_core::{
2323
compile_time_info::{CompileTimeDefines, CompileTimeInfo, FreeVarReferences},
2424
environment::{Environment, ExecutionEnvironment, NodeJsEnvironment, NodeJsVersion},
2525
free_var_references,
26-
module_graph::export_usage::OptionExportUsageInfo,
26+
module_graph::binding_usage_info::OptionBindingUsageInfo,
2727
target::CompileTarget,
2828
};
2929
use turbopack_ecmascript::{
@@ -995,7 +995,7 @@ pub struct ServerChunkingContextOptions {
995995
pub node_root_to_root_path: RcStr,
996996
pub environment: Vc<Environment>,
997997
pub module_id_strategy: Vc<Box<dyn ModuleIdStrategy>>,
998-
pub export_usage: Vc<OptionExportUsageInfo>,
998+
pub export_usage: Vc<OptionBindingUsageInfo>,
999999
pub turbo_minify: Vc<bool>,
10001000
pub turbo_source_maps: Vc<bool>,
10011001
pub no_mangling: Vc<bool>,

turbopack/crates/turbopack-browser/src/chunking_context.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,8 @@ use turbopack_core::{
2323
module::Module,
2424
module_graph::{
2525
ModuleGraph,
26+
binding_usage_info::{BindingUsageInfo, ModuleExportUsage},
2627
chunk_group_info::ChunkGroup,
27-
export_usage::{ExportUsageInfo, ModuleExportUsage},
28-
import_usage::UnusedReferences,
2928
},
3029
output::{OutputAsset, OutputAssets},
3130
reference::ModuleReference,
@@ -165,14 +164,14 @@ impl BrowserChunkingContextBuilder {
165164
self
166165
}
167166

168-
pub fn export_usage(mut self, export_usage: Option<ResolvedVc<ExportUsageInfo>>) -> Self {
167+
pub fn export_usage(mut self, export_usage: Option<ResolvedVc<BindingUsageInfo>>) -> Self {
169168
self.chunking_context.export_usage = export_usage;
170169
self
171170
}
172171

173172
pub fn unused_references(
174173
mut self,
175-
unused_references: Option<ResolvedVc<UnusedReferences>>,
174+
unused_references: Option<ResolvedVc<BindingUsageInfo>>,
176175
) -> Self {
177176
self.chunking_context.unused_references = unused_references;
178177
self
@@ -294,9 +293,9 @@ pub struct BrowserChunkingContext {
294293
/// The module id strategy to use
295294
module_id_strategy: ResolvedVc<Box<dyn ModuleIdStrategy>>,
296295
/// The module export usage info, if available.
297-
export_usage: Option<ResolvedVc<ExportUsageInfo>>,
296+
export_usage: Option<ResolvedVc<BindingUsageInfo>>,
298297
/// Which references are unused and should be skipped (e.g. during codegen).
299-
unused_references: Option<ResolvedVc<UnusedReferences>>,
298+
unused_references: Option<ResolvedVc<BindingUsageInfo>>,
300299
/// The chunking configs
301300
chunking_configs: Vec<(ResolvedVc<Box<dyn ChunkType>>, ChunkingConfig)>,
302301
/// Whether to use absolute URLs for static assets (e.g. in CSS: `url("/absolute/path")`)
@@ -872,8 +871,6 @@ impl ChunkingContext for BrowserChunkingContext {
872871
if let Some(export_usage) = self.await?.export_usage {
873872
Ok(export_usage.await?.used_exports(module).await?)
874873
} else {
875-
// In development mode, we don't have export usage info, so we assume all exports are
876-
// used.
877874
Ok(ModuleExportUsage::all())
878875
}
879876
}
@@ -885,7 +882,7 @@ impl ChunkingContext for BrowserChunkingContext {
885882
) -> Result<Vc<bool>> {
886883
if let Some(unused_references) = self.await?.unused_references {
887884
Ok(Vc::cell(
888-
unused_references.await?.contains_reference(&reference),
885+
unused_references.await?.is_reference_unused(&reference),
889886
))
890887
} else {
891888
Ok(Vc::cell(false))

turbopack/crates/turbopack-cli/src/build/mod.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ use turbopack_core::{
3333
module::Module,
3434
module_graph::{
3535
ModuleGraph,
36+
binding_usage_info::compute_binding_usage_info,
3637
chunk_group_info::{ChunkGroup, ChunkGroupEntry},
37-
export_usage::compute_export_usage_info,
3838
},
3939
output::{OutputAsset, OutputAssets, OutputAssetsWithReferenced},
4040
reference::all_assets_from_entries,
@@ -306,7 +306,7 @@ async fn build_internal(
306306
.instrument(tracing::info_span!("resolve entries"))
307307
.await?;
308308

309-
let module_graph = ModuleGraph::from_modules(
309+
let mut module_graph = ModuleGraph::from_modules(
310310
Vc::cell(vec![ChunkGroupEntry::Entry(entries.clone())]),
311311
false,
312312
);
@@ -315,9 +315,10 @@ async fn build_internal(
315315
.to_resolved()
316316
.await?,
317317
);
318-
let export_usage = compute_export_usage_info(module_graph.to_resolved().await?)
318+
let binding_usage = compute_binding_usage_info(module_graph.to_resolved().await?)
319319
.resolve_strongly_consistent()
320320
.await?;
321+
module_graph = module_graph.without_unused_references(*binding_usage);
321322

322323
let chunking_context: Vc<Box<dyn ChunkingContext>> = match target {
323324
Target::Browser => {
@@ -343,7 +344,8 @@ async fn build_internal(
343344
)
344345
.source_maps(source_maps_type)
345346
.module_id_strategy(module_id_strategy)
346-
.export_usage(Some(export_usage))
347+
.export_usage(Some(binding_usage))
348+
.unused_references(Some(binding_usage))
347349
.current_chunk_method(CurrentChunkMethod::DocumentCurrentScript)
348350
.minify_type(minify_type);
349351

@@ -391,7 +393,8 @@ async fn build_internal(
391393
)
392394
.source_maps(source_maps_type)
393395
.module_id_strategy(module_id_strategy)
394-
.export_usage(Some(export_usage))
396+
.export_usage(Some(binding_usage))
397+
.unused_references(Some(binding_usage))
395398
.minify_type(minify_type);
396399

397400
match *node_env.await? {

0 commit comments

Comments
 (0)