@@ -46,6 +46,39 @@ fn load_cargo_with_overrides(
46
46
to_crate_graph ( project_workspace)
47
47
}
48
48
49
+ fn load_cargo_with_fake_sysroot (
50
+ file_map : & mut FxHashMap < AbsPathBuf , FileId > ,
51
+ file : & str ,
52
+ ) -> ( CrateGraph , ProcMacroPaths ) {
53
+ let meta: Metadata = get_test_json_file ( file) ;
54
+ let manifest_path =
55
+ ManifestPath :: try_from ( AbsPathBuf :: try_from ( meta. workspace_root . clone ( ) ) . unwrap ( ) ) . unwrap ( ) ;
56
+ let cargo_workspace = CargoWorkspace :: new ( meta, manifest_path, Default :: default ( ) ) ;
57
+ let project_workspace = ProjectWorkspace {
58
+ kind : ProjectWorkspaceKind :: Cargo {
59
+ cargo : cargo_workspace,
60
+ build_scripts : WorkspaceBuildScripts :: default ( ) ,
61
+ rustc : Err ( None ) ,
62
+ error : None ,
63
+ set_test : true ,
64
+ } ,
65
+ sysroot : get_fake_sysroot ( ) ,
66
+ rustc_cfg : Vec :: new ( ) ,
67
+ cfg_overrides : Default :: default ( ) ,
68
+ toolchain : None ,
69
+ target_layout : Err ( "target_data_layout not loaded" . into ( ) ) ,
70
+ } ;
71
+ project_workspace. to_crate_graph (
72
+ & mut {
73
+ |path| {
74
+ let len = file_map. len ( ) ;
75
+ Some ( * file_map. entry ( path. to_path_buf ( ) ) . or_insert ( FileId :: from_raw ( len as u32 ) ) )
76
+ }
77
+ } ,
78
+ & Default :: default ( ) ,
79
+ )
80
+ }
81
+
49
82
fn load_rust_project ( file : & str ) -> ( CrateGraph , ProcMacroPaths ) {
50
83
let data = get_test_json_file ( file) ;
51
84
let project = rooted_project_json ( data) ;
@@ -221,6 +254,34 @@ fn rust_project_is_proc_macro_has_proc_macro_dep() {
221
254
crate_data. dependencies . iter ( ) . find ( |& dep| dep. name . deref ( ) == "proc_macro" ) . unwrap ( ) ;
222
255
}
223
256
257
+ #[ test]
258
+ fn crate_graph_dedup_identical ( ) {
259
+ let ( mut crate_graph, proc_macros) =
260
+ load_cargo_with_fake_sysroot ( & mut Default :: default ( ) , "regex-metadata.json" ) ;
261
+ crate_graph. sort_deps ( ) ;
262
+
263
+ let ( d_crate_graph, mut d_proc_macros) = ( crate_graph. clone ( ) , proc_macros. clone ( ) ) ;
264
+
265
+ crate_graph. extend ( d_crate_graph. clone ( ) , & mut d_proc_macros) ;
266
+ assert ! ( crate_graph. iter( ) . eq( d_crate_graph. iter( ) ) ) ;
267
+ assert_eq ! ( proc_macros, d_proc_macros) ;
268
+ }
269
+
270
+ #[ test]
271
+ fn crate_graph_dedup ( ) {
272
+ let path_map = & mut Default :: default ( ) ;
273
+ let ( mut crate_graph, _proc_macros) =
274
+ load_cargo_with_fake_sysroot ( path_map, "ripgrep-metadata.json" ) ;
275
+ assert_eq ! ( crate_graph. iter( ) . count( ) , 81 ) ;
276
+ crate_graph. sort_deps ( ) ;
277
+ let ( regex_crate_graph, mut regex_proc_macros) =
278
+ load_cargo_with_fake_sysroot ( path_map, "regex-metadata.json" ) ;
279
+ assert_eq ! ( regex_crate_graph. iter( ) . count( ) , 60 ) ;
280
+
281
+ crate_graph. extend ( regex_crate_graph, & mut regex_proc_macros) ;
282
+ assert_eq ! ( crate_graph. iter( ) . count( ) , 118 ) ;
283
+ }
284
+
224
285
#[ test]
225
286
fn smoke_test_real_sysroot_cargo ( ) {
226
287
let file_map = & mut FxHashMap :: < AbsPathBuf , FileId > :: default ( ) ;
0 commit comments