@@ -615,20 +615,27 @@ impl ProjectWorkspace {
615
615
build_scripts,
616
616
toolchain,
617
617
target_layout,
618
- } => cargo_to_crate_graph (
619
- load,
620
- rustc. as_ref ( ) . ok ( ) ,
621
- cargo,
622
- sysroot. as_ref ( ) . ok ( ) ,
623
- rustc_cfg. clone ( ) ,
624
- cfg_overrides,
625
- build_scripts,
626
- match target_layout. as_ref ( ) {
627
- Ok ( it) => Ok ( Arc :: from ( it. as_str ( ) ) ) ,
628
- Err ( it) => Err ( Arc :: from ( it. as_str ( ) ) ) ,
629
- } ,
630
- toolchain. as_ref ( ) . and_then ( |it| ReleaseChannel :: from_str ( it. pre . as_str ( ) ) ) ,
631
- ) ,
618
+ } => {
619
+ let mut res = ( CrateGraph :: default ( ) , ProcMacroPaths :: default ( ) ) ;
620
+ cargo_to_crate_graph (
621
+ & mut res. 0 ,
622
+ & mut res. 1 ,
623
+ load,
624
+ rustc. as_ref ( ) . ok ( ) ,
625
+ cargo,
626
+ sysroot. as_ref ( ) . ok ( ) ,
627
+ rustc_cfg. clone ( ) ,
628
+ cfg_overrides,
629
+ None ,
630
+ build_scripts,
631
+ match target_layout. as_ref ( ) {
632
+ Ok ( it) => Ok ( Arc :: from ( it. as_str ( ) ) ) ,
633
+ Err ( it) => Err ( Arc :: from ( it. as_str ( ) ) ) ,
634
+ } ,
635
+ toolchain. as_ref ( ) . and_then ( |it| ReleaseChannel :: from_str ( it. pre . as_str ( ) ) ) ,
636
+ ) ;
637
+ res
638
+ }
632
639
ProjectWorkspace :: DetachedFiles { files, sysroot, rustc_cfg } => {
633
640
detached_files_to_crate_graph (
634
641
rustc_cfg. clone ( ) ,
@@ -815,20 +822,21 @@ fn project_json_to_crate_graph(
815
822
}
816
823
817
824
fn cargo_to_crate_graph (
825
+ crate_graph : & mut CrateGraph ,
826
+ proc_macros : & mut ProcMacroPaths ,
818
827
load : & mut dyn FnMut ( & AbsPath ) -> Option < FileId > ,
819
828
rustc : Option < & ( CargoWorkspace , WorkspaceBuildScripts ) > ,
820
829
cargo : & CargoWorkspace ,
821
830
sysroot : Option < & Sysroot > ,
822
831
rustc_cfg : Vec < CfgFlag > ,
823
832
override_cfg : & CfgOverrides ,
833
+ // Don't compute cfg and use this if present
834
+ forced_cfg : Option < CfgOptions > ,
824
835
build_scripts : & WorkspaceBuildScripts ,
825
836
target_layout : TargetLayoutLoadResult ,
826
837
channel : Option < ReleaseChannel > ,
827
- ) -> ( CrateGraph , ProcMacroPaths ) {
838
+ ) {
828
839
let _p = profile:: span ( "cargo_to_crate_graph" ) ;
829
- let mut res = ( CrateGraph :: default ( ) , ProcMacroPaths :: default ( ) ) ;
830
- let crate_graph = & mut res. 0 ;
831
- let proc_macros = & mut res. 1 ;
832
840
let ( public_deps, libproc_macro) = match sysroot {
833
841
Some ( sysroot) => sysroot_to_crate_graph (
834
842
crate_graph,
@@ -858,7 +866,7 @@ fn cargo_to_crate_graph(
858
866
for pkg in cargo. packages ( ) {
859
867
has_private |= cargo[ pkg] . metadata . rustc_private ;
860
868
861
- let cfg_options = {
869
+ let cfg_options = forced_cfg . clone ( ) . unwrap_or_else ( || {
862
870
let mut cfg_options = cfg_options. clone ( ) ;
863
871
864
872
// Add test cfg for local crates
@@ -882,7 +890,7 @@ fn cargo_to_crate_graph(
882
890
cfg_options. apply_diff ( overrides. clone ( ) ) ;
883
891
} ;
884
892
cfg_options
885
- } ;
893
+ } ) ;
886
894
887
895
let mut lib_tgt = None ;
888
896
for & tgt in cargo[ pkg] . targets . iter ( ) {
@@ -989,7 +997,6 @@ fn cargo_to_crate_graph(
989
997
) ;
990
998
}
991
999
}
992
- res
993
1000
}
994
1001
995
1002
fn detached_files_to_crate_graph (
@@ -1280,31 +1287,74 @@ fn sysroot_to_crate_graph(
1280
1287
) -> ( SysrootPublicDeps , Option < CrateId > ) {
1281
1288
let _p = profile:: span ( "sysroot_to_crate_graph" ) ;
1282
1289
let mut cfg_options = CfgOptions :: default ( ) ;
1283
- cfg_options. extend ( rustc_cfg) ;
1284
- let sysroot_crates: FxHashMap < SysrootCrate , CrateId > = sysroot
1285
- . crates ( )
1286
- . filter_map ( |krate| {
1287
- let file_id = load ( & sysroot[ krate] . root ) ?;
1288
-
1289
- let env = Env :: default ( ) ;
1290
- let display_name = CrateDisplayName :: from_canonical_name ( sysroot[ krate] . name . clone ( ) ) ;
1291
- let crate_id = crate_graph. add_crate_root (
1292
- file_id,
1293
- Edition :: CURRENT ,
1294
- Some ( display_name) ,
1295
- None ,
1296
- cfg_options. clone ( ) ,
1297
- None ,
1298
- env,
1299
- false ,
1300
- CrateOrigin :: Lang ( LangCrateOrigin :: from ( & * sysroot[ krate] . name ) ) ,
1301
- target_layout. clone ( ) ,
1302
- channel,
1303
- ) ;
1304
- Some ( ( krate, crate_id) )
1305
- } )
1306
- . collect ( ) ;
1307
-
1290
+ cfg_options. extend ( rustc_cfg. clone ( ) ) ;
1291
+ let sysroot_crates: FxHashMap < SysrootCrate , CrateId > = if let Some ( cargo) =
1292
+ & sysroot. cargo_workspace
1293
+ {
1294
+ cargo_to_crate_graph (
1295
+ crate_graph,
1296
+ & mut Default :: default ( ) ,
1297
+ load,
1298
+ None ,
1299
+ cargo,
1300
+ None ,
1301
+ rustc_cfg,
1302
+ & CfgOverrides :: default ( ) ,
1303
+ Some ( cfg_options) ,
1304
+ & WorkspaceBuildScripts :: default ( ) ,
1305
+ target_layout,
1306
+ channel,
1307
+ ) ;
1308
+ for crate_name in [ "std" , "alloc" , "core" ] {
1309
+ let original = crate_graph
1310
+ . iter ( )
1311
+ . find ( |x| {
1312
+ crate_graph[ * x] . display_name . as_ref ( ) . map ( |x| x. canonical_name ( ) == crate_name) . unwrap_or ( false )
1313
+ } )
1314
+ . unwrap ( ) ;
1315
+ let fake_crate_name = format ! ( "rustc-std-workspace-{}" , crate_name) ;
1316
+ let fake = crate_graph
1317
+ . iter ( )
1318
+ . find ( |x| {
1319
+ crate_graph[ * x] . display_name . as_ref ( ) . map ( |x| x. canonical_name ( ) == fake_crate_name) . unwrap_or ( false )
1320
+ } )
1321
+ . unwrap ( ) ;
1322
+ crate_graph. remove_and_replace ( fake, original) . unwrap ( ) ;
1323
+ }
1324
+ sysroot
1325
+ . crates ( )
1326
+ . filter_map ( |krate| {
1327
+ let file_id = load ( & sysroot[ krate] . root ) ?;
1328
+ let crate_id = crate_graph. crate_id_for_crate_root ( file_id) ?;
1329
+ Some ( ( krate, crate_id) )
1330
+ } )
1331
+ . collect ( )
1332
+ } else {
1333
+ sysroot
1334
+ . crates ( )
1335
+ . filter_map ( |krate| {
1336
+ let file_id = load ( & sysroot[ krate] . root ) ?;
1337
+
1338
+ let env = Env :: default ( ) ;
1339
+ let display_name =
1340
+ CrateDisplayName :: from_canonical_name ( sysroot[ krate] . name . clone ( ) ) ;
1341
+ let crate_id = crate_graph. add_crate_root (
1342
+ file_id,
1343
+ Edition :: CURRENT ,
1344
+ Some ( display_name) ,
1345
+ None ,
1346
+ cfg_options. clone ( ) ,
1347
+ None ,
1348
+ env,
1349
+ false ,
1350
+ CrateOrigin :: Lang ( LangCrateOrigin :: from ( & * sysroot[ krate] . name ) ) ,
1351
+ target_layout. clone ( ) ,
1352
+ channel,
1353
+ ) ;
1354
+ Some ( ( krate, crate_id) )
1355
+ } )
1356
+ . collect ( )
1357
+ } ;
1308
1358
for from in sysroot. crates ( ) {
1309
1359
for & to in sysroot[ from] . deps . iter ( ) {
1310
1360
let name = CrateName :: new ( & sysroot[ to] . name ) . unwrap ( ) ;
0 commit comments