@@ -82,7 +82,7 @@ defmodule Kernel.ParallelCompiler do
8282 { compiler_pid , file_pid } = :erlang . get ( :elixir_compiler_info )
8383 defining = :elixir_module . compiler_modules ( )
8484 on = Enum . map ( refs_tasks , fn { _ref , % { pid: pid } } -> pid end )
85- send ( compiler_pid , { :waiting , :pmap , self ( ) , ref , file_pid , on , defining , :raise } )
85+ send ( compiler_pid , { :waiting , :pmap , self ( ) , ref , file_pid , nil , on , defining , :raise } )
8686
8787 # Now we allow the tasks to run. This step is not strictly
8888 # necessary but it makes compilation more deterministic by
@@ -416,7 +416,7 @@ defmodule Kernel.ParallelCompiler do
416416 defp spawn_workers ( [ { pid , found } | t ] , spawned , waiting , files , result , warnings , errors , state ) do
417417 { files , waiting } =
418418 case Map . pop ( waiting , pid ) do
419- { { kind , ref , file_pid , on , _defining , _deadlock } , waiting } ->
419+ { % { kind: kind , ref: ref , file_pid: file_pid , on: on } , waiting } ->
420420 send ( pid , { ref , found } )
421421 { update_timing ( files , file_pid , { :waiting , kind , on } ) , waiting }
422422
@@ -607,22 +607,22 @@ defmodule Kernel.ParallelCompiler do
607607 defp without_definition ( waiting_list , files ) do
608608 nilify_empty_or_sort (
609609 for % { pid: file_pid } <- files ,
610- { pid , { _ , _ , ^ file_pid , on , _ , _ } } <- waiting_list ,
610+ { pid , % { file_pid: ^ file_pid , on: on } } <- waiting_list ,
611611 is_atom ( on ) and not defining? ( on , waiting_list ) ,
612612 do: { pid , :not_found }
613613 )
614614 end
615615
616616 defp deadlocked ( waiting_list , type , defining? ) do
617617 nilify_empty_or_sort (
618- for { pid , { _ , _ , _ , on , _ , ^ type } } <- waiting_list ,
618+ for { pid , % { on: on , deadlock: ^ type } } <- waiting_list ,
619619 is_atom ( on ) and defining? ( on , waiting_list ) == defining? ,
620620 do: { pid , :deadlock }
621621 )
622622 end
623623
624624 defp defining? ( on , waiting_list ) do
625- Enum . any? ( waiting_list , fn { _ , { _ , _ , _ , _ , defining , _ } } -> on in defining end )
625+ Enum . any? ( waiting_list , fn { _ , % { defining: defining } } -> on in defining end )
626626 end
627627
628628 defp nilify_empty_or_sort ( [ ] ) , do: nil
@@ -689,11 +689,12 @@ defmodule Kernel.ParallelCompiler do
689689 )
690690
691691 # If we are simply requiring files, we do not add to waiting.
692- { :waiting , _kind , child , ref , _file_pid , _on , _defining , _deadlock } when output == :require ->
692+ { :waiting , _kind , child , ref , _file_pid , _position , _on , _defining , _deadlock }
693+ when output == :require ->
693694 send ( child , { ref , :not_found } )
694695 spawn_workers ( queue , spawned , waiting , files , result , warnings , errors , state )
695696
696- { :waiting , kind , child_pid , ref , file_pid , on , defining , deadlock } ->
697+ { :waiting , kind , child_pid , ref , file_pid , position , on , defining , deadlock } ->
697698 # If we already got what we were waiting for, do not put it on waiting.
698699 # If we're waiting on ourselves, send :found so that we can crash with
699700 # a better error.
@@ -706,7 +707,17 @@ defmodule Kernel.ParallelCompiler do
706707 send ( child_pid , { ref , reply } )
707708 { waiting , files , result }
708709 else
709- waiting = Map . put ( waiting , child_pid , { kind , ref , file_pid , on , defining , deadlock } )
710+ waiting =
711+ Map . put ( waiting , child_pid , % {
712+ kind: kind ,
713+ ref: ref ,
714+ file_pid: file_pid ,
715+ position: position ,
716+ on: on ,
717+ defining: defining ,
718+ deadlock: deadlock
719+ } )
720+
710721 files = update_timing ( files , file_pid , :compiling )
711722 result = Map . put ( result , { kind , on } , [ child_pid | available_or_pending ] )
712723 { waiting , files , result }
@@ -760,7 +771,7 @@ defmodule Kernel.ParallelCompiler do
760771 terminate ( new_files )
761772
762773 return_error ( warnings , errors , state , fn ->
763- print_error ( file , kind , reason , stack )
774+ print_error ( file , nil , kind , reason , stack )
764775 [ to_error ( file , kind , reason , stack ) ]
765776 end )
766777
@@ -774,7 +785,7 @@ defmodule Kernel.ParallelCompiler do
774785 terminate ( files )
775786
776787 return_error ( warnings , errors , state , fn ->
777- print_error ( file . file , :exit , reason , [ ] )
788+ print_error ( file . file , nil , :exit , reason , [ ] )
778789 [ to_error ( file . file , :exit , reason , [ ] ) ]
779790 end )
780791 else
@@ -949,11 +960,11 @@ defmodule Kernel.ParallelCompiler do
949960 { :current_stacktrace , stacktrace } = Process . info ( pid , :current_stacktrace )
950961 Process . exit ( pid , :kill )
951962
952- { kind , _ , _ , on , _ , _ } = Map . fetch! ( waiting , pid )
963+ % { kind: kind , on: on , position: position } = Map . fetch! ( waiting , pid )
953964 description = "deadlocked waiting on #{ kind } #{ inspect ( on ) } "
954965 error = CompileError . exception ( description: description , file: nil , line: nil )
955- print_error ( file , :error , error , stacktrace )
956- { Path . relative_to_cwd ( file ) , on , description , stacktrace }
966+ print_error ( file , position , :error , error , stacktrace )
967+ { Path . relative_to_cwd ( file ) , position , on , description , stacktrace }
957968 end
958969
959970 IO . puts ( :stderr , """
@@ -967,24 +978,25 @@ defmodule Kernel.ParallelCompiler do
967978 |> Enum . map ( & ( & 1 |> elem ( 0 ) |> String . length ( ) ) )
968979 |> Enum . max ( )
969980
970- for { file , mod , _ , _ } <- deadlock do
981+ for { file , _ , mod , _ , _ } <- deadlock do
971982 IO . puts ( :stderr , [ " " , String . pad_leading ( file , max ) , " => " | inspect ( mod ) ] )
972983 end
973984
974985 IO . puts (
975986 :stderr ,
976987 "\n Ensure there are no compile-time dependencies between those files " <>
977- "and that the modules they reference exist and are correctly named\n "
988+ "(such as structs or macros) and that the modules they reference exist " <>
989+ "and are correctly named\n "
978990 )
979991
980- for { file , _ , description , stacktrace } <- deadlock do
992+ for { file , position , _ , description , stacktrace } <- deadlock do
981993 file = Path . absname ( file )
982994
983995 % {
984996 severity: :error ,
985997 file: file ,
986998 source: file ,
987- position: nil ,
999+ position: position ,
9881000 message: description ,
9891001 stacktrace: stacktrace ,
9901002 span: nil
@@ -1004,9 +1016,11 @@ defmodule Kernel.ParallelCompiler do
10041016 :ok
10051017 end
10061018
1007- defp print_error ( file , kind , reason , stack ) do
1019+ defp print_error ( file , position , kind , reason , stack ) do
1020+ position = if is_integer ( position ) , do: ":#{ position } " , else: ""
1021+
10081022 IO . write ( :stderr , [
1009- "\n == Compilation error in file #{ Path . relative_to_cwd ( file ) } ==\n " ,
1023+ "\n == Compilation error in file #{ Path . relative_to_cwd ( file ) } #{ position } ==\n " ,
10101024 Kernel.CLI . format_error ( kind , reason , stack )
10111025 ] )
10121026 end
0 commit comments