@@ -3,7 +3,7 @@ mod fix_build_meta;
3
3
mod fix_issuers;
4
4
mod has_module_graph_change;
5
5
6
- use rspack_collections:: IdentifierSet ;
6
+ use rspack_collections:: { IdentifierSet , UkeySet } ;
7
7
use rustc_hash:: FxHashSet as HashSet ;
8
8
9
9
use self :: {
@@ -27,33 +27,22 @@ impl Cutout {
27
27
artifact : & mut MakeArtifact ,
28
28
params : Vec < MakeParam > ,
29
29
) -> HashSet < BuildDependency > {
30
- let mut entry_dependencies = std:: mem:: take ( & mut artifact. entry_dependencies ) ;
30
+ let mut next_entry_dependencies = HashSet :: default ( ) ;
31
+ let mut clean_entry_dependencies = false ;
32
+ let mut useless_entry_dependencies = UkeySet :: default ( ) ;
31
33
let mut force_build_modules = IdentifierSet :: default ( ) ;
32
34
let mut force_build_deps = HashSet :: default ( ) ;
33
- let mut remove_entry_deps = HashSet :: default ( ) ;
34
35
35
36
let module_graph = artifact. get_module_graph ( ) ;
36
37
37
38
for item in params {
38
39
match item {
39
40
MakeParam :: BuildEntry ( deps) => {
40
- for dep_id in deps {
41
- if !entry_dependencies. contains ( & dep_id) {
42
- force_build_deps. insert ( ( dep_id, None ) ) ;
43
- entry_dependencies. insert ( dep_id) ;
44
- }
45
- }
41
+ next_entry_dependencies = deps;
46
42
}
47
43
MakeParam :: BuildEntryAndClean ( deps) => {
48
- remove_entry_deps. extend ( std:: mem:: take ( & mut entry_dependencies) ) ;
49
- entry_dependencies = deps;
50
- for dep_id in & entry_dependencies {
51
- if remove_entry_deps. contains ( dep_id) {
52
- remove_entry_deps. remove ( dep_id) ;
53
- } else {
54
- force_build_deps. insert ( ( * dep_id, None ) ) ;
55
- }
56
- }
44
+ next_entry_dependencies = deps;
45
+ clean_entry_dependencies = true ;
57
46
}
58
47
MakeParam :: CheckNeedBuild => {
59
48
force_build_modules. extend ( module_graph. modules ( ) . values ( ) . filter_map ( |module| {
@@ -65,32 +54,30 @@ impl Cutout {
65
54
} ) ) ;
66
55
}
67
56
MakeParam :: ModifiedFiles ( files) => {
68
- force_build_modules . extend ( module_graph. modules ( ) . values ( ) . filter_map ( |module| {
57
+ for module in module_graph. modules ( ) . values ( ) {
69
58
// check has dependencies modified
70
59
if module. depends_on ( & files) {
71
- Some ( module. identifier ( ) )
72
- } else {
73
- None
60
+ // add module id
61
+ force_build_modules. insert ( module. identifier ( ) ) ;
74
62
}
75
- } ) )
63
+ }
76
64
}
77
65
MakeParam :: RemovedFiles ( files) => {
78
- force_build_modules. extend ( module_graph. modules ( ) . values ( ) . flat_map ( |module| {
79
- let mut res = vec ! [ ] ;
80
-
66
+ for module in module_graph. modules ( ) . values ( ) {
81
67
// check has dependencies modified
82
68
if module. depends_on ( & files) {
83
69
// add module id
84
- res. push ( module. identifier ( ) ) ;
85
- // add parent module id
86
- res. extend (
87
- module_graph
88
- . get_incoming_connections ( & module. identifier ( ) )
89
- . filter_map ( |connect| connect. original_module_identifier ) ,
90
- )
70
+ force_build_modules. insert ( module. identifier ( ) ) ;
71
+ // process parent module id
72
+ for connect in module_graph. get_incoming_connections ( & module. identifier ( ) ) {
73
+ if let Some ( original_module_identifier) = connect. original_module_identifier {
74
+ force_build_modules. insert ( original_module_identifier) ;
75
+ } else {
76
+ useless_entry_dependencies. insert ( connect. dependency_id ) ;
77
+ }
78
+ }
91
79
}
92
- res
93
- } ) )
80
+ }
94
81
}
95
82
MakeParam :: ForceBuildDeps ( deps) => {
96
83
for item in deps {
@@ -128,23 +115,55 @@ impl Cutout {
128
115
force_build_deps. extend ( artifact. revoke_module ( & id) ) ;
129
116
}
130
117
118
+ let mut entry_dependencies = std:: mem:: take ( & mut artifact. entry_dependencies ) ;
131
119
let mut module_graph = artifact. get_module_graph_mut ( ) ;
132
- for dep_id in remove_entry_deps {
120
+ // remove useless entry dependencies
121
+ let mut remove_entry_dependencies = HashSet :: default ( ) ;
122
+ for dep_id in useless_entry_dependencies {
123
+ if !next_entry_dependencies. contains ( & dep_id) {
124
+ remove_entry_dependencies. insert ( dep_id) ;
125
+ }
126
+ }
127
+ if clean_entry_dependencies {
128
+ remove_entry_dependencies. extend ( entry_dependencies. difference ( & next_entry_dependencies) ) ;
129
+ }
130
+ for dep_id in remove_entry_dependencies {
133
131
// connection may have been deleted by revoke module
134
132
if let Some ( con) = module_graph. connection_by_dependency_id ( & dep_id) {
133
+ // need clean_isolated_module to check whether the module is still used by other deps
135
134
self
136
135
. clean_isolated_module
137
136
. add_need_check_module ( * con. module_identifier ( ) ) ;
138
- module_graph. revoke_connection ( & dep_id, true ) ;
139
137
}
140
- force_build_deps. remove ( & ( dep_id, None ) ) ;
138
+ module_graph. revoke_dependency ( & dep_id, true ) ;
139
+ entry_dependencies. remove ( & dep_id) ;
140
+ }
141
+
142
+ // add entry dependencies
143
+ for dep in next_entry_dependencies
144
+ . difference ( & entry_dependencies)
145
+ . copied ( )
146
+ . collect :: < Vec < _ > > ( )
147
+ {
148
+ force_build_deps. insert ( ( dep, None ) ) ;
149
+ entry_dependencies. insert ( dep) ;
141
150
}
142
151
143
152
artifact. entry_dependencies = entry_dependencies;
144
153
145
154
self . has_module_graph_change . analyze_artifact ( artifact) ;
146
155
156
+ // only return available force_build_deps
157
+ let module_graph = artifact. get_module_graph ( ) ;
147
158
force_build_deps
159
+ . into_iter ( )
160
+ . filter ( |( dep_id, _) | {
161
+ let Some ( dep) = module_graph. dependency_by_id ( dep_id) else {
162
+ return false ;
163
+ } ;
164
+ dep. as_module_dependency ( ) . is_some ( ) || dep. as_context_dependency ( ) . is_some ( )
165
+ } )
166
+ . collect ( )
148
167
}
149
168
150
169
pub fn fix_artifact ( self , artifact : & mut MakeArtifact ) {
2 commit comments
github-actions[bot] commentedon Feb 9, 2025
📝 Benchmark detail: Open
github-actions[bot] commentedon Feb 9, 2025
📝 Ecosystem CI detail: Open