@@ -16,7 +16,6 @@ use paths::{AbsPath, AbsPathBuf};
1616use rustc_hash:: FxHashMap ;
1717use semver:: Version ;
1818use span:: { Edition , FileId } ;
19- use toolchain:: Tool ;
2019use tracing:: instrument;
2120use triomphe:: Arc ;
2221
@@ -26,10 +25,10 @@ use crate::{
2625 env:: { cargo_config_env, inject_cargo_env, inject_cargo_package_env, inject_rustc_tool_env} ,
2726 project_json:: { Crate , CrateArrayIdx } ,
2827 sysroot:: { SysrootCrate , SysrootWorkspace } ,
29- toolchain_info:: { rustc_cfg, target_data_layout, target_triple , QueryConfig } ,
30- utf8_stdout , CargoConfig , CargoWorkspace , CfgOverrides , InvocationStrategy , ManifestPath ,
31- Package , ProjectJson , ProjectManifest , Sysroot , SysrootSourceWorkspaceConfig , TargetData ,
32- TargetKind , WorkspaceBuildScripts ,
28+ toolchain_info:: { rustc_cfg, target_data_layout, target_tuple , version , QueryConfig } ,
29+ CargoConfig , CargoWorkspace , CfgOverrides , InvocationStrategy , ManifestPath , Package ,
30+ ProjectJson , ProjectManifest , Sysroot , SysrootSourceWorkspaceConfig , TargetData , TargetKind ,
31+ WorkspaceBuildScripts ,
3332} ;
3433use tracing:: { debug, error, info} ;
3534
@@ -151,27 +150,6 @@ impl fmt::Debug for ProjectWorkspace {
151150 }
152151}
153152
154- fn get_toolchain_version (
155- current_dir : & AbsPath ,
156- sysroot : & Sysroot ,
157- tool : Tool ,
158- extra_env : & FxHashMap < String , String > ,
159- prefix : & str ,
160- ) -> Result < Option < Version > , anyhow:: Error > {
161- let cargo_version = utf8_stdout ( & mut {
162- let mut cmd = Sysroot :: tool ( sysroot, tool, current_dir) ;
163- cmd. envs ( extra_env) ;
164- cmd. arg ( "--version" ) ;
165- cmd
166- } )
167- . with_context ( || format ! ( "Failed to query rust toolchain version at {current_dir}, is your toolchain setup correctly?" ) ) ?;
168- anyhow:: Ok (
169- cargo_version
170- . get ( prefix. len ( ) ..)
171- . and_then ( |it| Version :: parse ( it. split_whitespace ( ) . next ( ) ?) . ok ( ) ) ,
172- )
173- }
174-
175153impl ProjectWorkspace {
176154 pub fn load (
177155 manifest : ProjectManifest ,
@@ -242,16 +220,35 @@ impl ProjectWorkspace {
242220 . ok_or_else ( || Some ( "Failed to discover rustc source for sysroot." . to_owned ( ) ) ) ,
243221 None => Err ( None ) ,
244222 } ;
245- let targets = target_triple:: get (
246- QueryConfig :: Cargo ( & sysroot, cargo_toml) ,
247- config. target . as_deref ( ) ,
223+
224+ tracing:: info!( workspace = %cargo_toml, src_root = ?sysroot. src_root( ) , root = ?sysroot. root( ) , "Using sysroot" ) ;
225+ let toolchain_config = QueryConfig :: Cargo ( & sysroot, cargo_toml) ;
226+ let targets =
227+ target_tuple:: get ( toolchain_config, config. target . as_deref ( ) , & config. extra_env )
228+ . unwrap_or_default ( ) ;
229+ let toolchain = version:: get ( toolchain_config, & config. extra_env )
230+ . inspect_err ( |e| {
231+ tracing:: error!( %e,
232+ "failed fetching toolchain version for {cargo_toml:?} workspace"
233+ )
234+ } )
235+ . ok ( )
236+ . flatten ( ) ;
237+ let rustc_cfg =
238+ rustc_cfg:: get ( toolchain_config, targets. first ( ) . map ( Deref :: deref) , & config. extra_env ) ;
239+ let cfg_overrides = config. cfg_overrides . clone ( ) ;
240+ let data_layout = target_data_layout:: get (
241+ toolchain_config,
242+ targets. first ( ) . map ( Deref :: deref) ,
248243 & config. extra_env ,
249- )
250- . unwrap_or_default ( ) ;
244+ ) ;
245+ if let Err ( e) = & data_layout {
246+ tracing:: error!( %e, "failed fetching data layout for {cargo_toml:?} workspace" ) ;
247+ }
251248 sysroot. load_workspace ( & SysrootSourceWorkspaceConfig :: CargoMetadata (
252249 sysroot_metadata_config ( & config. extra_env , & targets) ,
253250 ) ) ;
254- tracing :: info! ( workspace = %cargo_toml , src_root = ?sysroot . src_root ( ) , root = ?sysroot . root ( ) , "Using sysroot" ) ;
251+
255252 let rustc = rustc_dir. and_then ( |rustc_dir| {
256253 info ! ( workspace = %cargo_toml, rustc_dir = %rustc_dir, "Using rustc source" ) ;
257254 match CargoWorkspace :: fetch_metadata (
@@ -288,27 +285,7 @@ impl ProjectWorkspace {
288285 }
289286 }
290287 } ) ;
291- let toolchain = get_toolchain_version (
292- cargo_toml. parent ( ) ,
293- & sysroot,
294- Tool :: Cargo ,
295- & config. extra_env ,
296- "cargo " ,
297- ) ?;
298- let rustc_cfg = rustc_cfg:: get (
299- QueryConfig :: Cargo ( & sysroot, cargo_toml) ,
300- targets. first ( ) . map ( Deref :: deref) ,
301- & config. extra_env ,
302- ) ;
303- let cfg_overrides = config. cfg_overrides . clone ( ) ;
304- let data_layout = target_data_layout:: get (
305- QueryConfig :: Cargo ( & sysroot, cargo_toml) ,
306- targets. first ( ) . map ( Deref :: deref) ,
307- & config. extra_env ,
308- ) ;
309- if let Err ( e) = & data_layout {
310- tracing:: error!( %e, "failed fetching data layout for {cargo_toml:?} workspace" ) ;
311- }
288+
312289 let ( meta, error) = CargoWorkspace :: fetch_metadata (
313290 cargo_toml,
314291 cargo_toml. parent ( ) ,
@@ -329,6 +306,7 @@ impl ProjectWorkspace {
329306 } ) ?;
330307 let cargo_config_extra_env = cargo_config_env ( cargo_toml, & config. extra_env , & sysroot) ;
331308 let cargo = CargoWorkspace :: new ( meta, cargo_toml. clone ( ) , cargo_config_extra_env) ;
309+
332310 Ok ( ProjectWorkspace {
333311 kind : ProjectWorkspaceKind :: Cargo {
334312 cargo,
@@ -350,19 +328,7 @@ impl ProjectWorkspace {
350328 Sysroot :: new ( project_json. sysroot . clone ( ) , project_json. sysroot_src . clone ( ) ) ;
351329 sysroot. load_workspace ( & SysrootSourceWorkspaceConfig :: Stitched ) ;
352330 let query_config = QueryConfig :: Rustc ( & sysroot, project_json. path ( ) . as_ref ( ) ) ;
353- let toolchain = match get_toolchain_version (
354- project_json. path ( ) ,
355- & sysroot,
356- Tool :: Rustc ,
357- & config. extra_env ,
358- "rustc " ,
359- ) {
360- Ok ( it) => it,
361- Err ( e) => {
362- tracing:: error!( "{e}" ) ;
363- None
364- }
365- } ;
331+ let toolchain = version:: get ( query_config, & config. extra_env ) . ok ( ) . flatten ( ) ;
366332
367333 let target = config. target . as_deref ( ) ;
368334 let rustc_cfg = rustc_cfg:: get ( query_config, target, & config. extra_env ) ;
@@ -388,28 +354,15 @@ impl ProjectWorkspace {
388354 None => Sysroot :: empty ( ) ,
389355 } ;
390356
391- let toolchain =
392- match get_toolchain_version ( dir, & sysroot, Tool :: Rustc , & config. extra_env , "rustc " ) {
393- Ok ( it) => it,
394- Err ( e) => {
395- tracing:: error!( "{e}" ) ;
396- None
397- }
398- } ;
399-
400- let targets = target_triple:: get (
401- QueryConfig :: Cargo ( & sysroot, detached_file) ,
402- config. target . as_deref ( ) ,
403- & config. extra_env ,
404- )
405- . unwrap_or_default ( ) ;
406-
357+ let query_config = QueryConfig :: Cargo ( & sysroot, detached_file) ;
358+ let toolchain = version:: get ( query_config, & config. extra_env ) . ok ( ) . flatten ( ) ;
359+ let targets = target_tuple:: get ( query_config, config. target . as_deref ( ) , & config. extra_env )
360+ . unwrap_or_default ( ) ;
361+ let rustc_cfg = rustc_cfg:: get ( query_config, None , & config. extra_env ) ;
362+ let data_layout = target_data_layout:: get ( query_config, None , & config. extra_env ) ;
407363 sysroot. load_workspace ( & SysrootSourceWorkspaceConfig :: CargoMetadata (
408364 sysroot_metadata_config ( & config. extra_env , & targets) ,
409365 ) ) ;
410- let query_config = QueryConfig :: Rustc ( & sysroot, dir. as_ref ( ) ) ;
411- let rustc_cfg = rustc_cfg:: get ( query_config, None , & config. extra_env ) ;
412- let data_layout = target_data_layout:: get ( query_config, None , & config. extra_env ) ;
413366
414367 let cargo_script = CargoWorkspace :: fetch_metadata (
415368 detached_file,
0 commit comments