@@ -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