@@ -185,10 +185,12 @@ impl ProjectWorkspace {
185
185
let mut crate_graph = CrateGraph :: default ( ) ;
186
186
match self {
187
187
ProjectWorkspace :: Json { project } => {
188
- let mut crates = FxHashMap :: default ( ) ;
189
- for ( id, krate) in project. crates . iter ( ) . enumerate ( ) {
190
- let crate_id = json_project:: CrateId ( id) ;
191
- if let Some ( file_id) = load ( & krate. root_module ) {
188
+ let crates: FxHashMap < _ , _ > = project
189
+ . crates
190
+ . iter ( )
191
+ . enumerate ( )
192
+ . filter_map ( |( seq_index, krate) | {
193
+ let file_id = load ( & krate. root_module ) ?;
192
194
let edition = match krate. edition {
193
195
json_project:: Edition :: Edition2015 => Edition :: Edition2015 ,
194
196
json_project:: Edition :: Edition2018 => Edition :: Edition2018 ,
@@ -218,8 +220,8 @@ impl ProjectWorkspace {
218
220
. clone ( )
219
221
. map ( |it| proc_macro_client. by_dylib_path ( & it) ) ;
220
222
// FIXME: No crate name in json definition such that we cannot add OUT_DIR to env
221
- crates . insert (
222
- crate_id ,
223
+ Some ( (
224
+ json_project :: CrateId ( seq_index ) ,
223
225
crate_graph. add_crate_root (
224
226
file_id,
225
227
edition,
@@ -230,9 +232,9 @@ impl ProjectWorkspace {
230
232
extern_source,
231
233
proc_macro. unwrap_or_default ( ) ,
232
234
) ,
233
- ) ;
234
- }
235
- }
235
+ ) )
236
+ } )
237
+ . collect ( ) ;
236
238
237
239
for ( id, krate) in project. crates . iter ( ) . enumerate ( ) {
238
240
for dep in & krate. deps {
@@ -256,9 +258,11 @@ impl ProjectWorkspace {
256
258
}
257
259
}
258
260
ProjectWorkspace :: Cargo { cargo, sysroot } => {
259
- let mut sysroot_crates = FxHashMap :: default ( ) ;
260
- for krate in sysroot. crates ( ) {
261
- if let Some ( file_id) = load ( & sysroot[ krate] . root ) {
261
+ let sysroot_crates: FxHashMap < _ , _ > = sysroot
262
+ . crates ( )
263
+ . filter_map ( |krate| {
264
+ let file_id = load ( & sysroot[ krate] . root ) ?;
265
+
262
266
// Crates from sysroot have `cfg(test)` disabled
263
267
let cfg_options = {
264
268
let mut opts = default_cfg_options. clone ( ) ;
@@ -269,22 +273,22 @@ impl ProjectWorkspace {
269
273
let env = Env :: default ( ) ;
270
274
let extern_source = ExternSource :: default ( ) ;
271
275
let proc_macro = vec ! [ ] ;
276
+ let crate_name = CrateName :: new ( & sysroot[ krate] . name )
277
+ . expect ( "Sysroot crate names should not contain dashes" ) ;
272
278
273
279
let crate_id = crate_graph. add_crate_root (
274
280
file_id,
275
281
Edition :: Edition2018 ,
276
- Some (
277
- CrateName :: new ( & sysroot[ krate] . name )
278
- . expect ( "Sysroot crate names should not contain dashes" ) ,
279
- ) ,
282
+ Some ( crate_name) ,
280
283
cfg_options,
281
284
env,
282
285
extern_source,
283
286
proc_macro,
284
287
) ;
285
- sysroot_crates. insert ( krate, crate_id) ;
286
- }
287
- }
288
+ Some ( ( krate, crate_id) )
289
+ } )
290
+ . collect ( ) ;
291
+
288
292
for from in sysroot. crates ( ) {
289
293
for & to in sysroot[ from] . deps . iter ( ) {
290
294
let name = & sysroot[ to] . name ;
0 commit comments