@@ -305,8 +305,12 @@ impl ProjectWorkspace {
305305 & |_| ( ) ,
306306 ) {
307307 Ok ( ( meta, _error) ) => {
308- let workspace =
309- CargoWorkspace :: new ( meta, cargo_toml. clone ( ) , Env :: default ( ) ) ;
308+ let workspace = CargoWorkspace :: new (
309+ meta,
310+ cargo_toml. clone ( ) ,
311+ Env :: default ( ) ,
312+ false ,
313+ ) ;
310314 let build_scripts = WorkspaceBuildScripts :: rustc_crates (
311315 & workspace,
312316 workspace_dir,
@@ -321,8 +325,8 @@ impl ProjectWorkspace {
321325 "Failed to read Cargo metadata from rustc source at {rustc_dir}" ,
322326 ) ;
323327 Err ( Some ( format ! (
324- "Failed to read Cargo metadata from rustc source at {rustc_dir}: {e}"
325- ) ) )
328+ "Failed to read Cargo metadata from rustc source at {rustc_dir}: {e}"
329+ ) ) )
326330 }
327331 }
328332 } )
@@ -379,7 +383,7 @@ impl ProjectWorkspace {
379383 "Failed to read Cargo metadata from Cargo.toml file {cargo_toml}, {toolchain:?}" ,
380384 )
381385 } ) ?;
382- let cargo = CargoWorkspace :: new ( meta, cargo_toml. clone ( ) , cargo_config_extra_env) ;
386+ let cargo = CargoWorkspace :: new ( meta, cargo_toml. clone ( ) , cargo_config_extra_env, false ) ;
383387 if let Some ( loaded_sysroot) = loaded_sysroot {
384388 sysroot. set_workspace ( loaded_sysroot) ;
385389 }
@@ -515,7 +519,7 @@ impl ProjectWorkspace {
515519 let cargo_config_extra_env =
516520 cargo_config_env ( detached_file, & config. extra_env , & sysroot) ;
517521 (
518- CargoWorkspace :: new ( ws, detached_file. clone ( ) , cargo_config_extra_env) ,
522+ CargoWorkspace :: new ( ws, detached_file. clone ( ) , cargo_config_extra_env, false ) ,
519523 WorkspaceBuildScripts :: default ( ) ,
520524 error. map ( Arc :: new) ,
521525 )
@@ -866,6 +870,7 @@ impl ProjectWorkspace {
866870 extra_env,
867871 cfg_overrides,
868872 self . set_test ,
873+ false ,
869874 crate_ws_data,
870875 ) ,
871876 ProjectWorkspaceKind :: Cargo { cargo, rustc, build_scripts, error : _ } => {
@@ -968,6 +973,7 @@ fn project_json_to_crate_graph(
968973 extra_env : & FxHashMap < String , String > ,
969974 override_cfg : & CfgOverrides ,
970975 set_test : bool ,
976+ is_sysroot : bool ,
971977 crate_ws_data : Arc < CrateWorkspaceData > ,
972978) -> ( CrateGraphBuilder , ProcMacroPaths ) {
973979 let mut res = ( CrateGraphBuilder :: default ( ) , ProcMacroPaths :: default ( ) ) ;
@@ -1023,7 +1029,7 @@ fn project_json_to_crate_graph(
10231029 target_cfgs. iter ( ) . chain ( cfg. iter ( ) ) . cloned ( ) . collect ( ) ;
10241030
10251031 if * is_workspace_member {
1026- if set_test {
1032+ if set_test && !is_sysroot {
10271033 // Add test cfg for local crates
10281034 cfg_options. insert_atom ( sym:: test. clone ( ) ) ;
10291035 }
@@ -1049,9 +1055,13 @@ fn project_json_to_crate_graph(
10491055 None ,
10501056 env,
10511057 if let Some ( name) = display_name. clone ( ) {
1052- CrateOrigin :: Local {
1053- repo : repository. clone ( ) ,
1054- name : Some ( name. canonical_name ( ) . to_owned ( ) ) ,
1058+ if is_sysroot {
1059+ CrateOrigin :: Lang ( LangCrateOrigin :: from ( name. canonical_name ( ) . as_str ( ) ) )
1060+ } else {
1061+ CrateOrigin :: Local {
1062+ repo : repository. clone ( ) ,
1063+ name : Some ( name. canonical_name ( ) . to_owned ( ) ) ,
1064+ }
10551065 }
10561066 } else {
10571067 CrateOrigin :: Local { repo : None , name : None }
@@ -1119,7 +1129,6 @@ fn cargo_to_crate_graph(
11191129 sysroot,
11201130 rustc_cfg. clone ( ) ,
11211131 load,
1122- // FIXME: This looks incorrect but I don't think this causes problems.
11231132 crate_ws_data. clone ( ) ,
11241133 ) ;
11251134
@@ -1139,7 +1148,7 @@ fn cargo_to_crate_graph(
11391148 let mut cfg_options = cfg_options. clone ( ) ;
11401149
11411150 if cargo[ pkg] . is_local {
1142- if set_test {
1151+ if set_test && !cargo . is_sysroot ( ) {
11431152 // Add test cfg for local crates
11441153 cfg_options. insert_atom ( sym:: test. clone ( ) ) ;
11451154 }
@@ -1152,7 +1161,9 @@ fn cargo_to_crate_graph(
11521161
11531162 let mut lib_tgt = None ;
11541163 for & tgt in cargo[ pkg] . targets . iter ( ) {
1155- if !matches ! ( cargo[ tgt] . kind, TargetKind :: Lib { .. } ) && !cargo[ pkg] . is_member {
1164+ if !matches ! ( cargo[ tgt] . kind, TargetKind :: Lib { .. } )
1165+ && ( !cargo[ pkg] . is_member || cargo. is_sysroot ( ) )
1166+ {
11561167 // For non-workspace-members, Cargo does not resolve dev-dependencies, so we don't
11571168 // add any targets except the library target, since those will not work correctly if
11581169 // they use dev-dependencies.
@@ -1177,9 +1188,13 @@ fn cargo_to_crate_graph(
11771188 name,
11781189 kind,
11791190 if pkg_data. is_local {
1180- CrateOrigin :: Local {
1181- repo : pkg_data. repository . clone ( ) ,
1182- name : Some ( Symbol :: intern ( & pkg_data. name ) ) ,
1191+ if cargo. is_sysroot ( ) {
1192+ CrateOrigin :: Lang ( LangCrateOrigin :: from ( & * pkg_data. name ) )
1193+ } else {
1194+ CrateOrigin :: Local {
1195+ repo : pkg_data. repository . clone ( ) ,
1196+ name : Some ( Symbol :: intern ( & pkg_data. name ) ) ,
1197+ }
11831198 }
11841199 } else {
11851200 CrateOrigin :: Library {
@@ -1516,10 +1531,8 @@ fn add_target_crate_root(
15161531 env,
15171532 origin,
15181533 matches ! ( kind, TargetKind :: Lib { is_proc_macro: true } ) ,
1519- Some ( if pkg. is_member {
1520- cargo. workspace_root ( ) . to_path_buf ( )
1521- } else {
1522- pkg. manifest . parent ( ) . to_path_buf ( )
1534+ matches ! ( kind, TargetKind :: Lib { is_proc_macro: true } ) . then ( || {
1535+ if pkg. is_member { cargo. workspace_root ( ) } else { pkg. manifest . parent ( ) } . to_path_buf ( )
15231536 } ) ,
15241537 crate_ws_data,
15251538 ) ;
@@ -1561,16 +1574,8 @@ fn extend_crate_graph_with_sysroot(
15611574) -> ( SysrootPublicDeps , Option < CrateBuilderId > ) {
15621575 let mut pub_deps = vec ! [ ] ;
15631576 let mut libproc_macro = None ;
1564- let diff = CfgDiff :: new ( vec ! [ ] , vec ! [ CfgAtom :: Flag ( sym:: test. clone( ) ) ] ) ;
1565- for ( cid, c) in sysroot_crate_graph. iter_mut ( ) {
1566- // uninject `test` flag so `core` keeps working.
1567- Arc :: make_mut ( & mut c. cfg_options ) . apply_diff ( diff. clone ( ) ) ;
1568- // patch the origin
1569- if c. basic . origin . is_local ( ) {
1570- let lang_crate = LangCrateOrigin :: from (
1571- c. extra . display_name . as_ref ( ) . map_or ( "" , |it| it. canonical_name ( ) . as_str ( ) ) ,
1572- ) ;
1573- c. basic . origin = CrateOrigin :: Lang ( lang_crate) ;
1577+ for cid in sysroot_crate_graph. iter ( ) {
1578+ if let CrateOrigin :: Lang ( lang_crate) = sysroot_crate_graph[ cid] . basic . origin {
15741579 match lang_crate {
15751580 LangCrateOrigin :: Test
15761581 | LangCrateOrigin :: Alloc
@@ -1627,7 +1632,7 @@ fn sysroot_to_crate_graph(
16271632 let _p = tracing:: info_span!( "sysroot_to_crate_graph" ) . entered ( ) ;
16281633 match sysroot. workspace ( ) {
16291634 RustLibSrcWorkspace :: Workspace ( cargo) => {
1630- let ( cg , pm ) = cargo_to_crate_graph (
1635+ let ( sysroot_cg , sysroot_pm ) = cargo_to_crate_graph (
16311636 load,
16321637 None ,
16331638 cargo,
@@ -1639,7 +1644,7 @@ fn sysroot_to_crate_graph(
16391644 CfgAtom :: Flag ( sym:: debug_assertions. clone( ) ) ,
16401645 CfgAtom :: Flag ( sym:: miri. clone( ) ) ,
16411646 ] ,
1642- vec ! [ ] ,
1647+ vec ! [ CfgAtom :: Flag ( sym :: test . clone ( ) ) ] ,
16431648 ) ,
16441649 ..Default :: default ( )
16451650 } ,
@@ -1648,10 +1653,10 @@ fn sysroot_to_crate_graph(
16481653 crate_ws_data,
16491654 ) ;
16501655
1651- extend_crate_graph_with_sysroot ( crate_graph, cg , pm )
1656+ extend_crate_graph_with_sysroot ( crate_graph, sysroot_cg , sysroot_pm )
16521657 }
16531658 RustLibSrcWorkspace :: Json ( project_json) => {
1654- let ( cg , pm ) = project_json_to_crate_graph (
1659+ let ( sysroot_cg , sysroot_pm ) = project_json_to_crate_graph (
16551660 rustc_cfg,
16561661 load,
16571662 project_json,
@@ -1668,10 +1673,11 @@ fn sysroot_to_crate_graph(
16681673 ..Default :: default ( )
16691674 } ,
16701675 false ,
1676+ true ,
16711677 crate_ws_data,
16721678 ) ;
16731679
1674- extend_crate_graph_with_sysroot ( crate_graph, cg , pm )
1680+ extend_crate_graph_with_sysroot ( crate_graph, sysroot_cg , sysroot_pm )
16751681 }
16761682 RustLibSrcWorkspace :: Stitched ( stitched) => {
16771683 let cfg_options = Arc :: new ( {
0 commit comments