@@ -49,8 +49,8 @@ defmodule Module.Types do
49
49
finder =
50
50
fn fun_arity ->
51
51
case :lists . keyfind ( fun_arity , 1 , defs ) do
52
- { _ , kind , _ , _ } = clause ->
53
- { infer_mode ( kind , infer_signatures? ) , clause , default_domain ( fun_arity , impl ) }
52
+ { _ , kind , _ , _ } = def ->
53
+ default_domain ( infer_mode ( kind , infer_signatures? ) , def , fun_arity , impl )
54
54
55
55
false ->
56
56
false
@@ -82,7 +82,7 @@ defmodule Module.Types do
82
82
{ types , context } ->
83
83
# Optimized version of finder, since we already the definition
84
84
finder = fn _ ->
85
- { infer_mode ( kind , infer_signatures? ) , def , default_domain ( fun_arity , impl ) }
85
+ default_domain ( infer_mode ( kind , infer_signatures? ) , def , fun_arity , impl )
86
86
end
87
87
88
88
{ _kind , inferred , context } = local_handler ( meta , fun_arity , stack , context , finder )
@@ -146,12 +146,24 @@ defmodule Module.Types do
146
146
end
147
147
end
148
148
149
- defp default_domain ( { _ , arity } = fun_arity , impl ) do
149
+ defp default_domain ( mode , def , { _ , arity } = fun_arity , impl ) do
150
150
with { for , callbacks } <- impl ,
151
151
true <- fun_arity in callbacks do
152
- [ Descr . dynamic ( Module.Types.Of . impl ( for ) ) | List . duplicate ( Descr . dynamic ( ) , arity - 1 ) ]
152
+ args = [
153
+ Descr . dynamic ( Module.Types.Of . impl ( for ) )
154
+ | List . duplicate ( Descr . dynamic ( ) , arity - 1 )
155
+ ]
156
+
157
+ { fun_arity , kind , meta , clauses } = def
158
+
159
+ clauses =
160
+ for { meta , args , guards , body } <- clauses do
161
+ { [ type_check: { :impl , for } ] ++ meta , args , guards , body }
162
+ end
163
+
164
+ { mode , { fun_arity , kind , meta , clauses } , args }
153
165
else
154
- _ -> List . duplicate ( Descr . dynamic ( ) , arity )
166
+ _ -> { mode , def , List . duplicate ( Descr . dynamic ( ) , arity ) }
155
167
end
156
168
end
157
169
@@ -208,7 +220,7 @@ defmodule Module.Types do
208
220
209
221
finder = fn fun_arity ->
210
222
case :lists . keyfind ( fun_arity , 1 , defs ) do
211
- { _ , _ , _ , _ } = clause -> { :dynamic , clause , default_domain ( fun_arity , impl ) }
223
+ { _ , _ , _ , _ } = def -> default_domain ( :dynamic , def , fun_arity , impl )
212
224
false -> false
213
225
end
214
226
end
@@ -219,7 +231,7 @@ defmodule Module.Types do
219
231
context =
220
232
Enum . reduce ( defs , context ( ) , fn { fun_arity , _kind , meta , _clauses } = def , context ->
221
233
# Optimized version of finder, since we already the definition
222
- finder = fn _ -> { :dynamic , def , default_domain ( fun_arity , impl ) } end
234
+ finder = fn _ -> default_domain ( :dynamic , def , fun_arity , impl ) end
223
235
{ _kind , _inferred , context } = local_handler ( meta , fun_arity , stack , context , finder )
224
236
context
225
237
end )
0 commit comments