@@ -472,19 +472,27 @@ defmodule Module.Types.Apply do
472
472
Returns the type of a remote capture.
473
473
"""
474
474
def remote_capture ( modules , fun , arity , meta , stack , context ) do
475
- # TODO: We cannot return the unions of functions. Do we forbid this ?
476
- # Do we check it is always the same return type? Do we simply say it is a function?
477
- if stack . mode == :traversal do
475
+ # TODO: Do we check when the union of functions is invalid ?
476
+ # TODO: Deal with :infer types
477
+ if stack . mode == :traversal or modules == [ ] do
478
478
{ dynamic ( fun ( arity ) ) , context }
479
479
else
480
- context =
481
- Enum . reduce (
482
- modules ,
483
- context ,
484
- & ( signature ( & 1 , fun , arity , meta , stack , & 2 ) |> elem ( 1 ) )
485
- )
480
+ { type , fallback? , context } =
481
+ Enum . reduce ( modules , { none ( ) , false , context } , fn module , { type , fallback? , context } ->
482
+ case signature ( module , fun , arity , meta , stack , context ) do
483
+ { { :strong , _ , clauses } , context } ->
484
+ { union ( type , fun_from_non_overlapping_clauses ( clauses ) ) , fallback? , context }
485
+
486
+ { _ , context } ->
487
+ { type , true , context }
488
+ end
489
+ end )
486
490
487
- { dynamic ( fun ( arity ) ) , context }
491
+ if fallback? do
492
+ { dynamic ( fun ( arity ) ) , context }
493
+ else
494
+ { type , context }
495
+ end
488
496
end
489
497
end
490
498
@@ -496,10 +504,10 @@ defmodule Module.Types.Apply do
496
504
497
505
* `:none` - no typing information found.
498
506
499
- * `{:infer, domain or nil, clauses}` - clauses from inferences. You must check all
500
- all clauses and return the union between them. They are dynamic
501
- and they can only be converted into arrows by computing the union
502
- of all arguments.
507
+ * `{:infer, domain or nil, clauses}` - clauses from inferences.
508
+ You must check all clauses and return the union between them.
509
+ They are dynamic and they can only be converted into arrows by
510
+ computing the union of all arguments.
503
511
504
512
* `{:strong, domain or nil, clauses}` - clauses from signatures. So far
505
513
these are strong arrows with non-overlapping domains
0 commit comments