@@ -18,32 +18,38 @@ use crate::{
1818} ;
1919
2020fn load_cargo ( file : & str ) -> ( CrateGraph , ProcMacroPaths ) {
21- load_cargo_with_overrides ( file, CfgOverrides :: default ( ) )
21+ let project_workspace = load_workspace_from_metadata ( file) ;
22+ to_crate_graph ( project_workspace, & mut Default :: default ( ) )
2223}
2324
2425fn load_cargo_with_overrides (
2526 file : & str ,
2627 cfg_overrides : CfgOverrides ,
2728) -> ( CrateGraph , ProcMacroPaths ) {
29+ let project_workspace =
30+ ProjectWorkspace { cfg_overrides, ..load_workspace_from_metadata ( file) } ;
31+ to_crate_graph ( project_workspace, & mut Default :: default ( ) )
32+ }
33+
34+ fn load_workspace_from_metadata ( file : & str ) -> ProjectWorkspace {
2835 let meta: Metadata = get_test_json_file ( file) ;
2936 let manifest_path =
3037 ManifestPath :: try_from ( AbsPathBuf :: try_from ( meta. workspace_root . clone ( ) ) . unwrap ( ) ) . unwrap ( ) ;
3138 let cargo_workspace = CargoWorkspace :: new ( meta, manifest_path, Default :: default ( ) ) ;
32- let project_workspace = ProjectWorkspace {
39+ ProjectWorkspace {
3340 kind : ProjectWorkspaceKind :: Cargo {
3441 cargo : cargo_workspace,
3542 build_scripts : WorkspaceBuildScripts :: default ( ) ,
3643 rustc : Err ( None ) ,
3744 error : None ,
3845 set_test : true ,
3946 } ,
40- cfg_overrides,
47+ cfg_overrides : Default :: default ( ) ,
4148 sysroot : Sysroot :: empty ( ) ,
4249 rustc_cfg : Vec :: new ( ) ,
4350 toolchain : None ,
4451 target_layout : Err ( "target_data_layout not loaded" . into ( ) ) ,
45- } ;
46- to_crate_graph ( project_workspace)
52+ }
4753}
4854
4955fn load_rust_project ( file : & str ) -> ( CrateGraph , ProcMacroPaths ) {
@@ -58,7 +64,7 @@ fn load_rust_project(file: &str) -> (CrateGraph, ProcMacroPaths) {
5864 target_layout : Err ( Arc :: from ( "test has no data layout" ) ) ,
5965 cfg_overrides : Default :: default ( ) ,
6066 } ;
61- to_crate_graph ( project_workspace)
67+ to_crate_graph ( project_workspace, & mut Default :: default ( ) )
6268}
6369
6470fn get_test_json_file < T : DeserializeOwned > ( file : & str ) -> T {
@@ -127,13 +133,15 @@ fn rooted_project_json(data: ProjectJsonData) -> ProjectJson {
127133 ProjectJson :: new ( None , base, data)
128134}
129135
130- fn to_crate_graph ( project_workspace : ProjectWorkspace ) -> ( CrateGraph , ProcMacroPaths ) {
136+ fn to_crate_graph (
137+ project_workspace : ProjectWorkspace ,
138+ file_map : & mut FxHashMap < AbsPathBuf , FileId > ,
139+ ) -> ( CrateGraph , ProcMacroPaths ) {
131140 project_workspace. to_crate_graph (
132141 & mut {
133- let mut counter = 0 ;
134- move |_path| {
135- counter += 1 ;
136- Some ( FileId :: from_raw ( counter) )
142+ |path| {
143+ let len = file_map. len ( ) + 1 ;
144+ Some ( * file_map. entry ( path. to_path_buf ( ) ) . or_insert ( FileId :: from_raw ( len as u32 ) ) )
137145 }
138146 } ,
139147 & Default :: default ( ) ,
@@ -221,6 +229,33 @@ fn rust_project_is_proc_macro_has_proc_macro_dep() {
221229 crate_data. dependencies . iter ( ) . find ( |& dep| dep. name . deref ( ) == "proc_macro" ) . unwrap ( ) ;
222230}
223231
232+ #[ test]
233+ fn crate_graph_dedup_identical ( ) {
234+ let ( mut crate_graph, proc_macros) = load_cargo ( "regex-metadata.json" ) ;
235+
236+ let ( d_crate_graph, mut d_proc_macros) = ( crate_graph. clone ( ) , proc_macros. clone ( ) ) ;
237+
238+ crate_graph. extend ( d_crate_graph. clone ( ) , & mut d_proc_macros) ;
239+ assert ! ( crate_graph. iter( ) . eq( d_crate_graph. iter( ) ) ) ;
240+ assert_eq ! ( proc_macros, d_proc_macros) ;
241+ }
242+
243+ #[ test]
244+ fn crate_graph_dedup ( ) {
245+ let mut file_map = Default :: default ( ) ;
246+
247+ let ripgrep_workspace = load_workspace_from_metadata ( "ripgrep-metadata.json" ) ;
248+ let ( mut crate_graph, _proc_macros) = to_crate_graph ( ripgrep_workspace, & mut file_map) ;
249+ assert_eq ! ( crate_graph. iter( ) . count( ) , 71 ) ;
250+
251+ let regex_workspace = load_workspace_from_metadata ( "regex-metadata.json" ) ;
252+ let ( regex_crate_graph, mut regex_proc_macros) = to_crate_graph ( regex_workspace, & mut file_map) ;
253+ assert_eq ! ( regex_crate_graph. iter( ) . count( ) , 50 ) ;
254+
255+ crate_graph. extend ( regex_crate_graph, & mut regex_proc_macros) ;
256+ assert_eq ! ( crate_graph. iter( ) . count( ) , 108 ) ;
257+ }
258+
224259#[ test]
225260fn smoke_test_real_sysroot_cargo ( ) {
226261 let file_map = & mut FxHashMap :: < AbsPathBuf , FileId > :: default ( ) ;
0 commit comments