@@ -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_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 ,
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,52 @@ 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_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) ,
248
243
& 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,
249
261
)
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) ;
255
269
let rustc = rustc_dir. and_then ( |rustc_dir| {
256
270
info ! ( workspace = %cargo_toml, rustc_dir = %rustc_dir, "Using rustc source" ) ;
257
271
match CargoWorkspace :: fetch_metadata (
@@ -288,47 +302,9 @@ impl ProjectWorkspace {
288
302
}
289
303
}
290
304
} ) ;
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
+ ) ) ;
332
308
Ok ( ProjectWorkspace {
333
309
kind : ProjectWorkspaceKind :: Cargo {
334
310
cargo,
@@ -350,19 +326,7 @@ impl ProjectWorkspace {
350
326
Sysroot :: new ( project_json. sysroot . clone ( ) , project_json. sysroot_src . clone ( ) ) ;
351
327
sysroot. load_workspace ( & SysrootSourceWorkspaceConfig :: Stitched ) ;
352
328
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 ( ) ;
366
330
367
331
let target = config. target . as_deref ( ) ;
368
332
let rustc_cfg = rustc_cfg:: get ( query_config, target, & config. extra_env ) ;
@@ -388,28 +352,15 @@ impl ProjectWorkspace {
388
352
None => Sysroot :: empty ( ) ,
389
353
} ;
390
354
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 ) ;
407
361
sysroot. load_workspace ( & SysrootSourceWorkspaceConfig :: CargoMetadata (
408
362
sysroot_metadata_config ( & config. extra_env , & targets) ,
409
363
) ) ;
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
364
414
365
let cargo_script = CargoWorkspace :: fetch_metadata (
415
366
detached_file,
0 commit comments