@@ -18,32 +18,38 @@ use crate::{
18
18
} ;
19
19
20
20
fn 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 ( ) )
22
23
}
23
24
24
25
fn load_cargo_with_overrides (
25
26
file : & str ,
26
27
cfg_overrides : CfgOverrides ,
27
28
) -> ( 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 {
28
35
let meta: Metadata = get_test_json_file ( file) ;
29
36
let manifest_path =
30
37
ManifestPath :: try_from ( AbsPathBuf :: try_from ( meta. workspace_root . clone ( ) ) . unwrap ( ) ) . unwrap ( ) ;
31
38
let cargo_workspace = CargoWorkspace :: new ( meta, manifest_path, Default :: default ( ) ) ;
32
- let project_workspace = ProjectWorkspace {
39
+ ProjectWorkspace {
33
40
kind : ProjectWorkspaceKind :: Cargo {
34
41
cargo : cargo_workspace,
35
42
build_scripts : WorkspaceBuildScripts :: default ( ) ,
36
43
rustc : Err ( None ) ,
37
44
error : None ,
38
45
set_test : true ,
39
46
} ,
40
- cfg_overrides,
47
+ cfg_overrides : Default :: default ( ) ,
41
48
sysroot : Sysroot :: empty ( ) ,
42
49
rustc_cfg : Vec :: new ( ) ,
43
50
toolchain : None ,
44
51
target_layout : Err ( "target_data_layout not loaded" . into ( ) ) ,
45
- } ;
46
- to_crate_graph ( project_workspace)
52
+ }
47
53
}
48
54
49
55
fn load_rust_project ( file : & str ) -> ( CrateGraph , ProcMacroPaths ) {
@@ -58,7 +64,7 @@ fn load_rust_project(file: &str) -> (CrateGraph, ProcMacroPaths) {
58
64
target_layout : Err ( Arc :: from ( "test has no data layout" ) ) ,
59
65
cfg_overrides : Default :: default ( ) ,
60
66
} ;
61
- to_crate_graph ( project_workspace)
67
+ to_crate_graph ( project_workspace, & mut Default :: default ( ) )
62
68
}
63
69
64
70
fn get_test_json_file < T : DeserializeOwned > ( file : & str ) -> T {
@@ -127,13 +133,15 @@ fn rooted_project_json(data: ProjectJsonData) -> ProjectJson {
127
133
ProjectJson :: new ( None , base, data)
128
134
}
129
135
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 ) {
131
140
project_workspace. to_crate_graph (
132
141
& 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 ) ) )
137
145
}
138
146
} ,
139
147
& Default :: default ( ) ,
@@ -221,6 +229,33 @@ fn rust_project_is_proc_macro_has_proc_macro_dep() {
221
229
crate_data. dependencies . iter ( ) . find ( |& dep| dep. name . deref ( ) == "proc_macro" ) . unwrap ( ) ;
222
230
}
223
231
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
+
224
259
#[ test]
225
260
fn smoke_test_real_sysroot_cargo ( ) {
226
261
let file_map = & mut FxHashMap :: < AbsPathBuf , FileId > :: default ( ) ;
0 commit comments