1
1
use crate :: bsconfig;
2
2
use crate :: bsconfig:: * ;
3
3
use crate :: helpers;
4
+ use crate :: helpers:: get_build_path;
4
5
use crate :: helpers:: get_package_path;
5
6
use crate :: structure_hashmap;
6
7
use ahash:: { AHashMap , AHashSet } ;
7
8
use convert_case:: { Case , Casing } ;
8
9
use rayon:: prelude:: * ;
9
10
use std:: fs;
10
11
use std:: hash:: { Hash , Hasher } ;
12
+ use std:: path:: PathBuf ;
11
13
12
14
#[ derive( Debug , Clone ) ]
13
15
pub struct Package {
@@ -18,6 +20,7 @@ pub struct Package {
18
20
pub namespace : Option < String > ,
19
21
pub modules : Option < AHashSet < String > > ,
20
22
pub package_dir : String ,
23
+ pub dirs : Option < AHashSet < PathBuf > > ,
21
24
}
22
25
23
26
impl PartialEq for Package {
@@ -150,6 +153,7 @@ fn build_package<'a>(
150
153
} ,
151
154
modules : None ,
152
155
package_dir : package_dir. to_string ( ) ,
156
+ dirs : None ,
153
157
}
154
158
} ) ;
155
159
@@ -243,6 +247,16 @@ fn extend_with_children(mut build: AHashMap<String, Package>) -> AHashMap<String
243
247
None => ( ) ,
244
248
}
245
249
value. modules = Some ( modules) ;
250
+ let mut dirs = AHashSet :: new ( ) ;
251
+ map. keys ( ) . for_each ( |path| {
252
+ let dir = std:: path:: Path :: new ( & path)
253
+ . strip_prefix ( & value. package_dir )
254
+ . unwrap ( )
255
+ . parent ( )
256
+ . unwrap ( ) ;
257
+ dirs. insert ( dir. to_owned ( ) ) ;
258
+ } ) ;
259
+ value. dirs = Some ( dirs) ;
246
260
value. source_files = Some ( map) ;
247
261
}
248
262
build
@@ -254,15 +268,27 @@ fn extend_with_children(mut build: AHashMap<String, Package>) -> AHashMap<String
254
268
/// 2. Take the (by then deduplicated) packages, and find all the '.re', '.res', '.ml' and
255
269
/// interface files.
256
270
/// The two step process is there to reduce IO overhead
257
- pub fn make ( folder : & str ) -> AHashMap < String , Package > {
271
+ pub fn make ( root_folder : & str ) -> AHashMap < String , Package > {
258
272
/* The build_package get's called recursively. By using extend, we deduplicate all the packages
259
273
* */
260
274
let mut map: AHashMap < String , Package > = AHashMap :: new ( ) ;
261
275
262
- let package_dir = get_package_dir ( "" , true , folder ) ;
276
+ let package_dir = get_package_dir ( "" , true , root_folder ) ;
263
277
let bsconfig = read_bsconfig ( & package_dir) ;
264
- build_package ( & mut map, bsconfig, & package_dir, folder ) ;
278
+ build_package ( & mut map, bsconfig, & package_dir, root_folder ) ;
265
279
/* Once we have the deduplicated packages, we can add the source files for each - to minimize
266
280
* the IO */
267
- extend_with_children ( map)
281
+ let result = extend_with_children ( map) ;
282
+ result
283
+ . values ( )
284
+ . into_iter ( )
285
+ . for_each ( |package| match & package. dirs {
286
+ Some ( dirs) => dirs. iter ( ) . for_each ( |dir| {
287
+ let _ = std:: fs:: create_dir_all (
288
+ std:: path:: Path :: new ( & get_build_path ( root_folder, & package. name ) ) . join ( dir) ,
289
+ ) ;
290
+ } ) ,
291
+ None => ( ) ,
292
+ } ) ;
293
+ result
268
294
}
0 commit comments