@@ -349,9 +349,9 @@ defmodule Kernel.Typespec do
349
349
do_deftype ( kind , type , { :term , [ line: caller . line ] , nil } , caller )
350
350
end
351
351
352
- def deftype ( _kind , other , _caller ) do
352
+ def deftype ( _kind , other , caller ) do
353
353
type_spec = Macro . to_string ( other )
354
- raise ArgumentError , message: "invalid type specification #{ type_spec } "
354
+ compile_error caller , "invalid type specification #{ type_spec } "
355
355
end
356
356
357
357
defp do_deftype ( kind , { name , _ , args } , definition , caller ) do
@@ -390,9 +390,9 @@ defmodule Kernel.Typespec do
390
390
code
391
391
end
392
392
393
- def defspec ( _type , other , _caller ) do
393
+ def defspec ( _type , other , caller ) do
394
394
spec = Macro . to_string ( other )
395
- raise ArgumentError , message: "invalid function type specification #{ spec } "
395
+ compile_error caller , "invalid function type specification #{ spec } "
396
396
end
397
397
398
398
defp guard_to_constraints ( { :is_subtype , meta , [ { name , _ , _ } , type ] } , caller ) do
@@ -591,9 +591,11 @@ defmodule Kernel.Typespec do
591
591
end
592
592
593
593
# Handle remote calls
594
- defp typespec ( { { :. , meta , [ remote , name ] } , _ , args } , vars , caller ) do
594
+ defp typespec ( { { :. , meta , [ remote , name ] } , _ , args } = orig , vars , caller ) do
595
595
remote = Macro . expand remote , caller
596
- unless is_atom ( remote ) , do: raise ( ArgumentError , message: "invalid remote in typespec" )
596
+ unless is_atom ( remote ) do
597
+ compile_error ( caller , "invalid remote in typespec: #{ Macro . to_string ( orig ) } " )
598
+ end
597
599
remote_type ( { typespec ( remote , vars , caller ) , meta , typespec ( name , vars , caller ) , args } , vars , caller )
598
600
end
599
601
@@ -668,8 +670,8 @@ defmodule Kernel.Typespec do
668
670
end
669
671
670
672
defp typespec ( [ h | t ] = l , vars , caller ) do
671
- union = Enum . reduce ( t , validate_kw ( h , l ) , fn ( x , acc ) ->
672
- { :| , [ ] , [ acc , validate_kw ( x , l ) ] }
673
+ union = Enum . reduce ( t , validate_kw ( h , l , caller ) , fn ( x , acc ) ->
674
+ { :| , [ ] , [ acc , validate_kw ( x , l , caller ) ] }
673
675
end )
674
676
typespec ( { :list , [ ] , [ union ] } , vars , caller )
675
677
end
@@ -681,6 +683,10 @@ defmodule Kernel.Typespec do
681
683
682
684
## Helpers
683
685
686
+ defp compile_error ( caller , desc ) do
687
+ raise CompileError , file: caller . file , line: caller . line , description: desc
688
+ end
689
+
684
690
defp remote_type ( { remote , meta , name , arguments } , vars , caller ) do
685
691
arguments = lc arg inlist arguments , do: typespec ( arg , vars , caller )
686
692
{ :remote_type , line ( meta ) , [ remote , name , arguments ] }
@@ -689,9 +695,9 @@ defmodule Kernel.Typespec do
689
695
defp collect_union ( { :| , _ , [ a , b ] } ) , do: [ b | collect_union ( a ) ]
690
696
defp collect_union ( v ) , do: [ v ]
691
697
692
- defp validate_kw ( { key , _ } = t , _ ) when is_atom ( key ) , do: t
693
- defp validate_kw ( _ , original ) do
694
- raise ArgumentError , message: "unexpected list #{ inspect original } in typespec"
698
+ defp validate_kw ( { key , _ } = t , _ , _caller ) when is_atom ( key ) , do: t
699
+ defp validate_kw ( _ , original , caller ) do
700
+ compile_error ( caller , "unexpected list #{ Macro . to_string original } in typespec" )
695
701
end
696
702
697
703
defp fn_args ( meta , args , return , vars , caller ) do
0 commit comments