@@ -39,11 +39,18 @@ pub enum ProjectWorkspace {
39
39
impl fmt:: Debug for ProjectWorkspace {
40
40
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
41
41
match self {
42
- ProjectWorkspace :: Cargo { cargo, .. } => {
43
- f. debug_struct ( "Cargo" ) . field ( "n_packages" , & cargo. packages ( ) . len ( ) ) . finish ( )
44
- }
42
+ ProjectWorkspace :: Cargo { cargo, sysroot } => f
43
+ . debug_struct ( "Cargo" )
44
+ . field ( "n_packages" , & cargo. packages ( ) . len ( ) )
45
+ . field ( "n_sysroot_crates" , & sysroot. crates ( ) . len ( ) )
46
+ . finish ( ) ,
45
47
ProjectWorkspace :: Json { project } => {
46
- f. debug_struct ( "Json" ) . field ( "n_crates" , & project. n_crates ( ) ) . finish ( )
48
+ let mut debug_struct = f. debug_struct ( "Json" ) ;
49
+ debug_struct. field ( "n_crates" , & project. n_crates ( ) ) ;
50
+ if let Some ( sysroot) = & project. sysroot {
51
+ debug_struct. field ( "n_sysroot_crates" , & sysroot. crates ( ) . len ( ) ) ;
52
+ }
53
+ debug_struct. finish ( )
47
54
}
48
55
}
49
56
}
@@ -210,6 +217,13 @@ impl ProjectWorkspace {
210
217
} )
211
218
. collect :: < FxHashSet < _ > > ( )
212
219
. into_iter ( )
220
+ . chain ( project. sysroot . as_ref ( ) . into_iter ( ) . flat_map ( |sysroot| {
221
+ sysroot. crates ( ) . map ( move |krate| PackageRoot {
222
+ is_member : false ,
223
+ include : vec ! [ sysroot[ krate] . root_dir( ) . to_path_buf( ) ] ,
224
+ exclude : Vec :: new ( ) ,
225
+ } )
226
+ } ) )
213
227
. collect :: < Vec < _ > > ( ) ,
214
228
ProjectWorkspace :: Cargo { cargo, sysroot } => cargo
215
229
. packages ( )
@@ -272,6 +286,11 @@ impl ProjectWorkspace {
272
286
let mut crate_graph = CrateGraph :: default ( ) ;
273
287
match self {
274
288
ProjectWorkspace :: Json { project } => {
289
+ let sysroot_dps = project
290
+ . sysroot
291
+ . as_ref ( )
292
+ . map ( |sysroot| sysroot_to_crate_graph ( & mut crate_graph, sysroot, target, load) ) ;
293
+
275
294
let mut cfg_cache: FxHashMap < Option < & str > , Vec < CfgFlag > > = FxHashMap :: default ( ) ;
276
295
let crates: FxHashMap < _ , _ > = project
277
296
. crates ( )
@@ -309,25 +328,33 @@ impl ProjectWorkspace {
309
328
. collect ( ) ;
310
329
311
330
for ( from, krate) in project. crates ( ) {
312
- for dep in & krate. deps {
313
- let to_crate_id = dep. crate_id ;
314
- if let ( Some ( & from) , Some ( & to) ) =
315
- ( crates. get ( & from) , crates. get ( & to_crate_id) )
316
- {
317
- if let Err ( _) = crate_graph. add_dep ( from, dep. name . clone ( ) , to) {
318
- log:: error!( "cyclic dependency {:?} -> {:?}" , from, to_crate_id) ;
331
+ if let Some ( & from) = crates. get ( & from) {
332
+ if let Some ( ( public_deps, _proc_macro) ) = & sysroot_dps {
333
+ for ( name, to) in public_deps. iter ( ) {
334
+ if let Err ( _) = crate_graph. add_dep ( from, name. clone ( ) , * to) {
335
+ log:: error!( "cyclic dependency on {} for {:?}" , name, from)
336
+ }
337
+ }
338
+ }
339
+
340
+ for dep in & krate. deps {
341
+ let to_crate_id = dep. crate_id ;
342
+ if let Some ( & to) = crates. get ( & to_crate_id) {
343
+ if let Err ( _) = crate_graph. add_dep ( from, dep. name . clone ( ) , to) {
344
+ log:: error!( "cyclic dependency {:?} -> {:?}" , from, to) ;
345
+ }
319
346
}
320
347
}
321
348
}
322
349
}
323
350
}
324
351
ProjectWorkspace :: Cargo { cargo, sysroot } => {
352
+ let ( public_deps, libproc_macro) =
353
+ sysroot_to_crate_graph ( & mut crate_graph, sysroot, target, load) ;
354
+
325
355
let mut cfg_options = CfgOptions :: default ( ) ;
326
356
cfg_options. extend ( get_rustc_cfg_options ( target) ) ;
327
357
328
- let ( public_deps, libproc_macro) =
329
- sysroot_to_crate_graph ( & mut crate_graph, sysroot, & cfg_options, load) ;
330
-
331
358
let mut pkg_to_lib_crate = FxHashMap :: default ( ) ;
332
359
let mut pkg_crates = FxHashMap :: default ( ) ;
333
360
@@ -410,7 +437,11 @@ impl ProjectWorkspace {
410
437
}
411
438
for ( name, krate) in public_deps. iter ( ) {
412
439
if let Err ( _) = crate_graph. add_dep ( from, name. clone ( ) , * krate) {
413
- log:: error!( "cyclic dependency on core for {}" , & cargo[ pkg] . name)
440
+ log:: error!(
441
+ "cyclic dependency on {} for {}" ,
442
+ name,
443
+ & cargo[ pkg] . name
444
+ )
414
445
}
415
446
}
416
447
}
@@ -485,9 +516,11 @@ fn utf8_stdout(mut cmd: Command) -> Result<String> {
485
516
fn sysroot_to_crate_graph (
486
517
crate_graph : & mut CrateGraph ,
487
518
sysroot : & Sysroot ,
488
- cfg_options : & CfgOptions ,
519
+ target : Option < & str > ,
489
520
load : & mut dyn FnMut ( & AbsPath ) -> Option < FileId > ,
490
521
) -> ( Vec < ( CrateName , CrateId ) > , Option < CrateId > ) {
522
+ let mut cfg_options = CfgOptions :: default ( ) ;
523
+ cfg_options. extend ( get_rustc_cfg_options ( target) ) ;
491
524
let sysroot_crates: FxHashMap < _ , _ > = sysroot
492
525
. crates ( )
493
526
. filter_map ( |krate| {
0 commit comments