@@ -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,9 +25,9 @@ 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 , SysrootMode } ,
29- toolchain_info:: { rustc_cfg, target_data_layout, target_tuple, QueryConfig } ,
30- utf8_stdout , CargoConfig , CargoWorkspace , CfgOverrides , InvocationStrategy , ManifestPath ,
31- Package , ProjectJson , ProjectManifest , Sysroot , TargetData , 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 , TargetData , TargetKind , WorkspaceBuildScripts ,
3231} ;
3332use tracing:: { debug, error, info} ;
3433
@@ -150,27 +149,6 @@ impl fmt::Debug for ProjectWorkspace {
150149 }
151150}
152151
153- fn get_toolchain_version (
154- current_dir : & AbsPath ,
155- sysroot : & Sysroot ,
156- tool : Tool ,
157- extra_env : & FxHashMap < String , String > ,
158- prefix : & str ,
159- ) -> Result < Option < Version > , anyhow:: Error > {
160- let cargo_version = utf8_stdout ( & mut {
161- let mut cmd = Sysroot :: tool ( sysroot, tool, current_dir) ;
162- cmd. envs ( extra_env) ;
163- cmd. arg ( "--version" ) ;
164- cmd
165- } )
166- . with_context ( || format ! ( "Failed to query rust toolchain version at {current_dir}, is your toolchain setup correctly?" ) ) ?;
167- anyhow:: Ok (
168- cargo_version
169- . get ( prefix. len ( ) ..)
170- . and_then ( |it| Version :: parse ( it. split_whitespace ( ) . next ( ) ?) . ok ( ) ) ,
171- )
172- }
173-
174152impl ProjectWorkspace {
175153 pub fn load (
176154 manifest : ProjectManifest ,
@@ -249,12 +227,10 @@ impl ProjectWorkspace {
249227 . ok_or_else ( || Some ( "Failed to discover rustc source for sysroot." . to_owned ( ) ) ) ,
250228 None => Err ( None ) ,
251229 } ;
252- let targets = target_tuple:: get (
253- QueryConfig :: Cargo ( & sysroot, cargo_toml) ,
254- config. target . as_deref ( ) ,
255- & config. extra_env ,
256- )
257- . unwrap_or_default ( ) ;
230+ let toolchain_config = QueryConfig :: Cargo ( & sysroot, cargo_toml) ;
231+ let targets =
232+ target_tuple:: get ( toolchain_config, config. target . as_deref ( ) , & config. extra_env )
233+ . unwrap_or_default ( ) ;
258234 let rustc = rustc_dir. and_then ( |rustc_dir| {
259235 info ! ( workspace = %cargo_toml, rustc_dir = %rustc_dir, "Using rustc source" ) ;
260236 match CargoWorkspace :: fetch_metadata (
@@ -291,21 +267,19 @@ impl ProjectWorkspace {
291267 }
292268 }
293269 } ) ;
294- let toolchain = get_toolchain_version (
295- cargo_toml. parent ( ) ,
296- & sysroot,
297- Tool :: Cargo ,
298- & config. extra_env ,
299- "cargo " ,
300- ) ?;
301- let rustc_cfg = rustc_cfg:: get (
302- QueryConfig :: Cargo ( & sysroot, cargo_toml) ,
303- targets. first ( ) . map ( Deref :: deref) ,
304- & config. extra_env ,
305- ) ;
270+ let toolchain = version:: get ( toolchain_config, & config. extra_env )
271+ . inspect_err ( |e| {
272+ tracing:: error!( %e,
273+ "failed fetching toolchain version for {cargo_toml:?} workspace"
274+ )
275+ } )
276+ . ok ( )
277+ . flatten ( ) ;
278+ let rustc_cfg =
279+ rustc_cfg:: get ( toolchain_config, targets. first ( ) . map ( Deref :: deref) , & config. extra_env ) ;
306280 let cfg_overrides = config. cfg_overrides . clone ( ) ;
307281 let data_layout = target_data_layout:: get (
308- QueryConfig :: Cargo ( & sysroot , cargo_toml ) ,
282+ toolchain_config ,
309283 targets. first ( ) . map ( Deref :: deref) ,
310284 & config. extra_env ,
311285 ) ;
@@ -355,19 +329,7 @@ impl ProjectWorkspace {
355329 & config. sysroot_query_metadata ,
356330 ) ;
357331 let query_config = QueryConfig :: Rustc ( & sysroot, project_json. path ( ) . as_ref ( ) ) ;
358- let toolchain = match get_toolchain_version (
359- project_json. path ( ) ,
360- & sysroot,
361- Tool :: Rustc ,
362- & config. extra_env ,
363- "rustc " ,
364- ) {
365- Ok ( it) => it,
366- Err ( e) => {
367- tracing:: error!( "{e}" ) ;
368- None
369- }
370- } ;
332+ let toolchain = version:: get ( query_config, & config. extra_env ) . ok ( ) . flatten ( ) ;
371333
372334 let target = config. target . as_deref ( ) ;
373335 let rustc_cfg = rustc_cfg:: get ( query_config, target, & config. extra_env ) ;
@@ -397,22 +359,10 @@ impl ProjectWorkspace {
397359 None => Sysroot :: empty ( ) ,
398360 } ;
399361
400- let toolchain =
401- match get_toolchain_version ( dir, & sysroot, Tool :: Rustc , & config. extra_env , "rustc " ) {
402- Ok ( it) => it,
403- Err ( e) => {
404- tracing:: error!( "{e}" ) ;
405- None
406- }
407- } ;
408-
409- let targets = target_tuple:: get (
410- QueryConfig :: Cargo ( & sysroot, detached_file) ,
411- config. target . as_deref ( ) ,
412- & config. extra_env ,
413- )
414- . unwrap_or_default ( ) ;
415- let query_config = QueryConfig :: Rustc ( & sysroot, dir. as_ref ( ) ) ;
362+ let query_config = QueryConfig :: Cargo ( & sysroot, detached_file) ;
363+ let toolchain = version:: get ( query_config, & config. extra_env ) . ok ( ) . flatten ( ) ;
364+ let targets = target_tuple:: get ( query_config, config. target . as_deref ( ) , & config. extra_env )
365+ . unwrap_or_default ( ) ;
416366 let rustc_cfg = rustc_cfg:: get ( query_config, None , & config. extra_env ) ;
417367 let data_layout = target_data_layout:: get ( query_config, None , & config. extra_env ) ;
418368
0 commit comments