@@ -20,7 +20,7 @@ pub fn compile(
20
20
build_state : & mut BuildState ,
21
21
inc : impl Fn ( ) + std:: marker:: Sync ,
22
22
set_length : impl Fn ( u64 ) ,
23
- ) -> ( String , String , usize ) {
23
+ ) -> Result < ( String , String , usize ) > {
24
24
let mut compiled_modules = AHashSet :: < String > :: new ( ) ;
25
25
let dirty_modules = build_state
26
26
. modules
@@ -107,9 +107,9 @@ pub fn compile(
107
107
108
108
let current_in_progres_modules = in_progress_modules. clone ( ) ;
109
109
110
- current_in_progres_modules
110
+ let results = current_in_progres_modules
111
111
. par_iter ( )
112
- . map ( |module_name| {
112
+ . filter_map ( |module_name| {
113
113
let module = build_state. get_module ( module_name) . unwrap ( ) ;
114
114
let package = build_state
115
115
. get_package ( & module. package_name )
@@ -185,17 +185,8 @@ pub fn compile(
185
185
& build_state. project_root ,
186
186
& build_state. workspace_root ,
187
187
) ;
188
- // if let Err(error) = result.to_owned() {
189
- // println!("{}", error);
190
- // panic!("Implementation compilation error!");
191
- // }
192
188
let cmi_digest_after = helpers:: compute_file_hash ( & cmi_path) ;
193
189
194
- // println!(
195
- // "cmi path {}, digest: {:?} / {:?}",
196
- // cmi_path, cmi_digest, cmi_digest_after
197
- // );
198
-
199
190
// we want to compare both the hash of interface and the implementation
200
191
// compile assets to verify that nothing changed. We also need to checke the interface
201
192
// because we can include MyModule, so the modules that depend on this module might
@@ -226,105 +217,105 @@ pub fn compile(
226
217
}
227
218
} )
228
219
} )
229
- . collect :: < Vec < _ > > ( )
230
- . iter ( )
231
- . for_each ( |result| {
232
- if let Some ( ( module_name, result, interface_result, is_clean, is_compiled) ) = result {
233
- in_progress_modules. remove ( module_name) ;
234
-
235
- if * is_compiled {
236
- num_compiled_modules += 1 ;
237
- }
220
+ . collect :: < Vec < _ > > ( ) ;
238
221
239
- files_current_loop_count += 1 ;
240
- compiled_modules. insert ( module_name. to_string ( ) ) ;
222
+ for result in results. iter ( ) {
223
+ let ( module_name, result, interface_result, is_clean, is_compiled) = result;
224
+ in_progress_modules. remove ( module_name) ;
241
225
242
- if * is_clean {
243
- // actually add it to a list of clean modules
244
- clean_modules. insert ( module_name. to_string ( ) ) ;
245
- }
226
+ if * is_compiled {
227
+ num_compiled_modules += 1 ;
228
+ }
229
+
230
+ files_current_loop_count += 1 ;
231
+ compiled_modules. insert ( module_name. to_string ( ) ) ;
246
232
247
- let module_dependents = build_state. get_module ( module_name) . unwrap ( ) . dependents . clone ( ) ;
233
+ if * is_clean {
234
+ // actually add it to a list of clean modules
235
+ clean_modules. insert ( module_name. to_string ( ) ) ;
236
+ }
237
+
238
+ let module_dependents = build_state. get_module ( module_name) . unwrap ( ) . dependents . clone ( ) ;
248
239
249
- // if not clean -- compile modules that depend on this module
250
- for dep in module_dependents. iter ( ) {
251
- // mark the reverse dep as dirty when the source is not clean
252
- if !* is_clean {
253
- let dep_module = build_state. modules . get_mut ( dep) . unwrap ( ) ;
254
- // mark the reverse dep as dirty when the source is not clean
255
- dep_module. compile_dirty = true ;
240
+ // if not clean -- compile modules that depend on this module
241
+ for dep in module_dependents. iter ( ) {
242
+ // mark the reverse dep as dirty when the source is not clean
243
+ if !* is_clean {
244
+ let dep_module = build_state. modules . get_mut ( dep) . unwrap ( ) ;
245
+ // mark the reverse dep as dirty when the source is not clean
246
+ dep_module. compile_dirty = true ;
247
+ }
248
+ if !compiled_modules. contains ( dep) {
249
+ in_progress_modules. insert ( dep. to_string ( ) ) ;
250
+ }
251
+ }
252
+
253
+ let module = build_state
254
+ . modules
255
+ . get_mut ( module_name)
256
+ . ok_or ( anyhow ! ( "Module not found" ) ) ?;
257
+
258
+ let package = build_state
259
+ . packages
260
+ . get ( & module. package_name )
261
+ . ok_or ( anyhow ! ( "Package name not found" ) ) ?;
262
+
263
+ match module. source_type {
264
+ SourceType :: MlMap ( ref mut mlmap) => {
265
+ module. compile_dirty = false ;
266
+ mlmap. parse_dirty = false ;
267
+ }
268
+ SourceType :: SourceFile ( ref mut source_file) => {
269
+ match result {
270
+ Ok ( Some ( err) ) => {
271
+ source_file. implementation . compile_state = CompileState :: Warning ;
272
+ logs:: append ( package, err) ;
273
+ compile_warnings. push_str ( err) ;
256
274
}
257
- if !compiled_modules. contains ( dep) {
258
- in_progress_modules. insert ( dep. to_string ( ) ) ;
275
+ Ok ( None ) => {
276
+ source_file. implementation . compile_state = CompileState :: Success ;
277
+ }
278
+ Err ( err) => {
279
+ source_file. implementation . compile_state = CompileState :: Error ;
280
+ logs:: append ( package, & err. to_string ( ) ) ;
281
+ compile_errors. push_str ( & err. to_string ( ) ) ;
282
+ }
283
+ } ;
284
+ match interface_result {
285
+ Some ( Ok ( Some ( err) ) ) => {
286
+ source_file. interface . as_mut ( ) . unwrap ( ) . compile_state = CompileState :: Warning ;
287
+ logs:: append ( package, & err. to_string ( ) ) ;
288
+ compile_warnings. push_str ( & err. to_string ( ) ) ;
289
+ }
290
+ Some ( Ok ( None ) ) => {
291
+ if let Some ( interface) = source_file. interface . as_mut ( ) {
292
+ interface. compile_state = CompileState :: Success ;
293
+ }
259
294
}
260
- }
261
295
262
- let module = build_state. modules . get_mut ( module_name) . unwrap ( ) ;
263
- let package = build_state
264
- . packages
265
- . get ( & module. package_name )
266
- . expect ( "Package not found" ) ;
267
- match module. source_type {
268
- SourceType :: MlMap ( ref mut mlmap) => {
269
- module. compile_dirty = false ;
270
- mlmap. parse_dirty = false ;
296
+ Some ( Err ( err) ) => {
297
+ source_file. interface . as_mut ( ) . unwrap ( ) . compile_state = CompileState :: Error ;
298
+ logs:: append ( package, & err. to_string ( ) ) ;
299
+ compile_errors. push_str ( & err. to_string ( ) ) ;
271
300
}
272
- SourceType :: SourceFile ( ref mut source_file) => {
273
- match result {
274
- Ok ( Some ( err) ) => {
275
- source_file. implementation . compile_state = CompileState :: Warning ;
276
- logs:: append ( package, err) ;
277
- compile_warnings. push_str ( err) ;
278
- }
279
- Ok ( None ) => {
280
- source_file. implementation . compile_state = CompileState :: Success ;
281
- }
282
- Err ( err) => {
283
- source_file. implementation . compile_state = CompileState :: Error ;
284
- logs:: append ( package, & err. to_string ( ) ) ;
285
- compile_errors. push_str ( & err. to_string ( ) ) ;
286
- }
287
- } ;
288
- match interface_result {
289
- Some ( Ok ( Some ( err) ) ) => {
290
- source_file. interface . as_mut ( ) . unwrap ( ) . compile_state =
291
- CompileState :: Warning ;
292
- logs:: append ( package, & err. to_string ( ) ) ;
293
- compile_warnings. push_str ( & err. to_string ( ) ) ;
294
- }
295
- Some ( Ok ( None ) ) => {
296
- if let Some ( interface) = source_file. interface . as_mut ( ) {
297
- interface. compile_state = CompileState :: Success ;
298
- }
299
- }
301
+ _ => ( ) ,
302
+ } ;
300
303
301
- Some ( Err ( err) ) => {
302
- source_file. interface . as_mut ( ) . unwrap ( ) . compile_state =
303
- CompileState :: Error ;
304
- logs:: append ( package, & err. to_string ( ) ) ;
305
- compile_errors. push_str ( & err. to_string ( ) ) ;
306
- }
307
- _ => ( ) ,
308
- } ;
309
- match ( result, interface_result) {
310
- // successfull compilation
311
- ( Ok ( None ) , Some ( Ok ( None ) ) ) | ( Ok ( None ) , None ) => {
312
- module. compile_dirty = false ;
313
- module. last_compiled_cmi = Some ( SystemTime :: now ( ) ) ;
314
- module. last_compiled_cmt = Some ( SystemTime :: now ( ) ) ;
315
- }
316
- // some error or warning
317
- ( Err ( _) , _)
318
- | ( _, Some ( Err ( _) ) )
319
- | ( Ok ( Some ( _) ) , _)
320
- | ( _, Some ( Ok ( Some ( _) ) ) ) => {
321
- module. compile_dirty = true ;
322
- }
323
- }
304
+ match ( result, interface_result) {
305
+ // successfull compilation
306
+ ( Ok ( None ) , Some ( Ok ( None ) ) ) | ( Ok ( None ) , None ) => {
307
+ module. compile_dirty = false ;
308
+ module. last_compiled_cmi = Some ( SystemTime :: now ( ) ) ;
309
+ module. last_compiled_cmt = Some ( SystemTime :: now ( ) ) ;
310
+ }
311
+ // some error or warning
312
+ ( Err ( _) , _) | ( _, Some ( Err ( _) ) ) | ( Ok ( Some ( _) ) , _) | ( _, Some ( Ok ( Some ( _) ) ) ) => {
313
+ module. compile_dirty = true ;
324
314
}
325
315
}
326
316
}
327
- } ) ;
317
+ }
318
+ }
328
319
329
320
files_total_count += files_current_loop_count;
330
321
@@ -339,6 +330,7 @@ pub fn compile(
339
330
. map ( |s| ( s, build_state. get_module ( s) . unwrap ( ) ) )
340
331
. collect :: < Vec < ( & String , & Module ) > > ( ) ,
341
332
) ;
333
+
342
334
compile_errors. push_str ( & format ! (
343
335
"\n {}\n {}\n " ,
344
336
style( "Can't continue... Found a circular dependency in your code:" ) . red( ) ,
@@ -350,7 +342,7 @@ pub fn compile(
350
342
} ;
351
343
}
352
344
353
- ( compile_errors, compile_warnings, num_compiled_modules)
345
+ Ok ( ( compile_errors, compile_warnings, num_compiled_modules) )
354
346
}
355
347
356
348
pub fn compiler_args (
@@ -554,7 +546,11 @@ fn compile_file(
554
546
let stdout = String :: from_utf8_lossy ( & x. stdout ) ;
555
547
Err ( anyhow ! ( stderr. to_string( ) + & stdout) )
556
548
}
557
- Err ( e) => Err ( anyhow ! ( "Could not compile file. Error: {}. Path to AST: {:?}" , e, ast_path) ) ,
549
+ Err ( e) => Err ( anyhow ! (
550
+ "Could not compile file. Error: {}. Path to AST: {:?}" ,
551
+ e,
552
+ ast_path
553
+ ) ) ,
558
554
Ok ( x) => {
559
555
let err = std:: str:: from_utf8 ( & x. stderr )
560
556
. expect ( "stdout should be non-null" )
0 commit comments