11use rspack_error:: Result ;
22
3- use super :: { TaskContext , build:: BuildTask , lazy:: process_unlazy_dependencies} ;
3+ use super :: {
4+ TaskContext ,
5+ build:: { BuildResultTask , BuildTask } ,
6+ lazy:: process_unlazy_dependencies,
7+ } ;
48use crate :: {
5- BoxModule , DependencyRef , ModuleIdentifier ,
9+ BoxModule , BuildResult , DependencyRef , ModuleIdentifier ,
610 compilation:: build_module_graph:: ForwardedIdSet ,
711 module_graph:: { ModuleGraph , ModuleGraphModule } ,
812 utils:: task_loop:: { Task , TaskResult , TaskType } ,
@@ -17,55 +21,69 @@ pub struct AddTask {
1721 pub from_unlazy : bool ,
1822}
1923
24+ enum ModuleBuild {
25+ Fresh ( BoxModule ) ,
26+ Cached ( BuildResult ) ,
27+ }
28+
2029#[ async_trait:: async_trait]
2130impl Task < TaskContext > for AddTask {
2231 fn get_task_type ( & self ) -> TaskType {
2332 TaskType :: Main
2433 }
2534 async fn main_run ( self : Box < Self > , context : & mut TaskContext ) -> TaskResult < TaskContext > {
26- let module_identifier = self . module . identifier ( ) ;
27- let module_graph = & mut context. artifact . module_graph ;
35+ let Self {
36+ original_module_identifier,
37+ mut module,
38+ module_graph_module,
39+ dependencies,
40+ from_unlazy,
41+ } = * self ;
42+ let module_identifier = module. identifier ( ) ;
2843
2944 // reuse module for self referenced module
30- if self . module . as_self_module ( ) . is_some ( ) {
31- let issuer = self
32- . module_graph_module
45+ if module. as_self_module ( ) . is_some ( ) {
46+ let issuer = module_graph_module
3347 . issuer ( )
3448 . identifier ( )
3549 . expect ( "self module should have issuer" ) ;
3650
3751 set_resolved_module (
38- module_graph,
39- self . original_module_identifier ,
40- self . dependencies ,
52+ & mut context . artifact . module_graph ,
53+ original_module_identifier,
54+ dependencies,
4155 * issuer,
4256 ) ?;
4357
4458 return Ok ( vec ! [ ] ) ;
4559 }
4660
47- let forwarded_ids = ForwardedIdSet :: from_dependencies ( & self . dependencies ) ;
61+ let forwarded_ids = ForwardedIdSet :: from_dependencies ( & dependencies) ;
4862
4963 // reuse module if module is already added by other dependency
50- if module_graph
64+ if context
65+ . artifact
66+ . module_graph
5167 . module_graph_module_by_identifier ( & module_identifier)
5268 . is_some ( )
5369 {
5470 set_resolved_module (
55- module_graph,
56- self . original_module_identifier ,
57- self . dependencies ,
71+ & mut context . artifact . module_graph ,
72+ original_module_identifier,
73+ dependencies,
5874 module_identifier,
5975 ) ?;
6076
61- if self . from_unlazy {
77+ if from_unlazy {
6278 context
6379 . artifact
6480 . affected_modules
6581 . mark_as_add ( & module_identifier) ;
6682 }
6783
68- if module_graph
84+ if context
85+ . artifact
86+ . module_graph
6987 . module_by_identifier ( & module_identifier)
7088 . is_some ( )
7189 {
@@ -77,7 +95,7 @@ impl Task<TaskContext> for AddTask {
7795 {
7896 if let Some ( task) = process_unlazy_dependencies (
7997 & context. artifact . module_to_lazy_make ,
80- module_graph,
98+ & mut context . artifact . module_graph ,
8199 forwarded_ids,
82100 module_identifier,
83101 ) {
@@ -96,28 +114,54 @@ impl Task<TaskContext> for AddTask {
96114 return Ok ( vec ! [ ] ) ;
97115 }
98116
99- module_graph. add_module_graph_module ( * self . module_graph_module ) ;
117+ let module_build = match context. module_cache . restore ( module_identifier) ? {
118+ Some ( mut build_result) => {
119+ build_result. module . update_cache_module ( & mut module) ;
120+ ModuleBuild :: Cached ( build_result)
121+ }
122+ None => ModuleBuild :: Fresh ( module) ,
123+ } ;
124+
125+ context
126+ . artifact
127+ . module_graph
128+ . add_module_graph_module ( * module_graph_module) ;
100129
101130 context
102131 . exports_info_artifact
103132 . new_exports_info ( module_identifier) ;
104133
105134 set_resolved_module (
106- module_graph,
107- self . original_module_identifier ,
108- self . dependencies ,
135+ & mut context . artifact . module_graph ,
136+ original_module_identifier,
137+ dependencies,
109138 module_identifier,
110139 ) ?;
111140
112- tracing:: trace!( "Module added: {}" , self . module . identifier ( ) ) ;
141+ tracing:: trace!( "Module added: {module_identifier}" ) ;
113142 context
114143 . artifact
115144 . affected_modules
116145 . mark_as_add ( & module_identifier) ;
146+
147+ let module = match module_build {
148+ ModuleBuild :: Fresh ( module) => module,
149+ ModuleBuild :: Cached ( mut build_result) => {
150+ if !context. module_needs_build ( & mut build_result. module ) . await ? {
151+ return Ok ( vec ! [ Box :: new( BuildResultTask :: cached(
152+ build_result,
153+ context. plugin_driver. clone( ) ,
154+ forwarded_ids,
155+ ) ) ] ) ;
156+ }
157+ build_result. module
158+ }
159+ } ;
160+
117161 Ok ( vec ! [ Box :: new( BuildTask {
118162 compiler_id: context. compiler_id,
119163 compilation_id: context. compilation_id,
120- module: self . module ,
164+ module,
121165 resolver_factory: context. resolver_factory. clone( ) ,
122166 compiler_options: context. compiler_options. clone( ) ,
123167 loader_cache: context. cache. facade( "loader" ) ,
@@ -126,6 +170,7 @@ impl Task<TaskContext> for AddTask {
126170 runtime_template: context. runtime_template. create_module_code_template( ) ,
127171 fs: context. fs. clone( ) ,
128172 forwarded_ids,
173+ module_cache: context. module_cache. clone( ) ,
129174 } ) ] )
130175 }
131176}
0 commit comments