@@ -63,7 +63,7 @@ pub struct PackageRoot {
63
63
pub exclude : Vec < AbsPathBuf > ,
64
64
}
65
65
66
- #[ derive( Clone , Eq , PartialEq ) ]
66
+ #[ derive( Clone ) ]
67
67
pub enum ProjectWorkspace {
68
68
/// Project workspace was discovered by running `cargo metadata` and `rustc --print sysroot`.
69
69
Cargo {
@@ -83,7 +83,6 @@ pub enum ProjectWorkspace {
83
83
} ,
84
84
/// Project workspace was manually specified using a `rust-project.json` file.
85
85
Json { project : ProjectJson , sysroot : Option < Sysroot > , rustc_cfg : Vec < CfgFlag > } ,
86
-
87
86
// FIXME: The primary limitation of this approach is that the set of detached files needs to be fixed at the beginning.
88
87
// That's not the end user experience we should strive for.
89
88
// Ideally, you should be able to just open a random detached file in existing cargo projects, and get the basic features working.
@@ -163,7 +162,7 @@ impl ProjectWorkspace {
163
162
project_json,
164
163
config. target . as_deref ( ) ,
165
164
& config. extra_env ,
166
- ) ?
165
+ )
167
166
}
168
167
ProjectManifest :: CargoToml ( cargo_toml) => {
169
168
let cargo_version = utf8_stdout ( {
@@ -193,20 +192,27 @@ impl ProjectWorkspace {
193
192
194
193
let sysroot = match & config. sysroot {
195
194
Some ( RustcSource :: Path ( path) ) => {
196
- Some ( Sysroot :: with_sysroot_dir ( path. clone ( ) ) . with_context ( || {
197
- format ! ( "Failed to find sysroot at {}." , path. display( ) )
198
- } ) ?)
195
+ match Sysroot :: with_sysroot_dir ( path. clone ( ) ) {
196
+ Ok ( it) => Some ( it) ,
197
+ Err ( e) => {
198
+ tracing:: error!( %e, "Failed to find sysroot at {}." , path. display( ) ) ;
199
+ None
200
+ }
201
+ }
202
+ }
203
+ Some ( RustcSource :: Discover ) => {
204
+ match Sysroot :: discover ( cargo_toml. parent ( ) , & config. extra_env ) {
205
+ Ok ( it) => Some ( it) ,
206
+ Err ( e) => {
207
+ tracing:: error!(
208
+ %e,
209
+ "Failed to find sysroot for Cargo.toml file {}. Is rust-src installed?" ,
210
+ cargo_toml. display( )
211
+ ) ;
212
+ None
213
+ }
214
+ }
199
215
}
200
- Some ( RustcSource :: Discover ) => Some (
201
- Sysroot :: discover ( cargo_toml. parent ( ) , & config. extra_env ) . with_context (
202
- || {
203
- format ! (
204
- "Failed to find sysroot for Cargo.toml file {}. Is rust-src installed?" ,
205
- cargo_toml. display( )
206
- )
207
- } ,
208
- ) ?,
209
- ) ,
210
216
None => None ,
211
217
} ;
212
218
if let Some ( sysroot) = & sysroot {
@@ -225,18 +231,22 @@ impl ProjectWorkspace {
225
231
}
226
232
227
233
let rustc = match rustc_dir {
228
- Some ( rustc_dir) => Some ( {
229
- let meta = CargoWorkspace :: fetch_metadata (
230
- & rustc_dir,
231
- cargo_toml. parent ( ) ,
232
- config,
233
- progress,
234
- )
235
- . with_context ( || {
236
- "Failed to read Cargo metadata for Rust sources" . to_string ( )
237
- } ) ?;
238
- CargoWorkspace :: new ( meta)
239
- } ) ,
234
+ Some ( rustc_dir) => match CargoWorkspace :: fetch_metadata (
235
+ & rustc_dir,
236
+ cargo_toml. parent ( ) ,
237
+ config,
238
+ progress,
239
+ ) {
240
+ Ok ( meta) => Some ( CargoWorkspace :: new ( meta) ) ,
241
+ Err ( e) => {
242
+ tracing:: error!(
243
+ %e,
244
+ "Failed to read Cargo metadata from rustc source at {}" ,
245
+ rustc_dir. display( )
246
+ ) ;
247
+ None
248
+ }
249
+ } ,
240
250
None => None ,
241
251
} ;
242
252
@@ -272,23 +282,22 @@ impl ProjectWorkspace {
272
282
project_json : ProjectJson ,
273
283
target : Option < & str > ,
274
284
extra_env : & FxHashMap < String , String > ,
275
- ) -> Result < ProjectWorkspace > {
285
+ ) -> ProjectWorkspace {
276
286
let sysroot = match ( project_json. sysroot . clone ( ) , project_json. sysroot_src . clone ( ) ) {
277
- ( Some ( sysroot) , Some ( sysroot_src) ) => Some ( Sysroot :: load ( sysroot, sysroot_src) ? ) ,
287
+ ( Some ( sysroot) , Some ( sysroot_src) ) => Some ( Sysroot :: load ( sysroot, sysroot_src) ) ,
278
288
( Some ( sysroot) , None ) => {
279
289
// assume sysroot is structured like rustup's and guess `sysroot_src`
280
290
let sysroot_src =
281
291
sysroot. join ( "lib" ) . join ( "rustlib" ) . join ( "src" ) . join ( "rust" ) . join ( "library" ) ;
282
-
283
- Some ( Sysroot :: load ( sysroot, sysroot_src) ?)
292
+ Some ( Sysroot :: load ( sysroot, sysroot_src) )
284
293
}
285
294
( None , Some ( sysroot_src) ) => {
286
295
// assume sysroot is structured like rustup's and guess `sysroot`
287
296
let mut sysroot = sysroot_src. clone ( ) ;
288
297
for _ in 0 ..5 {
289
298
sysroot. pop ( ) ;
290
299
}
291
- Some ( Sysroot :: load ( sysroot, sysroot_src) ? )
300
+ Some ( Sysroot :: load ( sysroot, sysroot_src) )
292
301
}
293
302
( None , None ) => None ,
294
303
} ;
@@ -297,26 +306,37 @@ impl ProjectWorkspace {
297
306
}
298
307
299
308
let rustc_cfg = rustc_cfg:: get ( None , target, extra_env) ;
300
- Ok ( ProjectWorkspace :: Json { project : project_json, sysroot, rustc_cfg } )
309
+ ProjectWorkspace :: Json { project : project_json, sysroot, rustc_cfg }
301
310
}
302
311
303
312
pub fn load_detached_files (
304
313
detached_files : Vec < AbsPathBuf > ,
305
314
config : & CargoConfig ,
306
315
) -> Result < ProjectWorkspace > {
307
316
let sysroot = match & config. sysroot {
308
- Some ( RustcSource :: Path ( path) ) => Some (
309
- Sysroot :: with_sysroot_dir ( path. clone ( ) )
310
- . with_context ( || format ! ( "Failed to find sysroot at {}." , path. display( ) ) ) ?,
311
- ) ,
317
+ Some ( RustcSource :: Path ( path) ) => match Sysroot :: with_sysroot_dir ( path. clone ( ) ) {
318
+ Ok ( it) => Some ( it) ,
319
+ Err ( e) => {
320
+ tracing:: error!( %e, "Failed to find sysroot at {}." , path. display( ) ) ;
321
+ None
322
+ }
323
+ } ,
312
324
Some ( RustcSource :: Discover ) => {
313
325
let dir = & detached_files
314
326
. first ( )
315
327
. and_then ( |it| it. parent ( ) )
316
328
. ok_or_else ( || format_err ! ( "No detached files to load" ) ) ?;
317
- Some ( Sysroot :: discover ( dir, & config. extra_env ) . with_context ( || {
318
- format ! ( "Failed to find sysroot in {}. Is rust-src installed?" , dir. display( ) )
319
- } ) ?)
329
+ match Sysroot :: discover ( dir, & config. extra_env ) {
330
+ Ok ( it) => Some ( it) ,
331
+ Err ( e) => {
332
+ tracing:: error!(
333
+ %e,
334
+ "Failed to find sysroot for {}. Is rust-src installed?" ,
335
+ dir. display( )
336
+ ) ;
337
+ None
338
+ }
339
+ }
320
340
}
321
341
None => None ,
322
342
} ;
@@ -541,7 +561,7 @@ impl ProjectWorkspace {
541
561
load_proc_macro,
542
562
load,
543
563
project,
544
- sysroot,
564
+ sysroot. as_ref ( ) ,
545
565
extra_env,
546
566
Err ( "rust-project.json projects have no target layout set" . into ( ) ) ,
547
567
) ,
@@ -585,14 +605,57 @@ impl ProjectWorkspace {
585
605
}
586
606
crate_graph
587
607
}
608
+
609
+ pub fn eq_ignore_build_data ( & self , other : & Self ) -> bool {
610
+ match ( self , other) {
611
+ (
612
+ Self :: Cargo {
613
+ cargo,
614
+ sysroot,
615
+ rustc,
616
+ rustc_cfg,
617
+ cfg_overrides,
618
+ toolchain,
619
+ build_scripts : _,
620
+ target_layout : _,
621
+ } ,
622
+ Self :: Cargo {
623
+ cargo : o_cargo,
624
+ sysroot : o_sysroot,
625
+ rustc : o_rustc,
626
+ rustc_cfg : o_rustc_cfg,
627
+ cfg_overrides : o_cfg_overrides,
628
+ toolchain : o_toolchain,
629
+ build_scripts : _,
630
+ target_layout : _,
631
+ } ,
632
+ ) => {
633
+ cargo == o_cargo
634
+ && rustc == o_rustc
635
+ && rustc_cfg == o_rustc_cfg
636
+ && cfg_overrides == o_cfg_overrides
637
+ && toolchain == o_toolchain
638
+ && sysroot == o_sysroot
639
+ }
640
+ (
641
+ Self :: Json { project, sysroot, rustc_cfg } ,
642
+ Self :: Json { project : o_project, sysroot : o_sysroot, rustc_cfg : o_rustc_cfg } ,
643
+ ) => project == o_project && rustc_cfg == o_rustc_cfg && sysroot == o_sysroot,
644
+ (
645
+ Self :: DetachedFiles { files, sysroot, rustc_cfg } ,
646
+ Self :: DetachedFiles { files : o_files, sysroot : o_sysroot, rustc_cfg : o_rustc_cfg } ,
647
+ ) => files == o_files && sysroot == o_sysroot && rustc_cfg == o_rustc_cfg,
648
+ _ => false ,
649
+ }
650
+ }
588
651
}
589
652
590
653
fn project_json_to_crate_graph (
591
654
rustc_cfg : Vec < CfgFlag > ,
592
655
load_proc_macro : & mut dyn FnMut ( & str , & AbsPath ) -> ProcMacroLoadResult ,
593
656
load : & mut dyn FnMut ( & AbsPath ) -> Option < FileId > ,
594
657
project : & ProjectJson ,
595
- sysroot : & Option < Sysroot > ,
658
+ sysroot : Option < & Sysroot > ,
596
659
extra_env : & FxHashMap < String , String > ,
597
660
target_layout : TargetLayoutLoadResult ,
598
661
) -> CrateGraph {
0 commit comments