@@ -46,6 +46,39 @@ fn load_cargo_with_overrides(
4646 to_crate_graph ( project_workspace)
4747}
4848
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+
4982fn load_rust_project ( file : & str ) -> ( CrateGraph , ProcMacroPaths ) {
5083 let data = get_test_json_file ( file) ;
5184 let project = rooted_project_json ( data) ;
@@ -221,6 +254,34 @@ fn rust_project_is_proc_macro_has_proc_macro_dep() {
221254 crate_data. dependencies . iter ( ) . find ( |& dep| dep. name . deref ( ) == "proc_macro" ) . unwrap ( ) ;
222255}
223256
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+
224285#[ test]
225286fn smoke_test_real_sysroot_cargo ( ) {
226287 let file_map = & mut FxHashMap :: < AbsPathBuf , FileId > :: default ( ) ;
0 commit comments