@@ -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,10 +25,10 @@ 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 , 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 ,
33
32
} ;
34
33
use tracing:: { debug, error, info} ;
35
34
@@ -151,27 +150,6 @@ impl fmt::Debug for ProjectWorkspace {
151
150
}
152
151
}
153
152
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
-
175
153
impl ProjectWorkspace {
176
154
pub fn load (
177
155
manifest : ProjectManifest ,
@@ -242,16 +220,35 @@ impl ProjectWorkspace {
242
220
. ok_or_else ( || Some ( "Failed to discover rustc source for sysroot." . to_owned ( ) ) ) ,
243
221
None => Err ( None ) ,
244
222
} ;
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) ,
248
243
& 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
+ }
251
248
sysroot. load_workspace ( & SysrootSourceWorkspaceConfig :: CargoMetadata (
252
249
sysroot_metadata_config ( & config. extra_env , & targets) ,
253
250
) ) ;
254
- tracing :: info! ( workspace = %cargo_toml , src_root = ?sysroot . src_root ( ) , root = ?sysroot . root ( ) , "Using sysroot" ) ;
251
+
255
252
let rustc = rustc_dir. and_then ( |rustc_dir| {
256
253
info ! ( workspace = %cargo_toml, rustc_dir = %rustc_dir, "Using rustc source" ) ;
257
254
match CargoWorkspace :: fetch_metadata (
@@ -288,27 +285,7 @@ impl ProjectWorkspace {
288
285
}
289
286
}
290
287
} ) ;
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
+
312
289
let ( meta, error) = CargoWorkspace :: fetch_metadata (
313
290
cargo_toml,
314
291
cargo_toml. parent ( ) ,
@@ -329,6 +306,7 @@ impl ProjectWorkspace {
329
306
} ) ?;
330
307
let cargo_config_extra_env = cargo_config_env ( cargo_toml, & config. extra_env , & sysroot) ;
331
308
let cargo = CargoWorkspace :: new ( meta, cargo_toml. clone ( ) , cargo_config_extra_env) ;
309
+
332
310
Ok ( ProjectWorkspace {
333
311
kind : ProjectWorkspaceKind :: Cargo {
334
312
cargo,
@@ -350,19 +328,7 @@ impl ProjectWorkspace {
350
328
Sysroot :: new ( project_json. sysroot . clone ( ) , project_json. sysroot_src . clone ( ) ) ;
351
329
sysroot. load_workspace ( & SysrootSourceWorkspaceConfig :: Stitched ) ;
352
330
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 ( ) ;
366
332
367
333
let target = config. target . as_deref ( ) ;
368
334
let rustc_cfg = rustc_cfg:: get ( query_config, target, & config. extra_env ) ;
@@ -388,28 +354,15 @@ impl ProjectWorkspace {
388
354
None => Sysroot :: empty ( ) ,
389
355
} ;
390
356
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 ) ;
407
363
sysroot. load_workspace ( & SysrootSourceWorkspaceConfig :: CargoMetadata (
408
364
sysroot_metadata_config ( & config. extra_env , & targets) ,
409
365
) ) ;
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 ) ;
413
366
414
367
let cargo_script = CargoWorkspace :: fetch_metadata (
415
368
detached_file,
0 commit comments