@@ -185,10 +185,12 @@ impl ProjectWorkspace {
185185 let mut crate_graph = CrateGraph :: default ( ) ;
186186 match self {
187187 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 ) ?;
192194 let edition = match krate. edition {
193195 json_project:: Edition :: Edition2015 => Edition :: Edition2015 ,
194196 json_project:: Edition :: Edition2018 => Edition :: Edition2018 ,
@@ -218,8 +220,8 @@ impl ProjectWorkspace {
218220 . clone ( )
219221 . map ( |it| proc_macro_client. by_dylib_path ( & it) ) ;
220222 // 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 ) ,
223225 crate_graph. add_crate_root (
224226 file_id,
225227 edition,
@@ -230,9 +232,9 @@ impl ProjectWorkspace {
230232 extern_source,
231233 proc_macro. unwrap_or_default ( ) ,
232234 ) ,
233- ) ;
234- }
235- }
235+ ) )
236+ } )
237+ . collect ( ) ;
236238
237239 for ( id, krate) in project. crates . iter ( ) . enumerate ( ) {
238240 for dep in & krate. deps {
@@ -256,9 +258,11 @@ impl ProjectWorkspace {
256258 }
257259 }
258260 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+
262266 // Crates from sysroot have `cfg(test)` disabled
263267 let cfg_options = {
264268 let mut opts = default_cfg_options. clone ( ) ;
@@ -269,22 +273,22 @@ impl ProjectWorkspace {
269273 let env = Env :: default ( ) ;
270274 let extern_source = ExternSource :: default ( ) ;
271275 let proc_macro = vec ! [ ] ;
276+ let crate_name = CrateName :: new ( & sysroot[ krate] . name )
277+ . expect ( "Sysroot crate names should not contain dashes" ) ;
272278
273279 let crate_id = crate_graph. add_crate_root (
274280 file_id,
275281 Edition :: Edition2018 ,
276- Some (
277- CrateName :: new ( & sysroot[ krate] . name )
278- . expect ( "Sysroot crate names should not contain dashes" ) ,
279- ) ,
282+ Some ( crate_name) ,
280283 cfg_options,
281284 env,
282285 extern_source,
283286 proc_macro,
284287 ) ;
285- sysroot_crates. insert ( krate, crate_id) ;
286- }
287- }
288+ Some ( ( krate, crate_id) )
289+ } )
290+ . collect ( ) ;
291+
288292 for from in sysroot. crates ( ) {
289293 for & to in sysroot[ from] . deps . iter ( ) {
290294 let name = & sysroot[ to] . name ;
0 commit comments