@@ -12,8 +12,8 @@ use proc_macro_api::ProcMacroClient;
1212use rustc_hash:: { FxHashMap , FxHashSet } ;
1313
1414use crate :: {
15- cargo_workspace, cfg_flag:: CfgFlag , utf8_stdout , CargoConfig , CargoWorkspace , ProjectJson ,
16- ProjectManifest , Sysroot , TargetKind ,
15+ cargo_workspace, cfg_flag:: CfgFlag , sysroot :: SysrootCrate , utf8_stdout , CargoConfig ,
16+ CargoWorkspace , ProjectJson , ProjectManifest , Sysroot , TargetKind ,
1717} ;
1818
1919/// `PackageRoot` describes a package root folder.
@@ -70,12 +70,8 @@ impl ProjectWorkspace {
7070 format ! ( "Failed to deserialize json file {}" , project_json. display( ) )
7171 } ) ?;
7272 let project_location = project_json. parent ( ) . unwrap ( ) . to_path_buf ( ) ;
73- let project = ProjectJson :: new ( & project_location, data) ;
74- let sysroot = match & project. sysroot_src {
75- Some ( path) => Some ( Sysroot :: load ( path) ?) ,
76- None => None ,
77- } ;
78- ProjectWorkspace :: Json { project, sysroot }
73+ let project_json = ProjectJson :: new ( & project_location, data) ;
74+ ProjectWorkspace :: load_inline ( project_json) ?
7975 }
8076 ProjectManifest :: CargoToml ( cargo_toml) => {
8177 let cargo_version = utf8_stdout ( {
@@ -150,43 +146,38 @@ impl ProjectWorkspace {
150146 } )
151147 } ) )
152148 . collect :: < Vec < _ > > ( ) ,
153- ProjectWorkspace :: Cargo { cargo, sysroot, rustc } => {
154- let roots = cargo
155- . packages ( )
156- . map ( |pkg| {
157- let is_member = cargo[ pkg] . is_member ;
158- let pkg_root = cargo[ pkg] . root ( ) . to_path_buf ( ) ;
159-
160- let mut include = vec ! [ pkg_root. clone( ) ] ;
161- include. extend ( cargo[ pkg] . out_dir . clone ( ) ) ;
162-
163- let mut exclude = vec ! [ pkg_root. join( ".git" ) ] ;
164- if is_member {
165- exclude. push ( pkg_root. join ( "target" ) ) ;
166- } else {
167- exclude. push ( pkg_root. join ( "tests" ) ) ;
168- exclude. push ( pkg_root. join ( "examples" ) ) ;
169- exclude. push ( pkg_root. join ( "benches" ) ) ;
170- }
171- PackageRoot { is_member, include, exclude }
172- } )
173- . chain ( sysroot. crates ( ) . map ( |krate| PackageRoot {
149+ ProjectWorkspace :: Cargo { cargo, sysroot, rustc } => cargo
150+ . packages ( )
151+ . map ( |pkg| {
152+ let is_member = cargo[ pkg] . is_member ;
153+ let pkg_root = cargo[ pkg] . root ( ) . to_path_buf ( ) ;
154+
155+ let mut include = vec ! [ pkg_root. clone( ) ] ;
156+ include. extend ( cargo[ pkg] . out_dir . clone ( ) ) ;
157+
158+ let mut exclude = vec ! [ pkg_root. join( ".git" ) ] ;
159+ if is_member {
160+ exclude. push ( pkg_root. join ( "target" ) ) ;
161+ } else {
162+ exclude. push ( pkg_root. join ( "tests" ) ) ;
163+ exclude. push ( pkg_root. join ( "examples" ) ) ;
164+ exclude. push ( pkg_root. join ( "benches" ) ) ;
165+ }
166+ PackageRoot { is_member, include, exclude }
167+ } )
168+ . chain ( sysroot. crates ( ) . map ( |krate| PackageRoot {
169+ is_member : false ,
170+ include : vec ! [ sysroot[ krate] . root_dir( ) . to_path_buf( ) ] ,
171+ exclude : Vec :: new ( ) ,
172+ } ) )
173+ . chain ( rustc. into_iter ( ) . flat_map ( |rustc| {
174+ rustc. packages ( ) . map ( move |krate| PackageRoot {
174175 is_member : false ,
175- include : vec ! [ sysroot [ krate] . root_dir ( ) . to_path_buf( ) ] ,
176+ include : vec ! [ rustc [ krate] . root ( ) . to_path_buf( ) ] ,
176177 exclude : Vec :: new ( ) ,
177- } ) ) ;
178- if let Some ( rustc_packages) = rustc {
179- roots
180- . chain ( rustc_packages. packages ( ) . map ( |krate| PackageRoot {
181- is_member : false ,
182- include : vec ! [ rustc_packages[ krate] . root( ) . to_path_buf( ) ] ,
183- exclude : Vec :: new ( ) ,
184- } ) )
185- . collect ( )
186- } else {
187- roots. collect ( )
188- }
189- }
178+ } )
179+ } ) )
180+ . collect ( ) ,
190181 }
191182 }
192183
@@ -258,18 +249,14 @@ impl ProjectWorkspace {
258249 if let Some ( & from) = crates. get ( & from) {
259250 if let Some ( ( public_deps, _proc_macro) ) = & sysroot_dps {
260251 for ( name, to) in public_deps. iter ( ) {
261- if let Err ( _) = crate_graph. add_dep ( from, name. clone ( ) , * to) {
262- log:: error!( "cyclic dependency on {} for {:?}" , name, from)
263- }
252+ add_dep ( & mut crate_graph, from, name. clone ( ) , * to)
264253 }
265254 }
266255
267256 for dep in & krate. deps {
268257 let to_crate_id = dep. crate_id ;
269258 if let Some ( & to) = crates. get ( & to_crate_id) {
270- if let Err ( _) = crate_graph. add_dep ( from, dep. name . clone ( ) , to) {
271- log:: error!( "cyclic dependency {:?} -> {:?}" , from, to) ;
272- }
259+ add_dep ( & mut crate_graph, from, dep. name . clone ( ) , to)
273260 }
274261 }
275262 }
@@ -308,16 +295,12 @@ impl ProjectWorkspace {
308295 }
309296 if cargo[ tgt] . is_proc_macro {
310297 if let Some ( proc_macro) = libproc_macro {
311- if let Err ( _) = crate_graph. add_dep (
298+ add_dep (
299+ & mut crate_graph,
312300 crate_id,
313301 CrateName :: new ( "proc_macro" ) . unwrap ( ) ,
314302 proc_macro,
315- ) {
316- log:: error!(
317- "cyclic dependency on proc_macro for {}" ,
318- & cargo[ pkg] . name
319- )
320- }
303+ ) ;
321304 }
322305 }
323306
@@ -332,21 +315,12 @@ impl ProjectWorkspace {
332315 // cargo metadata does not do any normalization,
333316 // so we do it ourselves currently
334317 let name = CrateName :: normalize_dashes ( & name) ;
335- if to != from && crate_graph. add_dep ( from, name, to) . is_err ( ) {
336- log:: error!(
337- "cyclic dependency between targets of {}" ,
338- & cargo[ pkg] . name
339- )
318+ if to != from {
319+ add_dep ( & mut crate_graph, from, name, to) ;
340320 }
341321 }
342322 for ( name, krate) in public_deps. iter ( ) {
343- if let Err ( _) = crate_graph. add_dep ( from, name. clone ( ) , * krate) {
344- log:: error!(
345- "cyclic dependency on {} for {}" ,
346- name,
347- & cargo[ pkg] . name
348- )
349- }
323+ add_dep ( & mut crate_graph, from, name. clone ( ) , * krate) ;
350324 }
351325 }
352326 }
@@ -358,13 +332,7 @@ impl ProjectWorkspace {
358332 let name = CrateName :: new ( & dep. name ) . unwrap ( ) ;
359333 if let Some ( & to) = pkg_to_lib_crate. get ( & dep. pkg ) {
360334 for & from in pkg_crates. get ( & pkg) . into_iter ( ) . flatten ( ) {
361- if let Err ( _) = crate_graph. add_dep ( from, name. clone ( ) , to) {
362- log:: error!(
363- "cyclic dependency {} -> {}" ,
364- & cargo[ pkg] . name,
365- & cargo[ dep. pkg] . name
366- )
367- }
335+ add_dep ( & mut crate_graph, from, name. clone ( ) , to)
368336 }
369337 }
370338 }
@@ -400,15 +368,7 @@ impl ProjectWorkspace {
400368 pkg_to_lib_crate. insert ( pkg, crate_id) ;
401369 // Add dependencies on the core / std / alloc for rustc
402370 for ( name, krate) in public_deps. iter ( ) {
403- if let Err ( _) =
404- crate_graph. add_dep ( crate_id, name. clone ( ) , * krate)
405- {
406- log:: error!(
407- "cyclic dependency on {} for {}" ,
408- name,
409- & cargo[ pkg] . name
410- )
411- }
371+ add_dep ( & mut crate_graph, crate_id, name. clone ( ) , * krate) ;
412372 }
413373 rustc_pkg_crates. entry ( pkg) . or_insert_with ( Vec :: new) . push ( crate_id) ;
414374 }
@@ -421,13 +381,7 @@ impl ProjectWorkspace {
421381 let name = CrateName :: new ( & dep. name ) . unwrap ( ) ;
422382 if let Some ( & to) = pkg_to_lib_crate. get ( & dep. pkg ) {
423383 for & from in rustc_pkg_crates. get ( & pkg) . into_iter ( ) . flatten ( ) {
424- if let Err ( _) = crate_graph. add_dep ( from, name. clone ( ) , to) {
425- log:: error!(
426- "cyclic dependency {} -> {}" ,
427- & rustc_workspace[ pkg] . name,
428- & rustc_workspace[ dep. pkg] . name
429- )
430- }
384+ add_dep ( & mut crate_graph, from, name. clone ( ) , to) ;
431385 }
432386 }
433387 }
@@ -443,13 +397,7 @@ impl ProjectWorkspace {
443397 continue ;
444398 }
445399 for & from in pkg_crates. get ( & pkg) . into_iter ( ) . flatten ( ) {
446- if let Err ( _) = crate_graph. add_dep ( from, name. clone ( ) , to) {
447- log:: error!(
448- "cyclic dependency {} -> {}" ,
449- & cargo[ pkg] . name,
450- & rustc_workspace[ dep] . name
451- )
452- }
400+ add_dep ( & mut crate_graph, from, name. clone ( ) , to) ;
453401 }
454402 }
455403 }
@@ -520,19 +468,18 @@ fn sysroot_to_crate_graph(
520468) -> ( Vec < ( CrateName , CrateId ) > , Option < CrateId > ) {
521469 let mut cfg_options = CfgOptions :: default ( ) ;
522470 cfg_options. extend ( get_rustc_cfg_options ( target) ) ;
523- let sysroot_crates: FxHashMap < _ , _ > = sysroot
471+ let sysroot_crates: FxHashMap < SysrootCrate , CrateId > = sysroot
524472 . crates ( )
525473 . filter_map ( |krate| {
526474 let file_id = load ( & sysroot[ krate] . root ) ?;
527475
528476 let env = Env :: default ( ) ;
529477 let proc_macro = vec ! [ ] ;
530- let name = CrateName :: new ( & sysroot[ krate] . name )
531- . expect ( "Sysroot crates' names do not contain dashes" ) ;
478+ let display_name = CrateDisplayName :: from_canonical_name ( sysroot[ krate] . name . clone ( ) ) ;
532479 let crate_id = crate_graph. add_crate_root (
533480 file_id,
534481 Edition :: Edition2018 ,
535- Some ( name . into ( ) ) ,
482+ Some ( display_name ) ,
536483 cfg_options. clone ( ) ,
537484 env,
538485 proc_macro,
@@ -545,9 +492,7 @@ fn sysroot_to_crate_graph(
545492 for & to in sysroot[ from] . deps . iter ( ) {
546493 let name = CrateName :: new ( & sysroot[ to] . name ) . unwrap ( ) ;
547494 if let ( Some ( & from) , Some ( & to) ) = ( sysroot_crates. get ( & from) , sysroot_crates. get ( & to) ) {
548- if let Err ( _) = crate_graph. add_dep ( from, name, to) {
549- log:: error!( "cyclic dependency between sysroot crates" )
550- }
495+ add_dep ( crate_graph, from, name, to) ;
551496 }
552497 }
553498 }
@@ -588,3 +533,9 @@ fn get_rustc_cfg_options(target: Option<&str>) -> Vec<CfgFlag> {
588533
589534 res
590535}
536+
537+ fn add_dep ( graph : & mut CrateGraph , from : CrateId , name : CrateName , to : CrateId ) {
538+ if let Err ( err) = graph. add_dep ( from, name, to) {
539+ log:: error!( "{}" , err)
540+ }
541+ }
0 commit comments