@@ -455,6 +455,11 @@ defmodule Kernel.ParallelCompiler do
455
455
# No more queue, nothing waiting, this cycle is done
456
456
defp spawn_workers ( [ ] , spawned , waiting , files , result , warnings , errors , state )
457
457
when map_size ( spawned ) == 0 and map_size ( waiting ) == 0 do
458
+ # Print any spurious error that we may have found
459
+ Enum . map ( errors , fn { diagnostic , read_snippet } ->
460
+ :elixir_errors . print_diagnostic ( diagnostic , read_snippet )
461
+ end )
462
+
458
463
[ ] = files
459
464
cycle_return = each_cycle_return ( state . each_cycle . ( ) )
460
465
state = cycle_timing ( result , state )
@@ -509,8 +514,9 @@ defmodule Kernel.ParallelCompiler do
509
514
if deadlocked do
510
515
spawn_workers ( deadlocked , spawned , waiting , files , result , warnings , errors , state )
511
516
else
512
- deadlock_errors = handle_deadlock ( waiting , files )
513
- { return_error ( deadlock_errors ++ errors , warnings ) , state }
517
+ return_error ( warnings , errors , state , fn ->
518
+ handle_deadlock ( waiting , files )
519
+ end )
514
520
end
515
521
end
516
522
@@ -680,12 +686,13 @@ defmodule Kernel.ParallelCompiler do
680
686
state = % { state | timer_ref: timer_ref }
681
687
spawn_workers ( queue , spawned , waiting , files , result , warnings , errors , state )
682
688
683
- { :diagnostic , % { severity: :warning } = diagnostic } ->
684
- warnings = [ Module.ParallelChecker . format_diagnostic_file ( diagnostic ) | warnings ]
689
+ { :diagnostic , % { severity: :warning , file: file } = diagnostic , read_snippet } ->
690
+ :elixir_errors . print_diagnostic ( diagnostic , read_snippet )
691
+ warnings = [ % { diagnostic | file: file && Path . absname ( file ) } | warnings ]
685
692
wait_for_messages ( queue , spawned , waiting , files , result , warnings , errors , state )
686
693
687
- { :diagnostic , % { severity: :error } = diagnostic } ->
688
- errors = [ Module.ParallelChecker . format_diagnostic_file ( diagnostic ) | errors ]
694
+ { :diagnostic , % { severity: :error } = diagnostic , read_snippet } ->
695
+ errors = [ { diagnostic , read_snippet } | errors ]
689
696
wait_for_messages ( queue , spawned , waiting , files , result , warnings , errors , state )
690
697
691
698
{ :file_ok , child_pid , ref , file , lexical } ->
@@ -705,10 +712,13 @@ defmodule Kernel.ParallelCompiler do
705
712
spawn_workers ( queue , new_spawned , waiting , new_files , result , warnings , errors , state )
706
713
707
714
{ :file_error , child_pid , file , { kind , reason , stack } } ->
708
- print_error ( file , kind , reason , stack )
709
715
{ _file , _new_spawned , new_files } = discard_file_pid ( spawned , files , child_pid )
710
716
terminate ( new_files )
711
- { return_error ( [ to_error ( file , kind , reason , stack ) | errors ] , warnings ) , state }
717
+
718
+ return_error ( warnings , errors , state , fn ->
719
+ print_error ( file , kind , reason , stack )
720
+ [ to_error ( file , kind , reason , stack ) ]
721
+ end )
712
722
713
723
{ :DOWN , ref , :process , pid , reason } when is_map_key ( spawned , ref ) ->
714
724
# async spawned processes have no file, so we always have to delete the ref directly
@@ -717,18 +727,27 @@ defmodule Kernel.ParallelCompiler do
717
727
{ file , spawned , files } = discard_file_pid ( spawned , files , pid )
718
728
719
729
if file do
720
- print_error ( file . file , :exit , reason , [ ] )
721
730
terminate ( files )
722
- { return_error ( [ to_error ( file . file , :exit , reason , [ ] ) | errors ] , warnings ) , state }
731
+
732
+ return_error ( warnings , errors , state , fn ->
733
+ print_error ( file . file , :exit , reason , [ ] )
734
+ [ to_error ( file . file , :exit , reason , [ ] ) ]
735
+ end )
723
736
else
724
737
wait_for_messages ( queue , spawned , waiting , files , result , warnings , errors , state )
725
738
end
726
739
end
727
740
end
728
741
729
- defp return_error ( errors , warnings ) do
742
+ defp return_error ( warnings , errors , state , fun ) do
743
+ errors =
744
+ Enum . map ( errors , fn { % { file: file } = diagnostic , read_snippet } ->
745
+ :elixir_errors . print_diagnostic ( diagnostic , read_snippet )
746
+ % { diagnostic | file: file && Path . absname ( file ) }
747
+ end )
748
+
730
749
info = % { compile_warnings: Enum . reverse ( warnings ) , runtime_warnings: [ ] }
731
- { :error , Enum . reverse ( errors ) , info }
750
+ { { :error , Enum . reverse ( errors , fun . ( ) ) , info } , state }
732
751
end
733
752
734
753
defp update_result ( result , kind , module , value ) do
0 commit comments