@@ -39,11 +39,18 @@ pub enum ProjectWorkspace {
3939impl fmt:: Debug for ProjectWorkspace {
4040 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
4141 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 ( ) ,
4547 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 ( )
4754 }
4855 }
4956 }
@@ -210,6 +217,13 @@ impl ProjectWorkspace {
210217 } )
211218 . collect :: < FxHashSet < _ > > ( )
212219 . 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+ } ) )
213227 . collect :: < Vec < _ > > ( ) ,
214228 ProjectWorkspace :: Cargo { cargo, sysroot } => cargo
215229 . packages ( )
@@ -272,6 +286,11 @@ impl ProjectWorkspace {
272286 let mut crate_graph = CrateGraph :: default ( ) ;
273287 match self {
274288 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+
275294 let mut cfg_cache: FxHashMap < Option < & str > , Vec < CfgFlag > > = FxHashMap :: default ( ) ;
276295 let crates: FxHashMap < _ , _ > = project
277296 . crates ( )
@@ -309,25 +328,33 @@ impl ProjectWorkspace {
309328 . collect ( ) ;
310329
311330 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+ }
319346 }
320347 }
321348 }
322349 }
323350 }
324351 ProjectWorkspace :: Cargo { cargo, sysroot } => {
352+ let ( public_deps, libproc_macro) =
353+ sysroot_to_crate_graph ( & mut crate_graph, sysroot, target, load) ;
354+
325355 let mut cfg_options = CfgOptions :: default ( ) ;
326356 cfg_options. extend ( get_rustc_cfg_options ( target) ) ;
327357
328- let ( public_deps, libproc_macro) =
329- sysroot_to_crate_graph ( & mut crate_graph, sysroot, & cfg_options, load) ;
330-
331358 let mut pkg_to_lib_crate = FxHashMap :: default ( ) ;
332359 let mut pkg_crates = FxHashMap :: default ( ) ;
333360
@@ -410,7 +437,11 @@ impl ProjectWorkspace {
410437 }
411438 for ( name, krate) in public_deps. iter ( ) {
412439 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+ )
414445 }
415446 }
416447 }
@@ -485,9 +516,11 @@ fn utf8_stdout(mut cmd: Command) -> Result<String> {
485516fn sysroot_to_crate_graph (
486517 crate_graph : & mut CrateGraph ,
487518 sysroot : & Sysroot ,
488- cfg_options : & CfgOptions ,
519+ target : Option < & str > ,
489520 load : & mut dyn FnMut ( & AbsPath ) -> Option < FileId > ,
490521) -> ( Vec < ( CrateName , CrateId ) > , Option < CrateId > ) {
522+ let mut cfg_options = CfgOptions :: default ( ) ;
523+ cfg_options. extend ( get_rustc_cfg_options ( target) ) ;
491524 let sysroot_crates: FxHashMap < _ , _ > = sysroot
492525 . crates ( )
493526 . filter_map ( |krate| {
0 commit comments