@@ -16,7 +16,6 @@ use paths::{AbsPath, AbsPathBuf};
16
16
use rustc_hash:: FxHashMap ;
17
17
use semver:: Version ;
18
18
use span:: { Edition , FileId } ;
19
- use toolchain:: Tool ;
20
19
use tracing:: instrument;
21
20
use triomphe:: Arc ;
22
21
@@ -26,9 +25,9 @@ use crate::{
26
25
env:: { cargo_config_env, inject_cargo_env, inject_cargo_package_env, inject_rustc_tool_env} ,
27
26
project_json:: { Crate , CrateArrayIdx } ,
28
27
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 ,
32
31
} ;
33
32
use tracing:: { debug, error, info} ;
34
33
@@ -150,27 +149,6 @@ impl fmt::Debug for ProjectWorkspace {
150
149
}
151
150
}
152
151
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
-
174
152
impl ProjectWorkspace {
175
153
pub fn load (
176
154
manifest : ProjectManifest ,
@@ -249,12 +227,10 @@ impl ProjectWorkspace {
249
227
. ok_or_else ( || Some ( "Failed to discover rustc source for sysroot." . to_owned ( ) ) ) ,
250
228
None => Err ( None ) ,
251
229
} ;
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 ( ) ;
258
234
let rustc = rustc_dir. and_then ( |rustc_dir| {
259
235
info ! ( workspace = %cargo_toml, rustc_dir = %rustc_dir, "Using rustc source" ) ;
260
236
match CargoWorkspace :: fetch_metadata (
@@ -291,21 +267,19 @@ impl ProjectWorkspace {
291
267
}
292
268
}
293
269
} ) ;
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 ) ;
306
280
let cfg_overrides = config. cfg_overrides . clone ( ) ;
307
281
let data_layout = target_data_layout:: get (
308
- QueryConfig :: Cargo ( & sysroot , cargo_toml ) ,
282
+ toolchain_config ,
309
283
targets. first ( ) . map ( Deref :: deref) ,
310
284
& config. extra_env ,
311
285
) ;
@@ -355,19 +329,7 @@ impl ProjectWorkspace {
355
329
& config. sysroot_query_metadata ,
356
330
) ;
357
331
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 ( ) ;
371
333
372
334
let target = config. target . as_deref ( ) ;
373
335
let rustc_cfg = rustc_cfg:: get ( query_config, target, & config. extra_env ) ;
@@ -397,22 +359,10 @@ impl ProjectWorkspace {
397
359
None => Sysroot :: empty ( ) ,
398
360
} ;
399
361
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 ( ) ;
416
366
let rustc_cfg = rustc_cfg:: get ( query_config, None , & config. extra_env ) ;
417
367
let data_layout = target_data_layout:: get ( query_config, None , & config. extra_env ) ;
418
368
0 commit comments