Skip to content

Commit 5042afd

Browse files
authored
Extract as_chunk into shared ChunkType trait (vercel/turborepo#6123)
### Description Step 3 in our chunking refactors extracts `ChunkItem::as_chunk` into a new `ChunkType` trait. This new trait isn't useful yet, but will eventually allow us to collect `ChunkItems` of a similar type into a lists, and perform chunking over all similar items at once. Re: vercel/turborepo#6120 ### Testing Instructions Closes WEB-1722
1 parent d783f98 commit 5042afd

File tree

19 files changed

+284
-182
lines changed

19 files changed

+284
-182
lines changed

crates/turbopack-build/src/chunking_context.rs

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ use turbo_tasks::{
99
use turbo_tasks_fs::FileSystemPath;
1010
use turbopack_core::{
1111
chunk::{
12-
availability_info::AvailabilityInfo, Chunk, ChunkItem, ChunkableModule, ChunkingContext,
13-
Chunks, EvaluatableAssets,
12+
availability_info::AvailabilityInfo, Chunk, ChunkItem, ChunkType, ChunkableModule,
13+
ChunkingContext, Chunks, EvaluatableAssets,
1414
},
1515
environment::Environment,
1616
ident::AssetIdent,
@@ -166,12 +166,13 @@ impl BuildChunkingContext {
166166
module: Vc<Box<dyn EcmascriptChunkPlaceable>>,
167167
evaluatable_assets: Vc<EvaluatableAssets>,
168168
) -> Result<Vc<Box<dyn OutputAsset>>> {
169-
let entry_chunk =
170-
module
171-
.as_chunk_item(Vc::upcast(self))
172-
.as_chunk(Value::new(AvailabilityInfo::Root {
173-
current_availability_root: Vc::upcast(module),
174-
}));
169+
let entry_chunk_item = module.as_chunk_item(Vc::upcast(self));
170+
let entry_chunk = entry_chunk_item.ty().as_chunk(
171+
entry_chunk_item,
172+
Value::new(AvailabilityInfo::Root {
173+
current_availability_root: Vc::upcast(module),
174+
}),
175+
);
175176

176177
let other_chunks = self
177178
.get_chunk_assets(entry_chunk, evaluatable_assets)
@@ -221,11 +222,15 @@ impl BuildChunkingContext {
221222
.iter()
222223
.map({
223224
move |evaluatable_asset| async move {
224-
evaluatable_asset
225-
.as_chunk_item(Vc::upcast(self))
226-
.as_chunk(Value::new(AvailabilityInfo::Root {
227-
current_availability_root: Vc::upcast(*evaluatable_asset),
228-
}))
225+
let chunk_item = evaluatable_asset.as_chunk_item(Vc::upcast(self));
226+
chunk_item
227+
.ty()
228+
.as_chunk(
229+
chunk_item,
230+
Value::new(AvailabilityInfo::Root {
231+
current_availability_root: Vc::upcast(*evaluatable_asset),
232+
}),
233+
)
229234
.resolve()
230235
.await
231236
}
@@ -364,9 +369,10 @@ impl ChunkingContext for BuildChunkingContext {
364369
module: Vc<Box<dyn ChunkableModule>>,
365370
availability_info: Value<AvailabilityInfo>,
366371
) -> Result<Vc<OutputAssets>> {
367-
let entry_chunk = module
368-
.as_chunk_item(Vc::upcast(self))
369-
.as_chunk(availability_info);
372+
let entry_chunk_item = module.as_chunk_item(Vc::upcast(self));
373+
let entry_chunk = entry_chunk_item
374+
.ty()
375+
.as_chunk(entry_chunk_item, availability_info);
370376
let parallel_chunks = get_parallel_chunks([entry_chunk]).await?;
371377

372378
let optimized_chunks = get_optimized_chunks(parallel_chunks).await?;

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

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -355,20 +355,25 @@ where
355355
}
356356
}
357357
ChunkingType::Parallel => {
358-
let chunk = chunkable_module
359-
.as_chunk_item(chunk_content_context.chunking_context)
360-
.as_chunk(chunk_content_context.availability_info);
358+
let chunk_item =
359+
chunkable_module.as_chunk_item(chunk_content_context.chunking_context);
360+
let chunk = chunk_item
361+
.ty()
362+
.as_chunk(chunk_item, chunk_content_context.availability_info);
361363
graph_nodes.push((
362364
Some((module, chunking_type)),
363365
ChunkContentGraphNode::Chunk(chunk),
364366
));
365367
}
366368
ChunkingType::IsolatedParallel => {
367-
let chunk = chunkable_module
368-
.as_chunk_item(chunk_content_context.chunking_context)
369-
.as_chunk(Value::new(AvailabilityInfo::Root {
369+
let chunk_item =
370+
chunkable_module.as_chunk_item(chunk_content_context.chunking_context);
371+
let chunk = chunk_item.ty().as_chunk(
372+
chunk_item,
373+
Value::new(AvailabilityInfo::Root {
370374
current_availability_root: Vc::upcast(chunkable_module),
371-
}));
375+
}),
376+
);
372377
graph_nodes.push((
373378
Some((module, chunking_type)),
374379
ChunkContentGraphNode::Chunk(chunk),
@@ -397,9 +402,11 @@ where
397402
}
398403
}
399404

400-
let chunk = chunkable_module
401-
.as_chunk_item(chunk_content_context.chunking_context)
402-
.as_chunk(chunk_content_context.availability_info);
405+
let chunk_item =
406+
chunkable_module.as_chunk_item(chunk_content_context.chunking_context);
407+
let chunk = chunk_item
408+
.ty()
409+
.as_chunk(chunk_item, chunk_content_context.availability_info);
403410
graph_nodes.push((
404411
Some((module, chunking_type)),
405412
ChunkContentGraphNode::Chunk(chunk),
@@ -613,8 +620,6 @@ where
613620

614621
#[turbo_tasks::value_trait]
615622
pub trait ChunkItem {
616-
fn as_chunk(self: Vc<Self>, availability_info: Value<AvailabilityInfo>) -> Vc<Box<dyn Chunk>>;
617-
618623
/// The [AssetIdent] of the [Module] that this [ChunkItem] was created from.
619624
/// For most chunk types this must uniquely identify the asset as it's the
620625
/// source of the module id used at runtime.
@@ -625,9 +630,26 @@ pub trait ChunkItem {
625630
/// references.
626631
fn references(self: Vc<Self>) -> Vc<ModuleReferences>;
627632

633+
/// The type of chunk this item should be assembled into.
634+
fn ty(self: Vc<Self>) -> Vc<Box<dyn ChunkType>>;
635+
636+
/// A temporary method to retrieve the module associated with this
637+
/// ChunkItem. TODO: Remove this as part of the chunk refactoring.
638+
fn module(self: Vc<Self>) -> Vc<Box<dyn Module>>;
639+
628640
fn chunking_context(self: Vc<Self>) -> Vc<Box<dyn ChunkingContext>>;
629641
}
630642

643+
#[turbo_tasks::value_trait]
644+
pub trait ChunkType {
645+
/// Create a new chunk for the given subgraph.
646+
fn as_chunk(
647+
&self,
648+
chunk_item: Vc<Box<dyn ChunkItem>>,
649+
availability_info: Value<AvailabilityInfo>,
650+
) -> Vc<Box<dyn Chunk>>;
651+
}
652+
631653
#[turbo_tasks::value(transparent)]
632654
pub struct ChunkItems(Vec<Vc<Box<dyn ChunkItem>>>);
633655

crates/turbopack-css/src/asset.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,11 @@ use swc_core::{
77
visit::{VisitMutWith, VisitMutWithPath},
88
},
99
};
10-
use turbo_tasks::{TryJoinIterExt, Value, ValueToString, Vc};
10+
use turbo_tasks::{TryJoinIterExt, ValueToString, Vc};
1111
use turbo_tasks_fs::FileSystemPath;
1212
use turbopack_core::{
1313
asset::{Asset, AssetContent},
14-
chunk::{
15-
availability_info::AvailabilityInfo, Chunk, ChunkItem, ChunkableModule, ChunkingContext,
16-
},
14+
chunk::{ChunkItem, ChunkType, ChunkableModule, ChunkingContext},
1715
context::AssetContext,
1816
ident::AssetIdent,
1917
module::Module,
@@ -23,7 +21,7 @@ use turbopack_core::{
2321
};
2422

2523
use crate::{
26-
chunk::{CssChunk, CssChunkItem, CssChunkItemContent, CssChunkPlaceable, CssImport},
24+
chunk::{CssChunkItem, CssChunkItemContent, CssChunkPlaceable, CssChunkType, CssImport},
2725
code_gen::CodeGenerateable,
2826
parse::{parse_css, ParseCss, ParseCssResult, ParseCssResultSourceMap},
2927
path_visitor::ApplyVisitors,
@@ -163,12 +161,13 @@ impl ChunkItem for CssModuleChunkItem {
163161
}
164162

165163
#[turbo_tasks::function]
166-
fn as_chunk(&self, availability_info: Value<AvailabilityInfo>) -> Vc<Box<dyn Chunk>> {
167-
Vc::upcast(CssChunk::new(
168-
self.chunking_context,
169-
Vc::upcast(self.module),
170-
availability_info,
171-
))
164+
fn ty(&self) -> Vc<Box<dyn ChunkType>> {
165+
Vc::upcast(Vc::<CssChunkType>::default())
166+
}
167+
168+
#[turbo_tasks::function]
169+
fn module(&self) -> Vc<Box<dyn Module>> {
170+
Vc::upcast(self.module)
172171
}
173172
}
174173

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

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@ pub(crate) mod writer;
44

55
use std::fmt::Write;
66

7-
use anyhow::{anyhow, Result};
7+
use anyhow::{anyhow, Context, Result};
88
use indexmap::IndexSet;
9-
use turbo_tasks::{TryJoinIterExt, Value, ValueToString, Vc};
9+
use turbo_tasks::{TryJoinIterExt, Value, ValueDefault, ValueToString, Vc};
1010
use turbo_tasks_fs::{rope::Rope, File, FileSystemPathOption};
1111
use turbopack_core::{
1212
asset::{Asset, AssetContent},
1313
chunk::{
1414
availability_info::AvailabilityInfo, chunk_content, chunk_content_split, Chunk,
15-
ChunkContentResult, ChunkItem, ChunkItemExt, ChunkableModule, ChunkingContext, Chunks,
16-
FromChunkableModule, ModuleId, OutputChunk, OutputChunkRuntimeInfo,
15+
ChunkContentResult, ChunkItem, ChunkItemExt, ChunkType, ChunkableModule, ChunkingContext,
16+
Chunks, FromChunkableModule, ModuleId, OutputChunk, OutputChunkRuntimeInfo,
1717
},
1818
code_builder::{Code, CodeBuilder},
1919
ident::AssetIdent,
@@ -614,3 +614,34 @@ impl Introspectable for CssChunk {
614614
Ok(Vc::cell(children))
615615
}
616616
}
617+
618+
#[derive(Default)]
619+
#[turbo_tasks::value]
620+
pub struct CssChunkType {}
621+
622+
#[turbo_tasks::value_impl]
623+
impl ChunkType for CssChunkType {
624+
#[turbo_tasks::function]
625+
async fn as_chunk(
626+
&self,
627+
chunk_item: Vc<Box<dyn ChunkItem>>,
628+
availability_info: Value<AvailabilityInfo>,
629+
) -> Result<Vc<Box<dyn Chunk>>> {
630+
let placeable = Vc::try_resolve_sidecast::<Box<dyn CssChunkPlaceable>>(chunk_item.module())
631+
.await?
632+
.context("Module must implmement CssChunkPlaceable to be used as a CSS Chunk")?;
633+
Ok(Vc::upcast(CssChunk::new(
634+
chunk_item.chunking_context(),
635+
placeable,
636+
availability_info,
637+
)))
638+
}
639+
}
640+
641+
#[turbo_tasks::value_impl]
642+
impl ValueDefault for CssChunkType {
643+
#[turbo_tasks::function]
644+
fn value_default() -> Vc<Self> {
645+
Self::default().cell()
646+
}
647+
}

crates/turbopack-css/src/module_asset.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,7 @@ use turbo_tasks::{Value, ValueToString, Vc};
1111
use turbo_tasks_fs::FileSystemPath;
1212
use turbopack_core::{
1313
asset::{Asset, AssetContent},
14-
chunk::{
15-
availability_info::AvailabilityInfo, Chunk, ChunkItem, ChunkItemExt, ChunkableModule,
16-
ChunkingContext,
17-
},
14+
chunk::{ChunkItem, ChunkItemExt, ChunkType, ChunkableModule, ChunkingContext},
1815
context::AssetContext,
1916
ident::AssetIdent,
2017
issue::{Issue, IssueExt, IssueSeverity},
@@ -26,8 +23,8 @@ use turbopack_core::{
2623
};
2724
use turbopack_ecmascript::{
2825
chunk::{
29-
EcmascriptChunk, EcmascriptChunkItem, EcmascriptChunkItemContent, EcmascriptChunkPlaceable,
30-
EcmascriptChunkingContext, EcmascriptExports,
26+
EcmascriptChunkItem, EcmascriptChunkItemContent, EcmascriptChunkPlaceable,
27+
EcmascriptChunkType, EcmascriptChunkingContext, EcmascriptExports,
3128
},
3229
utils::StringifyJs,
3330
ParseResultSourceMap,
@@ -277,12 +274,13 @@ impl ChunkItem for ModuleChunkItem {
277274
}
278275

279276
#[turbo_tasks::function]
280-
fn as_chunk(&self, availability_info: Value<AvailabilityInfo>) -> Vc<Box<dyn Chunk>> {
281-
Vc::upcast(EcmascriptChunk::new(
282-
Vc::upcast(self.chunking_context),
283-
Vc::upcast(self.module),
284-
availability_info,
285-
))
277+
fn ty(&self) -> Vc<Box<dyn ChunkType>> {
278+
Vc::upcast(Vc::<EcmascriptChunkType>::default())
279+
}
280+
281+
#[turbo_tasks::function]
282+
fn module(&self) -> Vc<Box<dyn Module>> {
283+
Vc::upcast(self.module)
286284
}
287285
}
288286

crates/turbopack-dev/src/chunking_context.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ use turbo_tasks::{
77
use turbo_tasks_fs::FileSystemPath;
88
use turbopack_core::{
99
chunk::{
10-
availability_info::AvailabilityInfo, Chunk, ChunkItem, ChunkableModule, ChunkingContext,
11-
Chunks, EvaluatableAssets,
10+
availability_info::AvailabilityInfo, Chunk, ChunkItem, ChunkType, ChunkableModule,
11+
ChunkingContext, Chunks, EvaluatableAssets,
1212
},
1313
environment::Environment,
1414
ident::AssetIdent,
@@ -346,9 +346,10 @@ impl ChunkingContext for DevChunkingContext {
346346
module: Vc<Box<dyn ChunkableModule>>,
347347
availability_info: Value<AvailabilityInfo>,
348348
) -> Result<Vc<OutputAssets>> {
349-
let entry_chunk = module
350-
.as_chunk_item(Vc::upcast(self))
351-
.as_chunk(availability_info);
349+
let entry_chunk_item = module.as_chunk_item(Vc::upcast(self));
350+
let entry_chunk = entry_chunk_item
351+
.ty()
352+
.as_chunk(entry_chunk_item, availability_info);
352353
let parallel_chunks = get_parallel_chunks([entry_chunk]).await?;
353354

354355
let optimized_chunks = get_optimized_chunks(parallel_chunks).await?;
@@ -381,11 +382,15 @@ impl ChunkingContext for DevChunkingContext {
381382
.iter()
382383
.map({
383384
move |evaluatable_asset| async move {
384-
evaluatable_asset
385-
.as_chunk_item(Vc::upcast(self))
386-
.as_chunk(Value::new(AvailabilityInfo::Root {
387-
current_availability_root: Vc::upcast(*evaluatable_asset),
388-
}))
385+
let chunk_item = evaluatable_asset.as_chunk_item(Vc::upcast(self));
386+
chunk_item
387+
.ty()
388+
.as_chunk(
389+
chunk_item,
390+
Value::new(AvailabilityInfo::Root {
391+
current_availability_root: Vc::upcast(*evaluatable_asset),
392+
}),
393+
)
389394
.resolve()
390395
.await
391396
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
use anyhow::{Context, Result};
2+
use turbo_tasks::{Value, ValueDefault, Vc};
3+
use turbopack_core::chunk::{availability_info::AvailabilityInfo, Chunk, ChunkItem, ChunkType};
4+
5+
use super::{EcmascriptChunk, EcmascriptChunkPlaceable};
6+
7+
#[derive(Default)]
8+
#[turbo_tasks::value]
9+
pub struct EcmascriptChunkType {}
10+
11+
#[turbo_tasks::value_impl]
12+
impl ChunkType for EcmascriptChunkType {
13+
#[turbo_tasks::function]
14+
async fn as_chunk(
15+
&self,
16+
chunk_item: Vc<Box<dyn ChunkItem>>,
17+
availability_info: Value<AvailabilityInfo>,
18+
) -> Result<Vc<Box<dyn Chunk>>> {
19+
let placeable =
20+
Vc::try_resolve_sidecast::<Box<dyn EcmascriptChunkPlaceable>>(chunk_item.module())
21+
.await?
22+
.context(
23+
"Module must implmement EcmascriptChunkPlaceable to be used as a EcmaScript \
24+
Chunk",
25+
)?;
26+
Ok(Vc::upcast(EcmascriptChunk::new(
27+
chunk_item.chunking_context(),
28+
placeable,
29+
availability_info,
30+
)))
31+
}
32+
}
33+
34+
#[turbo_tasks::value_impl]
35+
impl ValueDefault for EcmascriptChunkType {
36+
#[turbo_tasks::function]
37+
fn value_default() -> Vc<Self> {
38+
Self::default().cell()
39+
}
40+
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
pub(crate) mod chunk_type;
12
pub(crate) mod content;
23
pub(crate) mod context;
34
pub(crate) mod data;
@@ -30,6 +31,7 @@ use turbopack_core::{
3031

3132
use self::content::ecmascript_chunk_content;
3233
pub use self::{
34+
chunk_type::EcmascriptChunkType,
3335
content::EcmascriptChunkContent,
3436
context::EcmascriptChunkingContext,
3537
data::EcmascriptChunkData,

0 commit comments

Comments
 (0)