@@ -62,16 +62,16 @@ pub struct PackageRoot {
6262 /// Is a member of the current workspace
6363 is_member : bool ,
6464}
65-
6665impl 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 }
6968 }
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 {
7273 & self . path
7374 }
74-
7575 pub fn is_member ( & self ) -> bool {
7676 self . is_member
7777 }
@@ -130,70 +130,45 @@ impl ProjectWorkspace {
130130 pub fn to_roots ( & self ) -> Vec < PackageRoot > {
131131 match self {
132132 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 ( )
150134 }
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 ( ) ,
151145 }
152146 }
153147
154148 pub fn out_dirs ( & self ) -> Vec < PathBuf > {
155149 match self {
156150 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 ( )
164152 }
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 ( )
173155 }
174156 }
175157 }
176158
177159 pub fn proc_macro_dylib_paths ( & self ) -> Vec < PathBuf > {
178160 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 ( ) ,
197172 }
198173 }
199174
@@ -216,10 +191,12 @@ impl ProjectWorkspace {
216191 let mut crate_graph = CrateGraph :: default ( ) ;
217192 match self {
218193 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 ) ?;
223200 let edition = match krate. edition {
224201 json_project:: Edition :: Edition2015 => Edition :: Edition2015 ,
225202 json_project:: Edition :: Edition2018 => Edition :: Edition2018 ,
@@ -249,8 +226,8 @@ impl ProjectWorkspace {
249226 . clone ( )
250227 . map ( |it| proc_macro_client. by_dylib_path ( & it) ) ;
251228 // 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 ) ,
254231 crate_graph. add_crate_root (
255232 file_id,
256233 edition,
@@ -261,9 +238,9 @@ impl ProjectWorkspace {
261238 extern_source,
262239 proc_macro. unwrap_or_default ( ) ,
263240 ) ,
264- ) ;
265- }
266- }
241+ ) )
242+ } )
243+ . collect ( ) ;
267244
268245 for ( id, krate) in project. crates . iter ( ) . enumerate ( ) {
269246 for dep in & krate. deps {
@@ -287,9 +264,11 @@ impl ProjectWorkspace {
287264 }
288265 }
289266 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+
293272 // Crates from sysroot have `cfg(test)` disabled
294273 let cfg_options = {
295274 let mut opts = default_cfg_options. clone ( ) ;
@@ -300,22 +279,22 @@ impl ProjectWorkspace {
300279 let env = Env :: default ( ) ;
301280 let extern_source = ExternSource :: default ( ) ;
302281 let proc_macro = vec ! [ ] ;
282+ let crate_name = CrateName :: new ( & sysroot[ krate] . name )
283+ . expect ( "Sysroot crate names should not contain dashes" ) ;
303284
304285 let crate_id = crate_graph. add_crate_root (
305286 file_id,
306287 Edition :: Edition2018 ,
307- Some (
308- CrateName :: new ( & sysroot[ krate] . name )
309- . expect ( "Sysroot crate names should not contain dashes" ) ,
310- ) ,
288+ Some ( crate_name) ,
311289 cfg_options,
312290 env,
313291 extern_source,
314292 proc_macro,
315293 ) ;
316- sysroot_crates. insert ( krate, crate_id) ;
317- }
318- }
294+ Some ( ( krate, crate_id) )
295+ } )
296+ . collect ( ) ;
297+
319298 for from in sysroot. crates ( ) {
320299 for & to in sysroot[ from] . deps . iter ( ) {
321300 let name = & sysroot[ to] . name ;
0 commit comments