roc/crates/compiler/uitest/tests/recursion
Ayaz Hafiz b9ab93fd98
Introduce annotation in first step of recursive solving independently
The algorithm for solving recursive definitions proceeds in several
steps. There are three main phases: introduction of what's known,
solving what's not known, and then checking our work of what was
inferred against what the programmer claimed. Concretely:

1. All explicitly-annotated signatures in the mutually recursive set are
   introduced and let-generalized.
2. Then, inference type variables (`_`) and unannotated def signatures are
   introduced to the cycle, without generalization. The bodies of these
   defs, that are either unannotated or have inference variables, are
   solved.
3. The defs from step (2) are now let-generalized, since we now know
   that their types are consistent. At this point, all the defs in the
   cycle have their types introduced and let-generalized, but we still
   haven't checked the bodies of the defs froom step (1).
4. Check the bodies of explicitly-annotated defs in recursive set. This
   might materially affect the actual types in the signature, for
   example do to fixpoint-fixing or alias expansion.
5. As a result of (4) possibly changing the structure of the annotated
   type, and because the previous annotated types in (1) were introduced
   at a lower rank, we now re-introduce and re-generalize the solved def
   types, in the same we did in step (3).
5. The rest of the program is solved.

Now, a very important thing here is that the annotation signature
introduced for (1) consists of different type variables than the
annotation signature introduced in (5). The reason is that they live at
different ranks. Prior to this patch we were not explicilty doing so;
this commit ensures that we do.
2023-04-10 16:31:00 -05:00
..
choose_correct_recursion_var_under_record.txt Migrate couple more tests 2023-04-02 12:53:06 -05:00
constrain_recursive_annotation_independently_issue_5256.txt Introduce annotation in first step of recursive solving independently 2023-04-10 16:31:00 -05:00
issue_3261.txt Migrate polymorphic lambda set specialization tests 2023-04-02 13:12:51 -05:00
issue_4246_admit_recursion_between_opaque_functions.txt Move uitests to their own crate 2023-04-02 09:11:31 -05:00
self_recursive_function_not_syntactically_a_function.txt Move uitests to their own crate 2023-04-02 09:11:31 -05:00
self_recursive_function_not_syntactically_a_function_nested.txt Move uitests to their own crate 2023-04-02 09:11:31 -05:00