Skip to content

Commit 3a85277

Browse files
committed
Turbopack: replace is_reference_used with unused_references set
1 parent 860b093 commit 3a85277

13 files changed

Lines changed: 84 additions & 81 deletions

File tree

crates/next-api/src/project.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ use turbopack_core::{
4747
PROJECT_FILESYSTEM_NAME,
4848
changed::content_changed,
4949
chunk::{
50-
ChunkingContext, EvaluatableAssets,
50+
ChunkingContext, EvaluatableAssets, UnusedReferences,
5151
module_id_strategies::{DevModuleIdStrategy, ModuleIdStrategy},
5252
},
5353
compile_time_info::CompileTimeInfo,
@@ -2067,17 +2067,15 @@ impl Project {
20672067

20682068
/// Compute the unused references that were removed (inner graph tree shaking).
20692069
#[turbo_tasks::function]
2070-
pub async fn unused_references(self: Vc<Self>) -> Result<Vc<OptionBindingUsageInfo>> {
2070+
pub async fn unused_references(self: Vc<Self>) -> Result<Vc<UnusedReferences>> {
20712071
if *self
20722072
.next_config()
20732073
.turbopack_remove_unused_imports(self.next_mode())
20742074
.await?
20752075
{
2076-
Ok(Vc::cell(Some(
2077-
self.binding_usage_info().to_resolved().await?,
2078-
)))
2076+
Ok(self.binding_usage_info().unused_references())
20792077
} else {
2080-
Ok(Vc::cell(None))
2078+
Ok(Vc::cell(Default::default()))
20812079
}
20822080
}
20832081

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use turbopack_browser::{
1717
use turbopack_core::{
1818
chunk::{
1919
ChunkingConfig, ChunkingContext, MangleType, MinifyType, SourceMapSourceType,
20-
SourceMapsType, module_id_strategies::ModuleIdStrategy,
20+
SourceMapsType, UnusedReferences, module_id_strategies::ModuleIdStrategy,
2121
},
2222
compile_time_info::{CompileTimeDefines, CompileTimeInfo, FreeVarReference, FreeVarReferences},
2323
environment::{BrowserEnvironment, Environment, ExecutionEnvironment},
@@ -423,7 +423,7 @@ pub struct ClientChunkingContextOptions {
423423
pub environment: Vc<Environment>,
424424
pub module_id_strategy: Vc<Box<dyn ModuleIdStrategy>>,
425425
pub export_usage: Vc<OptionBindingUsageInfo>,
426-
pub unused_references: Vc<OptionBindingUsageInfo>,
426+
pub unused_references: Vc<UnusedReferences>,
427427
pub minify: Vc<bool>,
428428
pub source_maps: Vc<SourceMapsType>,
429429
pub no_mangling: Vc<bool>,
@@ -481,7 +481,7 @@ pub async fn get_client_chunking_context(
481481
.asset_base_path(Some(asset_prefix))
482482
.current_chunk_method(CurrentChunkMethod::DocumentCurrentScript)
483483
.export_usage(*export_usage.await?)
484-
.unused_references(*unused_references.await?)
484+
.unused_references(unused_references.to_resolved().await?)
485485
.module_id_strategy(module_id_strategy.to_resolved().await?)
486486
.debug_ids(*debug_ids.await?)
487487
.should_use_absolute_url_references(*should_use_absolute_url_references.await?)

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use turbo_tasks_fs::FileSystemPath;
66
use turbopack_browser::BrowserChunkingContext;
77
use turbopack_core::{
88
chunk::{
9-
ChunkingConfig, ChunkingContext, MangleType, MinifyType, SourceMapsType,
9+
ChunkingConfig, ChunkingContext, MangleType, MinifyType, SourceMapsType, UnusedReferences,
1010
module_id_strategies::ModuleIdStrategy,
1111
},
1212
compile_time_info::{CompileTimeDefines, CompileTimeInfo, FreeVarReference, FreeVarReferences},
@@ -205,7 +205,7 @@ pub struct EdgeChunkingContextOptions {
205205
pub environment: Vc<Environment>,
206206
pub module_id_strategy: Vc<Box<dyn ModuleIdStrategy>>,
207207
pub export_usage: Vc<OptionBindingUsageInfo>,
208-
pub unused_references: Vc<OptionBindingUsageInfo>,
208+
pub unused_references: Vc<UnusedReferences>,
209209
pub turbo_minify: Vc<bool>,
210210
pub turbo_source_maps: Vc<SourceMapsType>,
211211
pub no_mangling: Vc<bool>,
@@ -261,7 +261,7 @@ pub async fn get_edge_chunking_context_with_client_assets(
261261
.source_maps(*turbo_source_maps.await?)
262262
.module_id_strategy(module_id_strategy.to_resolved().await?)
263263
.export_usage(*export_usage.await?)
264-
.unused_references(*unused_references.await?)
264+
.unused_references(unused_references.to_resolved().await?)
265265
.nested_async_availability(*nested_async_chunking.await?);
266266

267267
if !next_mode.is_development() {
@@ -338,7 +338,7 @@ pub async fn get_edge_chunking_context(
338338
.source_maps(*turbo_source_maps.await?)
339339
.module_id_strategy(module_id_strategy.to_resolved().await?)
340340
.export_usage(*export_usage.await?)
341-
.unused_references(*unused_references.await?)
341+
.unused_references(unused_references.to_resolved().await?)
342342
.nested_async_availability(*nested_async_chunking.await?);
343343

344344
if !next_mode.is_development() {

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use turbopack::{
1616
use turbopack_core::{
1717
chunk::{
1818
ChunkingConfig, MangleType, MinifyType, SourceMapSourceType, SourceMapsType,
19-
module_id_strategies::ModuleIdStrategy,
19+
UnusedReferences, module_id_strategies::ModuleIdStrategy,
2020
},
2121
compile_time_defines,
2222
compile_time_info::{CompileTimeDefines, CompileTimeInfo, FreeVarReferences},
@@ -995,7 +995,7 @@ pub struct ServerChunkingContextOptions {
995995
pub environment: Vc<Environment>,
996996
pub module_id_strategy: Vc<Box<dyn ModuleIdStrategy>>,
997997
pub export_usage: Vc<OptionBindingUsageInfo>,
998-
pub unused_references: Vc<OptionBindingUsageInfo>,
998+
pub unused_references: Vc<UnusedReferences>,
999999
pub minify: Vc<bool>,
10001000
pub source_maps: Vc<SourceMapsType>,
10011001
pub no_mangling: Vc<bool>,
@@ -1056,7 +1056,7 @@ pub async fn get_server_chunking_context_with_client_assets(
10561056
.source_maps(*source_maps.await?)
10571057
.module_id_strategy(module_id_strategy.to_resolved().await?)
10581058
.export_usage(*export_usage.await?)
1059-
.unused_references(*unused_references.await?)
1059+
.unused_references(unused_references.to_resolved().await?)
10601060
.file_tracing(next_mode.is_production())
10611061
.debug_ids(*debug_ids.await?)
10621062
.nested_async_availability(*nested_async_chunking.await?);
@@ -1140,7 +1140,7 @@ pub async fn get_server_chunking_context(
11401140
.source_maps(*source_maps.await?)
11411141
.module_id_strategy(module_id_strategy.to_resolved().await?)
11421142
.export_usage(*export_usage.await?)
1143-
.unused_references(*unused_references.await?)
1143+
.unused_references(unused_references.to_resolved().await?)
11441144
.file_tracing(next_mode.is_production())
11451145
.debug_ids(*debug_ids.await?)
11461146
.nested_async_availability(*nested_async_chunking.await?);

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

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use turbopack_core::{
1414
Chunk, ChunkGroupResult, ChunkItem, ChunkType, ChunkableModule, ChunkingConfig,
1515
ChunkingConfigs, ChunkingContext, EntryChunkGroupResult, EvaluatableAsset,
1616
EvaluatableAssets, MinifyType, ModuleId, SourceMapSourceType, SourceMapsType,
17+
UnusedReferences,
1718
availability_info::AvailabilityInfo,
1819
chunk_group::{MakeChunkGroupResult, make_chunk_group},
1920
module_id_strategies::{DevModuleIdStrategy, ModuleIdStrategy},
@@ -27,7 +28,6 @@ use turbopack_core::{
2728
chunk_group_info::ChunkGroup,
2829
},
2930
output::{OutputAsset, OutputAssets},
30-
reference::ModuleReference,
3131
};
3232
use turbopack_ecmascript::{
3333
async_chunk::module::AsyncLoaderModule,
@@ -174,11 +174,8 @@ impl BrowserChunkingContextBuilder {
174174
self
175175
}
176176

177-
pub fn unused_references(
178-
mut self,
179-
unused_references: Option<ResolvedVc<BindingUsageInfo>>,
180-
) -> Self {
181-
self.chunking_context.unused_references = unused_references;
177+
pub fn unused_references(mut self, unused_references: ResolvedVc<UnusedReferences>) -> Self {
178+
self.chunking_context.unused_references = Some(unused_references);
182179
self
183180
}
184181

@@ -305,7 +302,7 @@ pub struct BrowserChunkingContext {
305302
/// The module export usage info, if available.
306303
export_usage: Option<ResolvedVc<BindingUsageInfo>>,
307304
/// Which references are unused and should be skipped (e.g. during codegen).
308-
unused_references: Option<ResolvedVc<BindingUsageInfo>>,
305+
unused_references: Option<ResolvedVc<UnusedReferences>>,
309306
/// The chunking configs
310307
chunking_configs: Vec<(ResolvedVc<Box<dyn ChunkType>>, ChunkingConfig)>,
311308
/// Whether to use absolute URLs for static assets (e.g. in CSS: `url("/absolute/path")`)
@@ -886,16 +883,11 @@ impl ChunkingContext for BrowserChunkingContext {
886883
}
887884

888885
#[turbo_tasks::function]
889-
async fn is_reference_unused(
890-
&self,
891-
reference: ResolvedVc<Box<dyn ModuleReference>>,
892-
) -> Result<Vc<bool>> {
886+
fn unused_references(&self) -> Vc<UnusedReferences> {
893887
if let Some(unused_references) = self.unused_references {
894-
Ok(Vc::cell(
895-
unused_references.await?.is_reference_unused(&reference),
896-
))
888+
*unused_references
897889
} else {
898-
Ok(Vc::cell(false))
890+
Vc::cell(Default::default())
899891
}
900892
}
901893

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ async fn build_internal(
317317
let binding_usage = compute_binding_usage_info(module_graph.to_resolved().await?, true)
318318
.resolve_strongly_consistent()
319319
.await?;
320+
let unused_references = binding_usage.unused_references().to_resolved().await?;
320321
module_graph = module_graph.without_unused_references(*binding_usage);
321322

322323
let chunking_context: Vc<Box<dyn ChunkingContext>> = match target {
@@ -344,7 +345,7 @@ async fn build_internal(
344345
.source_maps(source_maps_type)
345346
.module_id_strategy(module_id_strategy)
346347
.export_usage(Some(binding_usage))
347-
.unused_references(Some(binding_usage))
348+
.unused_references(unused_references)
348349
.current_chunk_method(CurrentChunkMethod::DocumentCurrentScript)
349350
.minify_type(minify_type);
350351

@@ -394,7 +395,7 @@ async fn build_internal(
394395
.source_maps(source_maps_type)
395396
.module_id_strategy(module_id_strategy)
396397
.export_usage(Some(binding_usage))
397-
.unused_references(Some(binding_usage))
398+
.unused_references(unused_references)
398399
.minify_type(minify_type);
399400

400401
match *node_env.await? {

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use anyhow::{Result, bail};
22
use bincode::{Decode, Encode};
3-
use rustc_hash::FxHashMap;
3+
use rustc_hash::{FxHashMap, FxHashSet};
44
use serde::{Deserialize, Serialize};
55
use turbo_rcstr::RcStr;
66
use turbo_tasks::{NonLocalValue, ResolvedVc, TaskInput, Upcast, Vc, trace::TraceRawVcs};
@@ -262,6 +262,9 @@ pub enum SourceMapSourceType {
262262
TurbopackUri,
263263
}
264264

265+
#[turbo_tasks::value(transparent, cell = "keyed")]
266+
pub struct UnusedReferences(FxHashSet<ResolvedVc<Box<dyn ModuleReference>>>);
267+
265268
/// A context for the chunking that influences the way chunks are created
266269
#[turbo_tasks::value_trait]
267270
pub trait ChunkingContext {
@@ -447,10 +450,7 @@ pub trait ChunkingContext {
447450
) -> Result<Vc<ModuleExportUsage>>;
448451

449452
#[turbo_tasks::function]
450-
async fn is_reference_unused(
451-
self: Vc<Self>,
452-
reference: Vc<Box<dyn ModuleReference>>,
453-
) -> Result<Vc<bool>>;
453+
async fn unused_references(self: Vc<Self>) -> Result<Vc<UnusedReferences>>;
454454

455455
/// Returns whether debug IDs are enabled for this chunking context.
456456
#[turbo_tasks::function]

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ pub use crate::chunk::{
2929
chunking_context::{
3030
ChunkGroupResult, ChunkGroupType, ChunkingConfig, ChunkingConfigs, ChunkingContext,
3131
ChunkingContextExt, EntryChunkGroupResult, MangleType, MinifyType, SourceMapSourceType,
32-
SourceMapsType,
32+
SourceMapsType, UnusedReferences,
3333
},
3434
data::{ChunkData, ChunkDataOption, ChunksData},
3535
evaluate::{EvaluatableAsset, EvaluatableAssetExt, EvaluatableAssets},

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

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@ use turbo_rcstr::RcStr;
88
use turbo_tasks::{ResolvedVc, Vc};
99

1010
use crate::{
11+
chunk::chunking_context::UnusedReferences,
1112
module::Module,
1213
module_graph::{GraphEdgeIndex, GraphTraversalAction, ModuleGraph},
13-
reference::ModuleReference,
1414
resolve::{ExportUsage, ImportUsage},
1515
};
1616

1717
#[turbo_tasks::value]
1818
#[derive(Clone, Default, Debug)]
1919
pub struct BindingUsageInfo {
20-
unused_references: FxHashSet<ResolvedVc<Box<dyn ModuleReference>>>,
20+
unused_references: ResolvedVc<UnusedReferences>,
2121
#[turbo_tasks(trace_ignore)]
2222
unused_references_edges: FxHashSet<GraphEdgeIndex>,
2323

@@ -51,10 +51,6 @@ impl BindingUsageInfo {
5151
self.unused_references_edges.contains(edge)
5252
}
5353

54-
pub fn is_reference_unused(&self, reference: &ResolvedVc<Box<dyn ModuleReference>>) -> bool {
55-
self.unused_references.contains(reference)
56-
}
57-
5854
pub async fn used_exports(
5955
&self,
6056
module: ResolvedVc<Box<dyn Module>>,
@@ -81,6 +77,14 @@ impl BindingUsageInfo {
8177
}
8278
}
8379

80+
#[turbo_tasks::value_impl]
81+
impl BindingUsageInfo {
82+
#[turbo_tasks::function]
83+
pub fn unused_references(&self) -> Vc<UnusedReferences> {
84+
*self.unused_references
85+
}
86+
}
87+
8488
#[turbo_tasks::function(operation)]
8589
pub async fn compute_binding_usage_info(
8690
graph: ResolvedVc<ModuleGraph>,
@@ -254,7 +258,7 @@ pub async fn compute_binding_usage_info(
254258
}
255259

256260
Ok(BindingUsageInfo {
257-
unused_references,
261+
unused_references: ResolvedVc::cell(unused_references),
258262
unused_references_edges,
259263
used_exports,
260264
export_circuit_breakers,

turbopack/crates/turbopack-ecmascript/src/references/esm/base.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -528,14 +528,15 @@ impl ChunkableModuleReference for EsmAssetReference {
528528

529529
impl EsmAssetReference {
530530
pub async fn code_generation(
531-
self: Vc<Self>,
531+
self: ResolvedVc<Self>,
532532
chunking_context: Vc<Box<dyn ChunkingContext>>,
533533
scope_hoisting_context: ScopeHoistingContext<'_>,
534534
) -> Result<CodeGeneration> {
535535
let this = &*self.await?;
536536

537-
if *chunking_context
538-
.is_reference_unused(Vc::upcast(self))
537+
if chunking_context
538+
.unused_references()
539+
.contains_key(&ResolvedVc::upcast(self))
539540
.await?
540541
{
541542
return Ok(CodeGeneration::empty());

0 commit comments

Comments
 (0)