@@ -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 =
@@ -665,11 +667,9 @@ defmodule Protocol do
665667 end
666668 end
667669
668- fun_arities = :sets . from_list ( protocol . __protocol__ ( :functions ) , version: 2 )
669-
670670 new_signatures =
671671 for { { _fun , arity } = fun_arity , :def , _ , _ } <- definitions ,
672- :sets . is_element ( fun_arity , fun_arities ) do
672+ fun_arity in protocol_funs do
673673 rest = List . duplicate ( Descr . term ( ) , arity - 1 )
674674 { fun_arity , { :strong , nil , [ { [ domain | rest ] , Descr . dynamic ( ) } ] } }
675675 end
@@ -680,6 +680,13 @@ defmodule Protocol do
680680 ] ++ new_signatures
681681 end
682682
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 )
688+ end
689+
683690 defp change_protocol ( { _name , _kind , meta , clauses } , types ) do
684691 clauses =
685692 Enum . map ( clauses , fn
0 commit comments