@@ -614,10 +614,12 @@ defmodule Protocol do
614614 { impl_for! , definitions } = List . keytake ( definitions , { :impl_for! , 1 } , 0 )
615615 { struct_impl_for , definitions } = List . keytake ( definitions , { :struct_impl_for , 1 } , 0 )
616616
617+ protocol_funs = get_protocol_functions ( protocol_def )
618+
617619 protocol_def = change_protocol ( protocol_def , types )
618620 impl_for = change_impl_for ( impl_for , protocol , types )
619621 struct_impl_for = change_struct_impl_for ( struct_impl_for , protocol , types , structs )
620- new_signatures = new_signatures ( definitions , protocol , types )
622+ new_signatures = new_signatures ( definitions , protocol_funs , protocol , types )
621623
622624 definitions = [ protocol_def , impl_for , impl_for! , struct_impl_for ] ++ definitions
623625 signatures = Enum . into ( new_signatures , signatures )
@@ -628,7 +630,7 @@ defmodule Protocol do
628630 end
629631 end
630632
631- defp new_signatures ( definitions , protocol , types ) do
633+ defp new_signatures ( definitions , protocol_funs , protocol , types ) do
632634 alias Module.Types.Descr
633635
634636 clauses =
@@ -666,9 +668,10 @@ defmodule Protocol do
666668 end
667669
668670 new_signatures =
669- for { { fun , arity } , :def , _ , _ } <- definitions do
671+ for { { _fun , arity } = fun_arity , :def , _ , _ } <- definitions ,
672+ fun_arity in protocol_funs do
670673 rest = List . duplicate ( Descr . term ( ) , arity - 1 )
671- { { fun , arity } , { :strong , nil , [ { [ domain | rest ] , Descr . dynamic ( ) } ] } }
674+ { fun_arity , { :strong , nil , [ { [ domain | rest ] , Descr . dynamic ( ) } ] } }
672675 end
673676
674677 [
@@ -677,6 +680,13 @@ defmodule Protocol do
677680 ] ++ new_signatures
678681 end
679682
683+ defp get_protocol_functions ( { _name , _kind , _meta , clauses } ) do
684+ Enum . find_value ( clauses , fn
685+ { _meta , [ :functions ] , [ ] , clauses } -> clauses
686+ _ -> nil
687+ end ) || raise "could not find protocol functions"
688+ end
689+
680690 defp change_protocol ( { _name , _kind , meta , clauses } , types ) do
681691 clauses =
682692 Enum . map ( clauses , fn
0 commit comments