@@ -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_tuple, 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,52 @@ 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_tuple:: 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 ,
244+ ) ;
245+ if let Err ( e) = & data_layout {
246+ tracing:: error!( %e, "failed fetching data layout for {cargo_toml:?} workspace" ) ;
247+ }
248+
249+ let ( meta, error) = CargoWorkspace :: fetch_metadata (
250+ cargo_toml,
251+ cargo_toml. parent ( ) ,
252+ & CargoMetadataConfig {
253+ features : config. features . clone ( ) ,
254+ targets : targets. clone ( ) ,
255+ extra_args : config. extra_args . clone ( ) ,
256+ extra_env : config. extra_env . clone ( ) ,
257+ } ,
258+ & sysroot,
259+ false ,
260+ progress,
249261 )
250- . unwrap_or_default ( ) ;
251- sysroot. load_workspace ( & SysrootSourceWorkspaceConfig :: CargoMetadata (
252- sysroot_metadata_config ( & config. extra_env , & targets) ,
253- ) ) ;
254- tracing:: info!( workspace = %cargo_toml, src_root = ?sysroot. src_root( ) , root = ?sysroot. root( ) , "Using sysroot" ) ;
262+ . with_context ( || {
263+ format ! (
264+ "Failed to read Cargo metadata from Cargo.toml file {cargo_toml}, {toolchain:?}" ,
265+ )
266+ } ) ?;
267+ let cargo_config_extra_env = cargo_config_env ( cargo_toml, & config. extra_env , & sysroot) ;
268+ let cargo = CargoWorkspace :: new ( meta, cargo_toml. clone ( ) , cargo_config_extra_env) ;
255269 let rustc = rustc_dir. and_then ( |rustc_dir| {
256270 info ! ( workspace = %cargo_toml, rustc_dir = %rustc_dir, "Using rustc source" ) ;
257271 match CargoWorkspace :: fetch_metadata (
@@ -288,47 +302,9 @@ impl ProjectWorkspace {
288302 }
289303 }
290304 } ) ;
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- }
312- let ( meta, error) = CargoWorkspace :: fetch_metadata (
313- cargo_toml,
314- cargo_toml. parent ( ) ,
315- & CargoMetadataConfig {
316- features : config. features . clone ( ) ,
317- targets,
318- extra_args : config. extra_args . clone ( ) ,
319- extra_env : config. extra_env . clone ( ) ,
320- } ,
321- & sysroot,
322- false ,
323- progress,
324- )
325- . with_context ( || {
326- format ! (
327- "Failed to read Cargo metadata from Cargo.toml file {cargo_toml}, {toolchain:?}" ,
328- )
329- } ) ?;
330- let cargo_config_extra_env = cargo_config_env ( cargo_toml, & config. extra_env , & sysroot) ;
331- let cargo = CargoWorkspace :: new ( meta, cargo_toml. clone ( ) , cargo_config_extra_env) ;
305+ sysroot. load_workspace ( & SysrootSourceWorkspaceConfig :: CargoMetadata (
306+ sysroot_metadata_config ( & config. extra_env , & targets) ,
307+ ) ) ;
332308 Ok ( ProjectWorkspace {
333309 kind : ProjectWorkspaceKind :: Cargo {
334310 cargo,
@@ -350,19 +326,7 @@ impl ProjectWorkspace {
350326 Sysroot :: new ( project_json. sysroot . clone ( ) , project_json. sysroot_src . clone ( ) ) ;
351327 sysroot. load_workspace ( & SysrootSourceWorkspaceConfig :: Stitched ) ;
352328 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- } ;
329+ let toolchain = version:: get ( query_config, & config. extra_env ) . ok ( ) . flatten ( ) ;
366330
367331 let target = config. target . as_deref ( ) ;
368332 let rustc_cfg = rustc_cfg:: get ( query_config, target, & config. extra_env ) ;
@@ -388,28 +352,15 @@ impl ProjectWorkspace {
388352 None => Sysroot :: empty ( ) ,
389353 } ;
390354
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_tuple:: get (
401- QueryConfig :: Cargo ( & sysroot, detached_file) ,
402- config. target . as_deref ( ) ,
403- & config. extra_env ,
404- )
405- . unwrap_or_default ( ) ;
406-
355+ let query_config = QueryConfig :: Cargo ( & sysroot, detached_file) ;
356+ let toolchain = version:: get ( query_config, & config. extra_env ) . ok ( ) . flatten ( ) ;
357+ let targets = target_tuple:: get ( query_config, config. target . as_deref ( ) , & config. extra_env )
358+ . unwrap_or_default ( ) ;
359+ let rustc_cfg = rustc_cfg:: get ( query_config, None , & config. extra_env ) ;
360+ let data_layout = target_data_layout:: get ( query_config, None , & config. extra_env ) ;
407361 sysroot. load_workspace ( & SysrootSourceWorkspaceConfig :: CargoMetadata (
408362 sysroot_metadata_config ( & config. extra_env , & targets) ,
409363 ) ) ;
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 ) ;
413364
414365 let cargo_script = CargoWorkspace :: fetch_metadata (
415366 detached_file,
0 commit comments