@@ -62,16 +62,16 @@ pub struct PackageRoot {
62
62
/// Is a member of the current workspace
63
63
is_member : bool ,
64
64
}
65
-
66
65
impl PackageRoot {
67
- pub fn new ( path : PathBuf , is_member : bool ) -> PackageRoot {
68
- PackageRoot { path, is_member }
66
+ pub fn new_member ( path : PathBuf ) -> PackageRoot {
67
+ Self { path, is_member : true }
69
68
}
70
-
71
- pub fn path ( & self ) -> & PathBuf {
69
+ pub fn new_non_member ( path : PathBuf ) -> PackageRoot {
70
+ Self { path, is_member : false }
71
+ }
72
+ pub fn path ( & self ) -> & Path {
72
73
& self . path
73
74
}
74
-
75
75
pub fn is_member ( & self ) -> bool {
76
76
self . is_member
77
77
}
@@ -130,70 +130,45 @@ impl ProjectWorkspace {
130
130
pub fn to_roots ( & self ) -> Vec < PackageRoot > {
131
131
match self {
132
132
ProjectWorkspace :: Json { project } => {
133
- let mut roots = Vec :: with_capacity ( project. roots . len ( ) ) ;
134
- for root in & project. roots {
135
- roots. push ( PackageRoot :: new ( root. path . clone ( ) , true ) ) ;
136
- }
137
- roots
138
- }
139
- ProjectWorkspace :: Cargo { cargo, sysroot } => {
140
- let mut roots = Vec :: with_capacity ( cargo. packages ( ) . len ( ) + sysroot. crates ( ) . len ( ) ) ;
141
- for pkg in cargo. packages ( ) {
142
- let root = cargo[ pkg] . root ( ) . to_path_buf ( ) ;
143
- let member = cargo[ pkg] . is_member ;
144
- roots. push ( PackageRoot :: new ( root, member) ) ;
145
- }
146
- for krate in sysroot. crates ( ) {
147
- roots. push ( PackageRoot :: new ( sysroot[ krate] . root_dir ( ) . to_path_buf ( ) , false ) )
148
- }
149
- roots
133
+ project. roots . iter ( ) . map ( |r| PackageRoot :: new_member ( r. path . clone ( ) ) ) . collect ( )
150
134
}
135
+ ProjectWorkspace :: Cargo { cargo, sysroot } => cargo
136
+ . packages ( )
137
+ . map ( |pkg| PackageRoot {
138
+ path : cargo[ pkg] . root ( ) . to_path_buf ( ) ,
139
+ is_member : cargo[ pkg] . is_member ,
140
+ } )
141
+ . chain ( sysroot. crates ( ) . map ( |krate| {
142
+ PackageRoot :: new_non_member ( sysroot[ krate] . root_dir ( ) . to_path_buf ( ) )
143
+ } ) )
144
+ . collect ( ) ,
151
145
}
152
146
}
153
147
154
148
pub fn out_dirs ( & self ) -> Vec < PathBuf > {
155
149
match self {
156
150
ProjectWorkspace :: Json { project } => {
157
- let mut out_dirs = Vec :: with_capacity ( project. crates . len ( ) ) ;
158
- for krate in & project. crates {
159
- if let Some ( out_dir) = & krate. out_dir {
160
- out_dirs. push ( out_dir. to_path_buf ( ) ) ;
161
- }
162
- }
163
- out_dirs
151
+ project. crates . iter ( ) . filter_map ( |krate| krate. out_dir . as_ref ( ) ) . cloned ( ) . collect ( )
164
152
}
165
- ProjectWorkspace :: Cargo { cargo, sysroot : _sysroot } => {
166
- let mut out_dirs = Vec :: with_capacity ( cargo. packages ( ) . len ( ) ) ;
167
- for pkg in cargo. packages ( ) {
168
- if let Some ( out_dir) = & cargo[ pkg] . out_dir {
169
- out_dirs. push ( out_dir. to_path_buf ( ) ) ;
170
- }
171
- }
172
- out_dirs
153
+ ProjectWorkspace :: Cargo { cargo, sysroot : _ } => {
154
+ cargo. packages ( ) . filter_map ( |pkg| cargo[ pkg] . out_dir . as_ref ( ) ) . cloned ( ) . collect ( )
173
155
}
174
156
}
175
157
}
176
158
177
159
pub fn proc_macro_dylib_paths ( & self ) -> Vec < PathBuf > {
178
160
match self {
179
- ProjectWorkspace :: Json { project } => {
180
- let mut proc_macro_dylib_paths = Vec :: with_capacity ( project. crates . len ( ) ) ;
181
- for krate in & project. crates {
182
- if let Some ( out_dir) = & krate. proc_macro_dylib_path {
183
- proc_macro_dylib_paths. push ( out_dir. to_path_buf ( ) ) ;
184
- }
185
- }
186
- proc_macro_dylib_paths
187
- }
188
- ProjectWorkspace :: Cargo { cargo, sysroot : _sysroot } => {
189
- let mut proc_macro_dylib_paths = Vec :: with_capacity ( cargo. packages ( ) . len ( ) ) ;
190
- for pkg in cargo. packages ( ) {
191
- if let Some ( dylib_path) = & cargo[ pkg] . proc_macro_dylib_path {
192
- proc_macro_dylib_paths. push ( dylib_path. to_path_buf ( ) ) ;
193
- }
194
- }
195
- proc_macro_dylib_paths
196
- }
161
+ ProjectWorkspace :: Json { project } => project
162
+ . crates
163
+ . iter ( )
164
+ . filter_map ( |krate| krate. proc_macro_dylib_path . as_ref ( ) )
165
+ . cloned ( )
166
+ . collect ( ) ,
167
+ ProjectWorkspace :: Cargo { cargo, sysroot : _sysroot } => cargo
168
+ . packages ( )
169
+ . filter_map ( |pkg| cargo[ pkg] . proc_macro_dylib_path . as_ref ( ) )
170
+ . cloned ( )
171
+ . collect ( ) ,
197
172
}
198
173
}
199
174
@@ -216,10 +191,12 @@ impl ProjectWorkspace {
216
191
let mut crate_graph = CrateGraph :: default ( ) ;
217
192
match self {
218
193
ProjectWorkspace :: Json { project } => {
219
- let mut crates = FxHashMap :: default ( ) ;
220
- for ( id, krate) in project. crates . iter ( ) . enumerate ( ) {
221
- let crate_id = json_project:: CrateId ( id) ;
222
- if let Some ( file_id) = load ( & krate. root_module ) {
194
+ let crates: FxHashMap < _ , _ > = project
195
+ . crates
196
+ . iter ( )
197
+ . enumerate ( )
198
+ . filter_map ( |( seq_index, krate) | {
199
+ let file_id = load ( & krate. root_module ) ?;
223
200
let edition = match krate. edition {
224
201
json_project:: Edition :: Edition2015 => Edition :: Edition2015 ,
225
202
json_project:: Edition :: Edition2018 => Edition :: Edition2018 ,
@@ -249,8 +226,8 @@ impl ProjectWorkspace {
249
226
. clone ( )
250
227
. map ( |it| proc_macro_client. by_dylib_path ( & it) ) ;
251
228
// FIXME: No crate name in json definition such that we cannot add OUT_DIR to env
252
- crates . insert (
253
- crate_id ,
229
+ Some ( (
230
+ json_project :: CrateId ( seq_index ) ,
254
231
crate_graph. add_crate_root (
255
232
file_id,
256
233
edition,
@@ -261,9 +238,9 @@ impl ProjectWorkspace {
261
238
extern_source,
262
239
proc_macro. unwrap_or_default ( ) ,
263
240
) ,
264
- ) ;
265
- }
266
- }
241
+ ) )
242
+ } )
243
+ . collect ( ) ;
267
244
268
245
for ( id, krate) in project. crates . iter ( ) . enumerate ( ) {
269
246
for dep in & krate. deps {
@@ -287,9 +264,11 @@ impl ProjectWorkspace {
287
264
}
288
265
}
289
266
ProjectWorkspace :: Cargo { cargo, sysroot } => {
290
- let mut sysroot_crates = FxHashMap :: default ( ) ;
291
- for krate in sysroot. crates ( ) {
292
- if let Some ( file_id) = load ( & sysroot[ krate] . root ) {
267
+ let sysroot_crates: FxHashMap < _ , _ > = sysroot
268
+ . crates ( )
269
+ . filter_map ( |krate| {
270
+ let file_id = load ( & sysroot[ krate] . root ) ?;
271
+
293
272
// Crates from sysroot have `cfg(test)` disabled
294
273
let cfg_options = {
295
274
let mut opts = default_cfg_options. clone ( ) ;
@@ -300,22 +279,22 @@ impl ProjectWorkspace {
300
279
let env = Env :: default ( ) ;
301
280
let extern_source = ExternSource :: default ( ) ;
302
281
let proc_macro = vec ! [ ] ;
282
+ let crate_name = CrateName :: new ( & sysroot[ krate] . name )
283
+ . expect ( "Sysroot crate names should not contain dashes" ) ;
303
284
304
285
let crate_id = crate_graph. add_crate_root (
305
286
file_id,
306
287
Edition :: Edition2018 ,
307
- Some (
308
- CrateName :: new ( & sysroot[ krate] . name )
309
- . expect ( "Sysroot crate names should not contain dashes" ) ,
310
- ) ,
288
+ Some ( crate_name) ,
311
289
cfg_options,
312
290
env,
313
291
extern_source,
314
292
proc_macro,
315
293
) ;
316
- sysroot_crates. insert ( krate, crate_id) ;
317
- }
318
- }
294
+ Some ( ( krate, crate_id) )
295
+ } )
296
+ . collect ( ) ;
297
+
319
298
for from in sysroot. crates ( ) {
320
299
for & to in sysroot[ from] . deps . iter ( ) {
321
300
let name = & sysroot[ to] . name ;
0 commit comments