on master help sign in
Infer closed recursive branch results
9ab52e8iko
docs/compiler.md+1−1
@@ -56,7 +56,7 @@ The core is split into chapters, `+| %name`, in this order:
56| `%span-check` | `+check-spans`, which `+golden` runs on every tree, and `+check-spans-test` |
56| `%span-check` | `+check-spans`, which `+golden` runs on every tree, and `+check-spans-test` |
57| `%type-inference` | The initial inference fragment and its unification helpers; not yet a module type checker |
57| `%type-inference` | The initial inference fragment and its unification helpers; not yet a module type checker |
58
58
59−The inference fragment supports fixed auras, unrestricted `@`, one-way widening into it and toward aura-family ancestors, generic variables and gates, faced and unfaced cells, cell sample binders, known record field reads, a two-binder cell pattern, a complete two-arm loobean branch, a complete two-arm unit-shaped branch, closed local mold aliases and acyclic forward value references. A supported single syntactic top-level gate can refer to itself through one monomorphic placeholder; the completed body must unify with it before the gate is generalized. Uses of generalized top-level definitions instantiate their schemes independently. Mutual groups, local recursive gates, polymorphic recursion and value cycles remain unsupported. Acyclic local value definitions can refer forward and generalize variables that are free of their enclosing environment; captured variables and explicit capitals remain shared. Acyclic simple local mold aliases can also refer forward, and are scoped to the body, not its gate's sample. Nonrecursive generic aliases of supported molds can be applied at exact arity, including locally and through library interfaces; their parameters are lexical. Closed, provably disjoint nonrecursive unions and tagged single-case molds support contextual term values, `~` and `|=%tag` constructors. A null-headed cell can match a union case but does not supply a `|=%$` constructor; unresolved tags and nulls remain pending, with distinct partial-inference diagnostics. Nonrecursive top-level generic union molds with provably disjoint cases also support contextual tags and constructors at exact arity; their arguments are retained through generalization and supported library interfaces. Nonrecursive generic aliases can reorder, repeat or omit parameters while preserving a supported union’s origin, including through local scopes and library interfaces. A generic union declared directly inside a body remains unsupported, as do recursive local groups and recursive molds. A value with type variable `A` can fit a field whose type is that same `A`, including in generic union payloads and nested or repeated record fields. A differing-variable face constraint remains unsupported. It can infer and generalize atom constraints arising from explicit capitals or bare sample binders, preserve those constraints through aliases, instantiate them independently, and print multiple constraints. Unresolved decimal variables default to `@ud` for inferred types without gates; defaulting inside gate types and other constraint cases remain incomplete. It does not yet check a module, complete imports, general patterns, general deferred constraints, recursive molds, dependency cycles or most errors with both conflicting excerpts. Definite cast and call mismatches, incompatible branches and overlapping union cases report both sites and excerpts. Concrete branch results can join at an explicitly present parent aura or `@`. Some known tuple and record positions acquire matching faces; other variable-dependent face merges, general branch tag context and ambiguous call-result propagation remain unsupported; function compatibility involving nested `@` and variable-dependent joins remain unsupported except for equal types. The reporting path repeats inference of a recursive gate rather than instantiating its generalized interface inside its own body. This adds work, and the current dependency pass can take quadratic time on long forward chains; the milestone's speed target remains unverified. A separate conservative pass reports unions whose cases are provably disjoint or overlapping and leaves other cases unresolved; it does not claim the mold is checked. Unsupported forms are reported as such, and the partial output says the module has not been checked.
59+The inference fragment supports fixed auras, unrestricted `@`, one-way widening into it and toward aura-family ancestors, generic variables and gates, faced and unfaced cells, cell sample binders, known record field reads, a two-binder cell pattern, a complete two-arm loobean branch, a complete two-arm unit-shaped branch, closed local mold aliases and acyclic forward value references. A supported single syntactic top-level gate can refer to itself through one monomorphic placeholder; the completed body must unify with it before the gate is generalized. Uses of generalized top-level definitions instantiate their schemes independently. For a complete loobean branch with one direct self-call arm, the checker can infer the other arm independently and use its closed, fully resolved type to seed the recursive result; it then checks the whole body. Open or pending base types do not seed the result, and other branch shapes still depend on the existing partial inference. Mutual groups, local recursive gates, polymorphic recursion and value cycles remain unsupported. Acyclic local value definitions can refer forward and generalize variables that are free of their enclosing environment; captured variables and explicit capitals remain shared. Acyclic simple local mold aliases can also refer forward, and are scoped to the body, not its gate's sample. Nonrecursive generic aliases of supported molds can be applied at exact arity, including locally and through library interfaces; their parameters are lexical. Closed, provably disjoint nonrecursive unions and tagged single-case molds support contextual term values, `~` and `|=%tag` constructors. A null-headed cell can match a union case but does not supply a `|=%$` constructor; unresolved tags and nulls remain pending, with distinct partial-inference diagnostics. Nonrecursive top-level generic union molds with provably disjoint cases also support contextual tags and constructors at exact arity; their arguments are retained through generalization and supported library interfaces. Nonrecursive generic aliases can reorder, repeat or omit parameters while preserving a supported union’s origin, including through local scopes and library interfaces. A generic union declared directly inside a body remains unsupported, as do recursive local groups and recursive molds. A value with type variable `A` can fit a field whose type is that same `A`, including in generic union payloads and nested or repeated record fields. A differing-variable face constraint remains unsupported. It can infer and generalize atom constraints arising from explicit capitals or bare sample binders, preserve those constraints through aliases, instantiate them independently, and print multiple constraints. Unresolved decimal variables default to `@ud` for inferred types without gates; defaulting inside gate types and other constraint cases remain incomplete. It does not yet check a module, complete imports, general patterns, general deferred constraints, recursive molds, dependency cycles or most errors with both conflicting excerpts. Definite cast and call mismatches, incompatible branches and overlapping union cases report both sites and excerpts. Concrete branch results can join at an explicitly present parent aura or `@`. Some known tuple and record positions acquire matching faces; other variable-dependent face merges, general branch tag context and ambiguous call-result propagation remain unsupported; function compatibility involving nested `@` and variable-dependent joins remain unsupported except for equal types. The reporting path repeats inference of a recursive gate rather than instantiating its generalized interface inside its own body. This adds work, and the current dependency pass can take quadratic time on long forward chains; the milestone's speed target remains unverified. A separate conservative pass reports unions whose cases are provably disjoint or overlapping and leaves other cases unresolved; it does not claim the mold is checked. Unsupported forms are reported as such, and the partial output says the module has not been checked.
60
60
61For supported closed unions, the type printer keeps the union’s origin separate from its displayed name. It prints an in-scope name such as `msg` or `msg.lib`, including in records and gates; an accessible imported nongeneric alias may name a transitive union. A nongeneric body-local union that escapes its scope, or an origin without an accessible name, prints its cases separated by spaces, parenthesized when nested. That case-list form is print-only. A supported generic union prints its name and all arguments, including unused arguments; when its name is unavailable, the partial printer reports that limitation instead of dropping its arguments. Two faces for the same imported origin remain compatible; compatibility between distinct union origins, including in gate types, remains unsupported. Some comparisons of generic union arguments also remain unsupported rather than deciding equality or mismatch. The Hoon bridge also translates some imported unnamed unions into this representation; unsupported cases remain errors.
61For supported closed unions, the type printer keeps the union’s origin separate from its displayed name. It prints an in-scope name such as `msg` or `msg.lib`, including in records and gates; an accessible imported nongeneric alias may name a transitive union. A nongeneric body-local union that escapes its scope, or an origin without an accessible name, prints its cases separated by spaces, parenthesized when nested. That case-list form is print-only. A supported generic union prints its name and all arguments, including unused arguments; when its name is unavailable, the partial printer reports that limitation instead of dropping its arguments. Two faces for the same imported origin remain compatible; compatibility between distinct union origins, including in gate types, remains unsupported. Some comparisons of generic union arguments also remain unsupported rather than deciding equality or mismatch. The Hoon bridge also translates some imported unnamed unions into this representation; unsupported cases remain errors.
62
62
docs/status.md+7−6
@@ -19,7 +19,7 @@ On 2026-10-30, @iko decided that Jibb drops `$?`, so a `+$` takes a union's case
19
19
20## Milestone 2: in progress
20## Milestone 2: in progress
21
21
22−The repository spec records the subsequent type-system and prelude decisions; those changes also need synchronization to the Claude document. An initial inference fragment and a standalone Hoon type reader are being tested. The fragment explicitly reports that it does not check a module; partial bridges pass selected Hoon atoms, term singletons, nested faced or unfaced cells, supported disjoint unions and opaque standard collections from `/sur` molds and marks into inference. Collections retain their names and supported arguments for printing and unification; nested supported union arguments are retained too. The bridge trusts unchanged results from the source-aware reader; a materialized type graph alone cannot reveal cases Hoon already collapsed. The source-validated standard prelude `list` mold shares this representation with imported lists; other Jibb-written collection molds and prelude collection operations are not yet connected; malformed names and arities fail closed. Selected self-recursive `/sur` molds cross as opaque module-and-name identities; aliases, foreign references, recursive marks, unfolding and construction remain unsupported. The reader handles mark samples, recursive molds whose origins can be verified through Ford imports, nested collections, direct ordered maps, certain ordered-map fields, direct `$^` unions whose cases can be proved disjoint, and one verified explicit union argument in a list, set, map or unit. Ambiguous recursive origins fail closed; recognizable explicit unions are checked from source before Hoon can collapse their cases (doc question 22), while other nested unions, nested ordered maps, general union disjointness and complete import integration remain unfinished. The partial checker resolves a subset of ordinary library imports in dependency order using supplied Jibb sources and a source-derived partial prelude interface, caches completed interfaces per run, and detects missing sources and cycles. It does not yet check API or kind semantics, and the prelude inventory is incomplete. The inference fragment supports unrestricted `@`, selected one-way widenings including aura-family ancestors, generalized atom constraints arising from explicit capitals or bare sample binders, acyclic local value definitions with captures, selected single self-recursive top-level gates, simple and nonrecursive generic mold aliases, selected faced record casts and field reads, and contextual tags, `~` and constructors for closed disjoint unions, including direct nonrecursive generic unions and propagation through complete loobean and unit-shaped branches in casts and known union-sample calls, including nested branches. A recursive gate uses one monomorphic self reference while its body is inferred, then generalizes after the body is checked; subsequent uses instantiate it independently. Mutual groups, local recursive gates, polymorphic recursion and value cycles remain unsupported. Reporting repeats inference for a recursive gate, so its performance cost remains unmeasured. Contextual null-headed cells fit their cases, but do not supply a `|=%$` constructor; unresolved nulls remain pending and are reported separately from tags. A known union of `~` and a null-headed cell supports a complete `~` / `[~ value]` branch in either order, including shadow checks; unknown subjects, missing or duplicate arms, and unresolved branch results remain unsupported. This fragment infers the prelude’s `fall` and `need` signatures. With the validated prelude list and a known cast or gate sample, empty, nonempty and nested list literals infer their element types, including contextual union tags; a mismatched element names both sites. In that context `~` and zero-valued terms fit an empty list, and two-item unfaced cells form cons lists, including nested cons and imported-list contexts; invalid heads or tails name both sites. Faced or longer cells and a missing or altered prelude list fail closed. For a known standard list with a supported element type, a complete `~` / `[item rest]` branch infers the element and tail types in either arm order and checks binders for shadowing. Uncontextualized list construction, unknown subjects, unsupported element types and other or incomplete list patterns remain unsupported. A value with type variable `A` can fit a field whose type is that same `A`, including in generic union payloads and nested or repeated record fields. Other variable-dependent face merges remain unsupported. Supported closed unions print using an in-scope name or imported alias; an unnamed nongeneric union prints its cases, parenthesized when nested. The latter is print-only. Generic union types retain all arguments in their printed name; if that name is unavailable, the partial printer reports the limitation. Different import faces for the same origin remain compatible; compatibility across distinct union origins and some generic-argument comparisons remain unsupported. Nonrecursive generic aliases can reorder, repeat or omit parameters while retaining a union’s origin, including through local scopes and library interfaces. A generic union declared directly inside a body remains unsupported, as do differing-variable face constraints in a union payload. A transitive generic union whose name is unavailable is reported as unsupported instead of hiding its arguments. Unfixed decimal literals default to `@ud` in gate-free inferred types; recursive local groups and molds, general branch tag context, other constraint cases and defaulting inside gate types still need work. Collection recognition checks the originating core and fails closed on shadows or unsupported Ford subject shapes; a wrapper regression also rejects forged subjects, samples and tails. Its golden fixtures include three real Tlon files. A Clay test passes a Ford-built nested union through the reader into partial inference. The partial prelude includes `murn`, `join`, `snip` and `rear`, parsed but still awaiting checker and backend validation, and [prelude-inventory.md](prelude-inventory.md) is a source audit, not the complete inventory or signatures. The milestone remains unfinished.
22+The repository spec records the subsequent type-system and prelude decisions; those changes also need synchronization to the Claude document. An initial inference fragment and a standalone Hoon type reader are being tested. The fragment explicitly reports that it does not check a module; partial bridges pass selected Hoon atoms, term singletons, nested faced or unfaced cells, supported disjoint unions and opaque standard collections from `/sur` molds and marks into inference. Collections retain their names and supported arguments for printing and unification; nested supported union arguments are retained too. The bridge trusts unchanged results from the source-aware reader; a materialized type graph alone cannot reveal cases Hoon already collapsed. The source-validated standard prelude `list` mold shares this representation with imported lists; other Jibb-written collection molds and prelude collection operations are not yet connected; malformed names and arities fail closed. Selected self-recursive `/sur` molds cross as opaque module-and-name identities; aliases, foreign references, recursive marks, unfolding and construction remain unsupported. The reader handles mark samples, recursive molds whose origins can be verified through Ford imports, nested collections, direct ordered maps, certain ordered-map fields, direct `$^` unions whose cases can be proved disjoint, and one verified explicit union argument in a list, set, map or unit. Ambiguous recursive origins fail closed; recognizable explicit unions are checked from source before Hoon can collapse their cases (doc question 22), while other nested unions, nested ordered maps, general union disjointness and complete import integration remain unfinished. The partial checker resolves a subset of ordinary library imports in dependency order using supplied Jibb sources and a source-derived partial prelude interface, caches completed interfaces per run, and detects missing sources and cycles. It does not yet check API or kind semantics, and the prelude inventory is incomplete. The inference fragment supports unrestricted `@`, selected one-way widenings including aura-family ancestors, generalized atom constraints arising from explicit capitals or bare sample binders, acyclic local value definitions with captures, selected single self-recursive top-level gates, simple and nonrecursive generic mold aliases, selected faced record casts and field reads, and contextual tags, `~` and constructors for closed disjoint unions, including direct nonrecursive generic unions and propagation through complete loobean and unit-shaped branches in casts and known union-sample calls, including nested branches. A recursive gate uses one monomorphic self reference while its body is inferred, then generalizes after the body is checked; subsequent uses instantiate it independently. For a complete loobean branch with one direct self-call arm, a separately inferred closed base type can seed the recursive result before the whole body is checked. Open or pending base types do not seed it; other branch shapes remain subject to the fragment’s existing limits. Mutual groups, local recursive gates, polymorphic recursion and value cycles remain unsupported. Reporting repeats inference for a recursive gate, so its performance cost remains unmeasured. Contextual null-headed cells fit their cases, but do not supply a `|=%$` constructor; unresolved nulls remain pending and are reported separately from tags. A known union of `~` and a null-headed cell supports a complete `~` / `[~ value]` branch in either order, including shadow checks; unknown subjects, missing or duplicate arms, and unresolved branch results remain unsupported. This fragment infers the prelude’s `fall` and `need` signatures. With the validated prelude list and a known cast or gate sample, empty, nonempty and nested list literals infer their element types, including contextual union tags; a mismatched element names both sites. In that context `~` and zero-valued terms fit an empty list, and two-item unfaced cells form cons lists, including nested cons and imported-list contexts; invalid heads or tails name both sites. Faced or longer cells and a missing or altered prelude list fail closed. For a known standard list with a supported element type, a complete `~` / `[item rest]` branch infers the element and tail types in either arm order and checks binders for shadowing. Uncontextualized list construction, unknown subjects, unsupported element types and other or incomplete list patterns remain unsupported. A value with type variable `A` can fit a field whose type is that same `A`, including in generic union payloads and nested or repeated record fields. Other variable-dependent face merges remain unsupported. Supported closed unions print using an in-scope name or imported alias; an unnamed nongeneric union prints its cases, parenthesized when nested. The latter is print-only. Generic union types retain all arguments in their printed name; if that name is unavailable, the partial printer reports the limitation. Different import faces for the same origin remain compatible; compatibility across distinct union origins and some generic-argument comparisons remain unsupported. Nonrecursive generic aliases can reorder, repeat or omit parameters while retaining a union’s origin, including through local scopes and library interfaces. A generic union declared directly inside a body remains unsupported, as do differing-variable face constraints in a union payload. A transitive generic union whose name is unavailable is reported as unsupported instead of hiding its arguments. Unfixed decimal literals default to `@ud` in gate-free inferred types; recursive local groups and molds, general branch tag context, other constraint cases and defaulting inside gate types still need work. Collection recognition checks the originating core and fails closed on shadows or unsupported Ford subject shapes; a wrapper regression also rejects forged subjects, samples and tails. Its golden fixtures include three real Tlon files. A Clay test passes a Ford-built nested union through the reader into partial inference. The partial prelude includes `murn`, `join`, `snip` and `rear`, parsed but still awaiting checker and backend validation, and [prelude-inventory.md](prelude-inventory.md) is a source audit, not the complete inventory or signatures. The milestone remains unfinished.
23
23
24The shared prelude interface reserves every name present in the supplied vendored source and makes only supported inferred entries available, including `list`, `unit`, `same`, `fall` and `need`. Unsupported entries such as most list helpers remain reserved but unavailable. All callers use the same prelude origin, so a library can export a type containing unqualified `(unit A)` to another module. Preparation rejects empty, malformed, conflicting or import-bearing source; the prepared value is trusted and must come unchanged from `+prepare-prelude`. The module-scope fixture compares the prepared and source-taking paths against the real prelude and a two-module golden under eval and on the ship. The source and checker remain incomplete, so this does not establish complete shadowing coverage or a checked module.
24The shared prelude interface reserves every name present in the supplied vendored source and makes only supported inferred entries available, including `list`, `unit`, `same`, `fall` and `need`. Unsupported entries such as most list helpers remain reserved but unavailable. All callers use the same prelude origin, so a library can export a type containing unqualified `(unit A)` to another module. Preparation rejects empty, malformed, conflicting or import-bearing source; the prepared value is trusted and must come unchanged from `+prepare-prelude`. The module-scope fixture compares the prepared and source-taking paths against the real prelude and a two-module golden under eval and on the ship. The source and checker remain incomplete, so this does not establish complete shadowing coverage or a checked module.
25
25
@@ -39,8 +39,8 @@ What the plan asks for, and where it is:
39
39
40Besides the plan's list:
40Besides the plan's list:
41
41
42−- 503 golden cases: 287 that parse and 216 that fail, each failure at a stated line and column. One failing case has an unclear expectation (corpus question 3). The newer type-output cases exercise only the partial inference fragment. Each case's `about.txt` quotes the doc's words it tests.
42+- 504 golden cases: 288 that parse and 216 that fail, each failure at a stated line and column. One failing case has an unclear expectation (corpus question 3). The newer type-output cases exercise only the partial inference fragment. Each case's `about.txt` quotes the doc's words it tests.
43−- The 503-case corpus passed under `urbit eval` in 59.6 s. The fake ship passed all 508 tests, including the importer, importer/checker and mark/checker bridges, module scope and unification checks, with 28.1 s for sync and 32.1 s for tests. The importer golden compares 141 projections; `tools/clay-fixtures` builds the example Hoon fixtures through Clay, checks a recursive Ford import's origin, and passes Clay-built types through the Clay-built importer and partial checker.
43+- The 504-case corpus passed under `urbit eval` in 56.4 s. The fake ship passed all 509 tests, including the importer, importer/checker and mark/checker bridges, module scope and unification checks, with 29.0 s for sync and 32.6 s for tests. The importer golden compares 141 projections; `tools/clay-fixtures` builds the example Hoon fixtures through Clay, checks a recursive Ford import's origin, and passes Clay-built types through the Clay-built importer and partial checker.
44- `tools/testdata/selftest` (22 checks) and `tools/testdata/ship-selftest` test the tools themselves.
44- `tools/testdata/selftest` (22 checks) and `tools/testdata/ship-selftest` test the tools themselves.
45- Two independent audits before 7c739b7, one of which compared the library with a reference parser written in Python from the doc over about 19,000 generated programs. Before ab797a9, a second Python parser, written from the decisions, agreed with the library on 8,000 generated programs and 900 hand-written probes.
45- Two independent audits before 7c739b7, one of which compared the library with a reference parser written in Python from the doc over about 19,000 generated programs. Before ab797a9, a second Python parser, written from the decisions, agreed with the library on 8,000 generated programs and 900 hand-written probes.
46- Speed: starting `urbit eval` and building the library takes about 8 s. After that, a 2,000-line module of 400 definitions parses in about a second. Loops over definitions, arms, lines and items grow no stack; nesting costs a few stack frames a level, and 100,000 nested brackets still parse (library section 3).
46- Speed: starting `urbit eval` and building the library takes about 8 s. After that, a 2,000-line module of 400 definitions parses in about a second. Loops over definitions, arms, lines and items grow no stack; nesting costs a few stack frames a level, and 100,000 nested brackets still parse (library section 3).
@@ -83,14 +83,15 @@ Besides the plan's list:
83| 29bd39f | 2026-10-30 | Infer contextual list literals and validate prelude parity |
83| 29bd39f | 2026-10-30 | Infer contextual list literals and validate prelude parity |
84| a2a6ef5 | 2026-10-30 | Infer complete list-shaped branches |
84| a2a6ef5 | 2026-10-30 | Infer complete list-shaped branches |
85| 671fe72 | 2026-10-30 | Infer contextual list nulls and cons cells |
85| 671fe72 | 2026-10-30 | Infer contextual list nulls and cons cells |
86−| This change | 2026-10-30 | Infer selected self-recursive gates |
86+| 7e69436 | 2026-10-30 | Infer selected self-recursive gates |
87+| This change | 2026-10-30 | Infer recursive branches with closed base types |
87
88
88## Checking it
89## Checking it
89
90
90On a machine set up as [development.md](development.md) says:
91On a machine set up as [development.md](development.md) says:
91
92
92```
93```
93−tools/golden # 503 cases under urbit eval
94+tools/golden # 504 cases under urbit eval
94tools/importer-test # the Hoon importer fixture projection
95tools/importer-test # the Hoon importer fixture projection
95tools/type-import-test # the importer/checker bridge fixture
96tools/type-import-test # the importer/checker bridge fixture
96tools/type-mark-test # the mark/checker bridge fixture
97tools/type-mark-test # the mark/checker bridge fixture
@@ -100,7 +101,7 @@ tools/testdata/selftest # the tools themselves
100tools/doc-blocks docs/spec # the doc's examples are golden cases
101tools/doc-blocks docs/spec # the doc's examples are golden cases
101tools/ship start
102tools/ship start
102tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
103tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
103−tools/ship test # the same 503 cases as -test arms on the ship
104+tools/ship test # the same 504 cases as -test arms on the ship
104tools/testdata/ship-selftest
105tools/testdata/ship-selftest
105tools/ship check-commit # |commit stores .jibb files
106tools/ship check-commit # |commit stores .jibb files
106tools/clay-fixtures # example /sur files and marks build through Clay
107tools/clay-fixtures # example /sur files and marks build through Clay
jibb-dev/lib/jibb.hoon+69−3
@@ -6806,6 +6806,69 @@
6806:: reporting repeats the same check instead of instantiating the gate's
6806:: reporting repeats the same check instead of instantiating the gate's
6807:: generalized interface inside its own body. Mutual groups stay unsupported.
6807:: generalized interface inside its own body. Mutual groups stay unsupported.
6808::
6808::
6809+++ direct-self-call
6810+ |= [e=expr name=term]
6811+ ^- ?
6812+ ?: ?=(%group -.e) $(e inner.e)
6813+ ?: &(?=(%body -.e) ?=(~ defs.e)) $(e final.e)
6814+ ?. ?=(%call -.e) |
6815+ ?. ?=(%wing -.head.e) |
6816+ =(names.head.e ~[name])
6817+::
6818+++ branch-base-arm
6819+ |= [e=expr name=term]
6820+ ^- (unit expr)
6821+ ?: ?=(%group -.e) $(e inner.e)
6822+ ?: &(?=(%body -.e) ?=(~ defs.e)) $(e final.e)
6823+ ?. ?=(%branch -.e) ~
6824+ ?~ arms.e ~
6825+ ?~ t.arms.e ~
6826+ ?^ t.t.arms.e ~
6827+ =/ x=arm i.arms.e
6828+ =/ y=arm i.t.arms.e
6829+ ?. &(?=(%lit -.pat.x) ?=(%lit -.pat.y)) ~
6830+ ?. &(=(%loobean form.lit.pat.x) =(%loobean form.lit.pat.y)) ~
6831+ ?: =(val.lit.pat.x val.lit.pat.y) ~
6832+ =/ first=? (direct-self-call val.x name)
6833+ =/ second=? (direct-self-call val.y name)
6834+ ?: =(first second) ~
6835+ `?:(first val.y val.x)
6836+::
6837+:: Infer the base arm independently, with the self binding removed. Only
6838+:: a closed type whose constraints resolved can seed the recursive result.
6839+:: The regular body inference then checks both arms with shared state.
6840+::
6841+++ recursive-branch-seed
6842+ |= [d=def env=ienv state=istate]
6843+ ^- (unit itype)
6844+ ?. ?=(%value -.d) ~
6845+ ?. |(?=(%gate -.val.d) ?=(%gate-wide -.val.d)) ~
6846+ =/ gate=expr val.d
6847+ =/ body=expr
6848+ ?- -.gate
6849+ %gate body.gate
6850+ %gate-wide body.gate
6851+ * !!
6852+ ==
6853+ =/ base=(unit expr) (branch-base-arm body name.d)
6854+ ?~ base ~
6855+ =/ outer=ienv (skim env |=(entry=[name=term scheme=ischeme] !=(name.entry name.d)))
6856+ =/ sam=isample-result
6857+ ?- -.gate
6858+ %gate (infer-sample sample.gate outer state)
6859+ %gate-wide (infer-sample sample.gate outer state)
6860+ * !!
6861+ ==
6862+ ?: ?=(%| -.sam) ~
6863+ =/ inferred=iresult (infer-fragment u.base env.p.sam state.p.sam)
6864+ ?: ?=(%| -.inferred) ~
6865+ ?: (pending-tags tags.state.p.inferred sub.state.p.inferred) ~
6866+ ?: (constrained-capitals caps.state.p.inferred sub.state.p.inferred) ~
6867+ =/ typ=itype (itype-normalize typ.p.inferred sub.state.p.inferred)
6868+ ?: ?=(^ (itype-vars typ)) ~
6869+ ?: (itype-has-tag typ) ~
6870+ `typ
6871+::
6809++ infer-recursive-gate
6872++ infer-recursive-gate
6810 |= [d=def env=ienv state=istate]
6873 |= [d=def env=ienv state=istate]
6811 ^- iresult
6874 ^- iresult
@@ -6813,10 +6876,13 @@
6813 ?. |(?=(%gate -.val.d) ?=(%gate-wide -.val.d))
6876 ?. |(?=(%gate -.val.d) ?=(%gate-wide -.val.d))
6814 [%| ["recursive definition is not a gate" ~]]
6877 [%| ["recursive definition is not a gate" ~]]
6815 =/ id=@ud next.state
6878 =/ id=@ud next.state
6879+ =/ result=(unit itype) (recursive-branch-seed d env state)
6880+ =/ seed=itype ?~(result [%var id] [%fn [%var +(id)] u.result])
6881+ =/ next=@ud ?~(result +(id) +(+(id)))
6816− =/ seeded=ienv [[name.d [[%var id] ~]] env]
6882+ =/ seeded=ienv [[name.d [seed ~]] env]
6817− =/ out=iresult (infer-fragment val.d seeded state(next +(id)))
6883+ =/ out=iresult (infer-fragment val.d seeded state(next next))
6818 ?: ?=(%| -.out) out
6884 ?: ?=(%| -.out) out
6819− =/ uni=(unit isub) (itype-unify [%var id] typ.p.out sub.state.p.out)
6885+ =/ uni=(unit isub) (itype-unify seed typ.p.out sub.state.p.out)
6820 ?~ uni [%| ["recursive gate constraint is not supported by partial inference" ~]]
6886 ?~ uni [%| ["recursive gate constraint is not supported by partial inference" ~]]
6821 [%& typ.p.out state.p.out(sub u.uni)]
6887 [%& typ.p.out state.p.out(sub u.uni)]
6822::
6888::
tests/golden/types-recursive-branch/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Modules: "Gates may call themselves and their siblings"; Molds: "Type variables are capitals, generalized per `++`."
2+tests: A self-recursive branch uses a closed base case in either order; unknown, captured, forced and incompatible types remain sound or fail closed.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-recursive-branch/modules.txtnew file+1
@@ -0,0 +1 @@
1+# Use the source-validated prelude.
tests/golden/types-recursive-branch/source.jibbnew file+103
@@ -0,0 +1,103 @@
1+++ text-forward |= b=?
2+ ?- b
3+ %.y "done"
4+ %.n (text-forward %.y)
5+++ text-reverse |= b=?
6+ ?- b
7+ %.n (text-reverse %.y)
8+ %.y "done"
9+++ ship-result |= b=?
10+ ?- b
11+ %.y ~zod
12+ %.n (ship-result %.y)
13+++ flag-result |= b=?
14+ ?- b
15+ %.y %.y
16+ %.n (flag-result %.y)
17+++ record-result |= b=?
18+ ?- b
19+ %.y [who=~zod label="ok"]
20+ %.n (record-result %.y)
21+++ list-result |= b=?
22+ ?- b
23+ %.y ^- (list @t) ~["ok"]
24+ %.n (list-result %.y)
25+++ input-base |= x=A
26+ ?- %.y
27+ %.y x
28+ %.n (input-base x)
29+++ inferred-base |= x
30+ ?- %.y
31+ %.y x
32+ %.n (inferred-base x)
33+++ captured |= x=A
34+ ++ inner |= b=? x
35+ ?- %.y
36+ %.y (inner %.y)
37+ %.n (captured x)
38+++ forced |= x=A
39+ ?- %.y
40+ %.y ^- @t x
41+ %.n (forced x)
42+++ pending |= b=?
43+ ?- b
44+ %.y %unknown
45+ %.n (pending b)
46+++ pending-null |= b=?
47+ ?- b
48+ %.y ~
49+ %.n (pending-null b)
50+++ dependent |= b=?
51+ ?- b
52+ %.y "ok"
53+ %.n "other"
54+++ nonself |= b=?
55+ ?- b
56+ %.y "ok"
57+ %.n (text-forward b)
58+++ polymorphic |= x=A
59+ ?- %.y
60+ %.y "ok"
61+ %.n (polymorphic [x x])
62+++ no-base |= b=? (no-base b)
63+++ malformed |= b=?
64+ ?- b
65+ %.y "ok"
66+ %.y (malformed b)
67+++ mixed |= b=?
68+ ++ self mixed
69+ ~& ^- @p (self b)
70+ ?- b
71+ %.y "ok"
72+ %.n (mixed b)
73+++ sample-base |= b=?
74+ ?- b
75+ %.y b
76+ %.n (sample-base %.y)
77+++ sample-mismatch |= b=?
78+ ?- b
79+ %.y "ok"
80+ %.n (sample-mismatch "wrong")
81+++ self-subject |= b=?
82+ ?- (self-subject b)
83+ %.y "ok"
84+ %.n (self-subject b)
85+++ aura-base |= b=?
86+ ?- b
87+ %.y ^- @u 0x1f
88+ %.n (aura-base b)
89+++ aura-conflict |= b=?
90+ ~& ^- @t (aura-conflict b)
91+ ?- b
92+ %.y 0x1f
93+ %.n (aura-conflict b)
94+++ traced |= b=?
95+ ?- b
96+ %.y "ok"
97+ %.n
98+ ~& "trace"
99+ (traced b)
100+++ unresolved-number |= b=?
101+ ?- b
102+ %.y 1
103+ %.n (unresolved-number b)
tests/golden/types-recursive-branch/tokens.txtnew file+573
@@ -0,0 +1,573 @@
1+1:1 glyph ++
2+1:4 name text-forward
3+1:17 glyph |=
4+1:20 name b
5+1:21 tight glyph =
6+1:22 tight glyph ?
7+2:3 INDENT
8+2:3 glyph ?-
9+2:6 name b
10+3:5 INDENT
11+3:5 lit %.y
12+3:9 str "done"
13+4:5 NEWLINE
14+4:5 lit %.n
15+4:9 glyph (
16+4:10 tight name text-forward
17+4:23 lit %.y
18+4:26 tight glyph )
19+5:1 DEDENT
20+5:1 DEDENT
21+5:1 NEWLINE
22+5:1 glyph ++
23+5:4 name text-reverse
24+5:17 glyph |=
25+5:20 name b
26+5:21 tight glyph =
27+5:22 tight glyph ?
28+6:3 INDENT
29+6:3 glyph ?-
30+6:6 name b
31+7:5 INDENT
32+7:5 lit %.n
33+7:9 glyph (
34+7:10 tight name text-reverse
35+7:23 lit %.y
36+7:26 tight glyph )
37+8:5 NEWLINE
38+8:5 lit %.y
39+8:9 str "done"
40+9:1 DEDENT
41+9:1 DEDENT
42+9:1 NEWLINE
43+9:1 glyph ++
44+9:4 name ship-result
45+9:16 glyph |=
46+9:19 name b
47+9:20 tight glyph =
48+9:21 tight glyph ?
49+10:3 INDENT
50+10:3 glyph ?-
51+10:6 name b
52+11:5 INDENT
53+11:5 lit %.y
54+11:9 lit ~zod
55+12:5 NEWLINE
56+12:5 lit %.n
57+12:9 glyph (
58+12:10 tight name ship-result
59+12:22 lit %.y
60+12:25 tight glyph )
61+13:1 DEDENT
62+13:1 DEDENT
63+13:1 NEWLINE
64+13:1 glyph ++
65+13:4 name flag-result
66+13:16 glyph |=
67+13:19 name b
68+13:20 tight glyph =
69+13:21 tight glyph ?
70+14:3 INDENT
71+14:3 glyph ?-
72+14:6 name b
73+15:5 INDENT
74+15:5 lit %.y
75+15:9 lit %.y
76+16:5 NEWLINE
77+16:5 lit %.n
78+16:9 glyph (
79+16:10 tight name flag-result
80+16:22 lit %.y
81+16:25 tight glyph )
82+17:1 DEDENT
83+17:1 DEDENT
84+17:1 NEWLINE
85+17:1 glyph ++
86+17:4 name record-result
87+17:18 glyph |=
88+17:21 name b
89+17:22 tight glyph =
90+17:23 tight glyph ?
91+18:3 INDENT
92+18:3 glyph ?-
93+18:6 name b
94+19:5 INDENT
95+19:5 lit %.y
96+19:9 glyph [
97+19:10 tight name who
98+19:13 tight glyph =
99+19:14 tight lit ~zod
100+19:19 name label
101+19:24 tight glyph =
102+19:25 tight str "ok"
103+19:29 tight glyph ]
104+20:5 NEWLINE
105+20:5 lit %.n
106+20:9 glyph (
107+20:10 tight name record-result
108+20:24 lit %.y
109+20:27 tight glyph )
110+21:1 DEDENT
111+21:1 DEDENT
112+21:1 NEWLINE
113+21:1 glyph ++
114+21:4 name list-result
115+21:16 glyph |=
116+21:19 name b
117+21:20 tight glyph =
118+21:21 tight glyph ?
119+22:3 INDENT
120+22:3 glyph ?-
121+22:6 name b
122+23:5 INDENT
123+23:5 lit %.y
124+23:9 glyph ^-
125+23:12 glyph (
126+23:13 tight name list
127+23:18 aura @t
128+23:20 tight glyph )
129+23:22 glyph ~[
130+23:24 tight str "ok"
131+23:28 tight glyph ]
132+24:5 NEWLINE
133+24:5 lit %.n
134+24:9 glyph (
135+24:10 tight name list-result
136+24:22 lit %.y
137+24:25 tight glyph )
138+25:1 DEDENT
139+25:1 DEDENT
140+25:1 NEWLINE
141+25:1 glyph ++
142+25:4 name input-base
143+25:15 glyph |=
144+25:18 name x
145+25:19 tight glyph =
146+25:20 tight tvar A
147+26:3 INDENT
148+26:3 glyph ?-
149+26:6 lit %.y
150+27:5 INDENT
151+27:5 lit %.y
152+27:9 name x
153+28:5 NEWLINE
154+28:5 lit %.n
155+28:9 glyph (
156+28:10 tight name input-base
157+28:21 name x
158+28:22 tight glyph )
159+29:1 DEDENT
160+29:1 DEDENT
161+29:1 NEWLINE
162+29:1 glyph ++
163+29:4 name inferred-base
164+29:18 glyph |=
165+29:21 name x
166+30:3 INDENT
167+30:3 glyph ?-
168+30:6 lit %.y
169+31:5 INDENT
170+31:5 lit %.y
171+31:9 name x
172+32:5 NEWLINE
173+32:5 lit %.n
174+32:9 glyph (
175+32:10 tight name inferred-base
176+32:24 name x
177+32:25 tight glyph )
178+33:1 DEDENT
179+33:1 DEDENT
180+33:1 NEWLINE
181+33:1 glyph ++
182+33:4 name captured
183+33:13 glyph |=
184+33:16 name x
185+33:17 tight glyph =
186+33:18 tight tvar A
187+34:3 INDENT
188+34:3 glyph ++
189+34:6 name inner
190+34:12 glyph |=
191+34:15 name b
192+34:16 tight glyph =
193+34:17 tight glyph ?
194+34:19 name x
195+35:3 NEWLINE
196+35:3 glyph ?-
197+35:6 lit %.y
198+36:5 INDENT
199+36:5 lit %.y
200+36:9 glyph (
201+36:10 tight name inner
202+36:16 lit %.y
203+36:19 tight glyph )
204+37:5 NEWLINE
205+37:5 lit %.n
206+37:9 glyph (
207+37:10 tight name captured
208+37:19 name x
209+37:20 tight glyph )
210+38:1 DEDENT
211+38:1 DEDENT
212+38:1 NEWLINE
213+38:1 glyph ++
214+38:4 name forced
215+38:11 glyph |=
216+38:14 name x
217+38:15 tight glyph =
218+38:16 tight tvar A
219+39:3 INDENT
220+39:3 glyph ?-
221+39:6 lit %.y
222+40:5 INDENT
223+40:5 lit %.y
224+40:9 glyph ^-
225+40:12 aura @t
226+40:15 name x
227+41:5 NEWLINE
228+41:5 lit %.n
229+41:9 glyph (
230+41:10 tight name forced
231+41:17 name x
232+41:18 tight glyph )
233+42:1 DEDENT
234+42:1 DEDENT
235+42:1 NEWLINE
236+42:1 glyph ++
237+42:4 name pending
238+42:12 glyph |=
239+42:15 name b
240+42:16 tight glyph =
241+42:17 tight glyph ?
242+43:3 INDENT
243+43:3 glyph ?-
244+43:6 name b
245+44:5 INDENT
246+44:5 lit %.y
247+44:9 lit %unknown
248+45:5 NEWLINE
249+45:5 lit %.n
250+45:9 glyph (
251+45:10 tight name pending
252+45:18 name b
253+45:19 tight glyph )
254+46:1 DEDENT
255+46:1 DEDENT
256+46:1 NEWLINE
257+46:1 glyph ++
258+46:4 name pending-null
259+46:17 glyph |=
260+46:20 name b
261+46:21 tight glyph =
262+46:22 tight glyph ?
263+47:3 INDENT
264+47:3 glyph ?-
265+47:6 name b
266+48:5 INDENT
267+48:5 lit %.y
268+48:9 lit ~
269+49:5 NEWLINE
270+49:5 lit %.n
271+49:9 glyph (
272+49:10 tight name pending-null
273+49:23 name b
274+49:24 tight glyph )
275+50:1 DEDENT
276+50:1 DEDENT
277+50:1 NEWLINE
278+50:1 glyph ++
279+50:4 name dependent
280+50:14 glyph |=
281+50:17 name b
282+50:18 tight glyph =
283+50:19 tight glyph ?
284+51:3 INDENT
285+51:3 glyph ?-
286+51:6 name b
287+52:5 INDENT
288+52:5 lit %.y
289+52:9 str "ok"
290+53:5 NEWLINE
291+53:5 lit %.n
292+53:9 str "other"
293+54:1 DEDENT
294+54:1 DEDENT
295+54:1 NEWLINE
296+54:1 glyph ++
297+54:4 name nonself
298+54:12 glyph |=
299+54:15 name b
300+54:16 tight glyph =
301+54:17 tight glyph ?
302+55:3 INDENT
303+55:3 glyph ?-
304+55:6 name b
305+56:5 INDENT
306+56:5 lit %.y
307+56:9 str "ok"
308+57:5 NEWLINE
309+57:5 lit %.n
310+57:9 glyph (
311+57:10 tight name text-forward
312+57:23 name b
313+57:24 tight glyph )
314+58:1 DEDENT
315+58:1 DEDENT
316+58:1 NEWLINE
317+58:1 glyph ++
318+58:4 name polymorphic
319+58:16 glyph |=
320+58:19 name x
321+58:20 tight glyph =
322+58:21 tight tvar A
323+59:3 INDENT
324+59:3 glyph ?-
325+59:6 lit %.y
326+60:5 INDENT
327+60:5 lit %.y
328+60:9 str "ok"
329+61:5 NEWLINE
330+61:5 lit %.n
331+61:9 glyph (
332+61:10 tight name polymorphic
333+61:22 glyph [
334+61:23 tight name x
335+61:25 name x
336+61:26 tight glyph ]
337+61:27 tight glyph )
338+62:1 DEDENT
339+62:1 DEDENT
340+62:1 NEWLINE
341+62:1 glyph ++
342+62:4 name no-base
343+62:12 glyph |=
344+62:15 name b
345+62:16 tight glyph =
346+62:17 tight glyph ?
347+62:19 glyph (
348+62:20 tight name no-base
349+62:28 name b
350+62:29 tight glyph )
351+63:1 NEWLINE
352+63:1 glyph ++
353+63:4 name malformed
354+63:14 glyph |=
355+63:17 name b
356+63:18 tight glyph =
357+63:19 tight glyph ?
358+64:3 INDENT
359+64:3 glyph ?-
360+64:6 name b
361+65:5 INDENT
362+65:5 lit %.y
363+65:9 str "ok"
364+66:5 NEWLINE
365+66:5 lit %.y
366+66:9 glyph (
367+66:10 tight name malformed
368+66:20 name b
369+66:21 tight glyph )
370+67:1 DEDENT
371+67:1 DEDENT
372+67:1 NEWLINE
373+67:1 glyph ++
374+67:4 name mixed
375+67:10 glyph |=
376+67:13 name b
377+67:14 tight glyph =
378+67:15 tight glyph ?
379+68:3 INDENT
380+68:3 glyph ++
381+68:6 name self
382+68:11 name mixed
383+69:3 NEWLINE
384+69:3 glyph ~&
385+69:6 glyph ^-
386+69:9 aura @p
387+69:12 glyph (
388+69:13 tight name self
389+69:18 name b
390+69:19 tight glyph )
391+70:5 INDENT
392+70:5 glyph ?-
393+70:8 name b
394+71:7 INDENT
395+71:7 lit %.y
396+71:11 str "ok"
397+72:7 NEWLINE
398+72:7 lit %.n
399+72:11 glyph (
400+72:12 tight name mixed
401+72:18 name b
402+72:19 tight glyph )
403+73:1 DEDENT
404+73:1 DEDENT
405+73:1 DEDENT
406+73:1 NEWLINE
407+73:1 glyph ++
408+73:4 name sample-base
409+73:16 glyph |=
410+73:19 name b
411+73:20 tight glyph =
412+73:21 tight glyph ?
413+74:3 INDENT
414+74:3 glyph ?-
415+74:6 name b
416+75:5 INDENT
417+75:5 lit %.y
418+75:9 name b
419+76:5 NEWLINE
420+76:5 lit %.n
421+76:9 glyph (
422+76:10 tight name sample-base
423+76:22 lit %.y
424+76:25 tight glyph )
425+77:1 DEDENT
426+77:1 DEDENT
427+77:1 NEWLINE
428+77:1 glyph ++
429+77:4 name sample-mismatch
430+77:20 glyph |=
431+77:23 name b
432+77:24 tight glyph =
433+77:25 tight glyph ?
434+78:3 INDENT
435+78:3 glyph ?-
436+78:6 name b
437+79:5 INDENT
438+79:5 lit %.y
439+79:9 str "ok"
440+80:5 NEWLINE
441+80:5 lit %.n
442+80:9 glyph (
443+80:10 tight name sample-mismatch
444+80:26 str "wrong"
445+80:33 tight glyph )
446+81:1 DEDENT
447+81:1 DEDENT
448+81:1 NEWLINE
449+81:1 glyph ++
450+81:4 name self-subject
451+81:17 glyph |=
452+81:20 name b
453+81:21 tight glyph =
454+81:22 tight glyph ?
455+82:3 INDENT
456+82:3 glyph ?-
457+82:6 glyph (
458+82:7 tight name self-subject
459+82:20 name b
460+82:21 tight glyph )
461+83:5 INDENT
462+83:5 lit %.y
463+83:9 str "ok"
464+84:5 NEWLINE
465+84:5 lit %.n
466+84:9 glyph (
467+84:10 tight name self-subject
468+84:23 name b
469+84:24 tight glyph )
470+85:1 DEDENT
471+85:1 DEDENT
472+85:1 NEWLINE
473+85:1 glyph ++
474+85:4 name aura-base
475+85:14 glyph |=
476+85:17 name b
477+85:18 tight glyph =
478+85:19 tight glyph ?
479+86:3 INDENT
480+86:3 glyph ?-
481+86:6 name b
482+87:5 INDENT
483+87:5 lit %.y
484+87:9 glyph ^-
485+87:12 aura @u
486+87:15 lit 0x1f
487+88:5 NEWLINE
488+88:5 lit %.n
489+88:9 glyph (
490+88:10 tight name aura-base
491+88:20 name b
492+88:21 tight glyph )
493+89:1 DEDENT
494+89:1 DEDENT
495+89:1 NEWLINE
496+89:1 glyph ++
497+89:4 name aura-conflict
498+89:18 glyph |=
499+89:21 name b
500+89:22 tight glyph =
501+89:23 tight glyph ?
502+90:3 INDENT
503+90:3 glyph ~&
504+90:6 glyph ^-
505+90:9 aura @t
506+90:12 glyph (
507+90:13 tight name aura-conflict
508+90:27 name b
509+90:28 tight glyph )
510+91:5 INDENT
511+91:5 glyph ?-
512+91:8 name b
513+92:7 INDENT
514+92:7 lit %.y
515+92:11 lit 0x1f
516+93:7 NEWLINE
517+93:7 lit %.n
518+93:11 glyph (
519+93:12 tight name aura-conflict
520+93:26 name b
521+93:27 tight glyph )
522+94:1 DEDENT
523+94:1 DEDENT
524+94:1 DEDENT
525+94:1 NEWLINE
526+94:1 glyph ++
527+94:4 name traced
528+94:11 glyph |=
529+94:14 name b
530+94:15 tight glyph =
531+94:16 tight glyph ?
532+95:3 INDENT
533+95:3 glyph ?-
534+95:6 name b
535+96:5 INDENT
536+96:5 lit %.y
537+96:9 str "ok"
538+97:5 NEWLINE
539+97:5 lit %.n
540+98:7 INDENT
541+98:7 glyph ~&
542+98:10 str "trace"
543+99:9 INDENT
544+99:9 glyph (
545+99:10 tight name traced
546+99:17 name b
547+99:18 tight glyph )
548+100:1 DEDENT
549+100:1 DEDENT
550+100:1 DEDENT
551+100:1 DEDENT
552+100:1 NEWLINE
553+100:1 glyph ++
554+100:4 name unresolved-number
555+100:22 glyph |=
556+100:25 name b
557+100:26 tight glyph =
558+100:27 tight glyph ?
559+101:3 INDENT
560+101:3 glyph ?-
561+101:6 name b
562+102:5 INDENT
563+102:5 lit %.y
564+102:9 lit 1
565+103:5 NEWLINE
566+103:5 lit %.n
567+103:9 glyph (
568+103:10 tight name unresolved-number
569+103:28 name b
570+103:29 tight glyph )
571+103:30 DEDENT
572+103:30 DEDENT
573+103:30 NEWLINE
tests/golden/types-recursive-branch/tree.txtnew file+306
@@ -0,0 +1,306 @@
1+(module
2+ (value 1:1 text-forward
3+ (gate 1:17
4+ (face 1:20 b (flag 1:22))
5+ (body 2:3
6+ (branch 2:3
7+ (wing 2:6 b)
8+ (arm 3:5 (lit 3:5 %.y) (str 3:9 "done"))
9+ (arm 4:5
10+ (lit 4:5 %.n)
11+ (group 4:9
12+ (call 4:10 (wing 4:10 text-forward) (lit 4:23 %.y))))))))
13+ (value 5:1 text-reverse
14+ (gate 5:17
15+ (face 5:20 b (flag 5:22))
16+ (body 6:3
17+ (branch 6:3
18+ (wing 6:6 b)
19+ (arm 7:5
20+ (lit 7:5 %.n)
21+ (group 7:9
22+ (call 7:10 (wing 7:10 text-reverse) (lit 7:23 %.y))))
23+ (arm 8:5 (lit 8:5 %.y) (str 8:9 "done"))))))
24+ (value 9:1 ship-result
25+ (gate 9:16
26+ (face 9:19 b (flag 9:21))
27+ (body 10:3
28+ (branch 10:3
29+ (wing 10:6 b)
30+ (arm 11:5 (lit 11:5 %.y) (lit 11:9 ~zod))
31+ (arm 12:5
32+ (lit 12:5 %.n)
33+ (group 12:9
34+ (call 12:10 (wing 12:10 ship-result) (lit 12:22 %.y))))))))
35+ (value 13:1 flag-result
36+ (gate 13:16
37+ (face 13:19 b (flag 13:21))
38+ (body 14:3
39+ (branch 14:3
40+ (wing 14:6 b)
41+ (arm 15:5 (lit 15:5 %.y) (lit 15:9 %.y))
42+ (arm 16:5
43+ (lit 16:5 %.n)
44+ (group 16:9
45+ (call 16:10 (wing 16:10 flag-result) (lit 16:22 %.y))))))))
46+ (value 17:1 record-result
47+ (gate 17:18
48+ (face 17:21 b (flag 17:23))
49+ (body 18:3
50+ (branch 18:3
51+ (wing 18:6 b)
52+ (arm 19:5
53+ (lit 19:5 %.y)
54+ (tuple 19:9
55+ (face 19:10 who (lit 19:14 ~zod))
56+ (face 19:19 label (str 19:25 "ok"))))
57+ (arm 20:5
58+ (lit 20:5 %.n)
59+ (group 20:9
60+ (call 20:10 (wing 20:10 record-result) (lit 20:24 %.y))))))))
61+ (value 21:1 list-result
62+ (gate 21:16
63+ (face 21:19 b (flag 21:21))
64+ (body 22:3
65+ (branch 22:3
66+ (wing 22:6 b)
67+ (arm 23:5
68+ (lit 23:5 %.y)
69+ (cast 23:9
70+ (apply 23:12 list (aura 23:18 @t))
71+ (list 23:22 (str 23:24 "ok"))))
72+ (arm 24:5
73+ (lit 24:5 %.n)
74+ (group 24:9
75+ (call 24:10 (wing 24:10 list-result) (lit 24:22 %.y))))))))
76+ (value 25:1 input-base
77+ (gate 25:15
78+ (face 25:18 x (tvar 25:20 A))
79+ (body 26:3
80+ (branch 26:3
81+ (lit 26:6 %.y)
82+ (arm 27:5 (lit 27:5 %.y) (wing 27:9 x))
83+ (arm 28:5
84+ (lit 28:5 %.n)
85+ (group 28:9
86+ (call 28:10 (wing 28:10 input-base) (wing 28:21 x))))))))
87+ (value 29:1 inferred-base
88+ (gate 29:18
89+ (bind 29:21 x)
90+ (body 30:3
91+ (branch 30:3
92+ (lit 30:6 %.y)
93+ (arm 31:5 (lit 31:5 %.y) (wing 31:9 x))
94+ (arm 32:5
95+ (lit 32:5 %.n)
96+ (group 32:9
97+ (call 32:10 (wing 32:10 inferred-base) (wing 32:24 x))))))))
98+ (value 33:1 captured
99+ (gate 33:13
100+ (face 33:16 x (tvar 33:18 A))
101+ (body 34:3
102+ (value 34:3 inner
103+ (gate 34:12
104+ (face 34:15 b (flag 34:17))
105+ (wing 34:19 x)))
106+ (branch 35:3
107+ (lit 35:6 %.y)
108+ (arm 36:5
109+ (lit 36:5 %.y)
110+ (group 36:9
111+ (call 36:10 (wing 36:10 inner) (lit 36:16 %.y))))
112+ (arm 37:5
113+ (lit 37:5 %.n)
114+ (group 37:9
115+ (call 37:10 (wing 37:10 captured) (wing 37:19 x))))))))
116+ (value 38:1 forced
117+ (gate 38:11
118+ (face 38:14 x (tvar 38:16 A))
119+ (body 39:3
120+ (branch 39:3
121+ (lit 39:6 %.y)
122+ (arm 40:5
123+ (lit 40:5 %.y)
124+ (cast 40:9 (aura 40:12 @t) (wing 40:15 x)))
125+ (arm 41:5
126+ (lit 41:5 %.n)
127+ (group 41:9
128+ (call 41:10 (wing 41:10 forced) (wing 41:17 x))))))))
129+ (value 42:1 pending
130+ (gate 42:12
131+ (face 42:15 b (flag 42:17))
132+ (body 43:3
133+ (branch 43:3
134+ (wing 43:6 b)
135+ (arm 44:5 (lit 44:5 %.y) (lit 44:9 %unknown))
136+ (arm 45:5
137+ (lit 45:5 %.n)
138+ (group 45:9
139+ (call 45:10 (wing 45:10 pending) (wing 45:18 b))))))))
140+ (value 46:1 pending-null
141+ (gate 46:17
142+ (face 46:20 b (flag 46:22))
143+ (body 47:3
144+ (branch 47:3
145+ (wing 47:6 b)
146+ (arm 48:5 (lit 48:5 %.y) (lit 48:9 ~))
147+ (arm 49:5
148+ (lit 49:5 %.n)
149+ (group 49:9
150+ (call 49:10 (wing 49:10 pending-null) (wing 49:23 b))))))))
151+ (value 50:1 dependent
152+ (gate 50:14
153+ (face 50:17 b (flag 50:19))
154+ (body 51:3
155+ (branch 51:3
156+ (wing 51:6 b)
157+ (arm 52:5 (lit 52:5 %.y) (str 52:9 "ok"))
158+ (arm 53:5 (lit 53:5 %.n) (str 53:9 "other"))))))
159+ (value 54:1 nonself
160+ (gate 54:12
161+ (face 54:15 b (flag 54:17))
162+ (body 55:3
163+ (branch 55:3
164+ (wing 55:6 b)
165+ (arm 56:5 (lit 56:5 %.y) (str 56:9 "ok"))
166+ (arm 57:5
167+ (lit 57:5 %.n)
168+ (group 57:9
169+ (call 57:10 (wing 57:10 text-forward) (wing 57:23 b))))))))
170+ (value 58:1 polymorphic
171+ (gate 58:16
172+ (face 58:19 x (tvar 58:21 A))
173+ (body 59:3
174+ (branch 59:3
175+ (lit 59:6 %.y)
176+ (arm 60:5 (lit 60:5 %.y) (str 60:9 "ok"))
177+ (arm 61:5
178+ (lit 61:5 %.n)
179+ (group 61:9
180+ (call 61:10
181+ (wing 61:10 polymorphic)
182+ (tuple 61:22 (wing 61:23 x) (wing 61:25 x)))))))))
183+ (value 62:1 no-base
184+ (gate 62:12
185+ (face 62:15 b (flag 62:17))
186+ (group 62:19
187+ (call 62:20 (wing 62:20 no-base) (wing 62:28 b)))))
188+ (value 63:1 malformed
189+ (gate 63:14
190+ (face 63:17 b (flag 63:19))
191+ (body 64:3
192+ (branch 64:3
193+ (wing 64:6 b)
194+ (arm 65:5 (lit 65:5 %.y) (str 65:9 "ok"))
195+ (arm 66:5
196+ (lit 66:5 %.y)
197+ (group 66:9
198+ (call 66:10 (wing 66:10 malformed) (wing 66:20 b))))))))
199+ (value 67:1 mixed
200+ (gate 67:10
201+ (face 67:13 b (flag 67:15))
202+ (body 68:3
203+ (value 68:3 self (wing 68:11 mixed))
204+ (trace 69:3
205+ (cast 69:6
206+ (aura 69:9 @p)
207+ (group 69:12
208+ (call 69:13 (wing 69:13 self) (wing 69:18 b))))
209+ (body 70:5
210+ (branch 70:5
211+ (wing 70:8 b)
212+ (arm 71:7 (lit 71:7 %.y) (str 71:11 "ok"))
213+ (arm 72:7
214+ (lit 72:7 %.n)
215+ (group 72:11
216+ (call 72:12 (wing 72:12 mixed) (wing 72:18 b))))))))))
217+ (value 73:1 sample-base
218+ (gate 73:16
219+ (face 73:19 b (flag 73:21))
220+ (body 74:3
221+ (branch 74:3
222+ (wing 74:6 b)
223+ (arm 75:5 (lit 75:5 %.y) (wing 75:9 b))
224+ (arm 76:5
225+ (lit 76:5 %.n)
226+ (group 76:9
227+ (call 76:10 (wing 76:10 sample-base) (lit 76:22 %.y))))))))
228+ (value 77:1 sample-mismatch
229+ (gate 77:20
230+ (face 77:23 b (flag 77:25))
231+ (body 78:3
232+ (branch 78:3
233+ (wing 78:6 b)
234+ (arm 79:5 (lit 79:5 %.y) (str 79:9 "ok"))
235+ (arm 80:5
236+ (lit 80:5 %.n)
237+ (group 80:9
238+ (call 80:10 (wing 80:10 sample-mismatch) (str 80:26 "wrong"))))))))
239+ (value 81:1 self-subject
240+ (gate 81:17
241+ (face 81:20 b (flag 81:22))
242+ (body 82:3
243+ (branch 82:3
244+ (group 82:6
245+ (call 82:7 (wing 82:7 self-subject) (wing 82:20 b)))
246+ (arm 83:5 (lit 83:5 %.y) (str 83:9 "ok"))
247+ (arm 84:5
248+ (lit 84:5 %.n)
249+ (group 84:9
250+ (call 84:10 (wing 84:10 self-subject) (wing 84:23 b))))))))
251+ (value 85:1 aura-base
252+ (gate 85:14
253+ (face 85:17 b (flag 85:19))
254+ (body 86:3
255+ (branch 86:3
256+ (wing 86:6 b)
257+ (arm 87:5
258+ (lit 87:5 %.y)
259+ (cast 87:9 (aura 87:12 @u) (lit 87:15 0x1f)))
260+ (arm 88:5
261+ (lit 88:5 %.n)
262+ (group 88:9
263+ (call 88:10 (wing 88:10 aura-base) (wing 88:20 b))))))))
264+ (value 89:1 aura-conflict
265+ (gate 89:18
266+ (face 89:21 b (flag 89:23))
267+ (body 90:3
268+ (trace 90:3
269+ (cast 90:6
270+ (aura 90:9 @t)
271+ (group 90:12
272+ (call 90:13 (wing 90:13 aura-conflict) (wing 90:27 b))))
273+ (body 91:5
274+ (branch 91:5
275+ (wing 91:8 b)
276+ (arm 92:7 (lit 92:7 %.y) (lit 92:11 0x1f))
277+ (arm 93:7
278+ (lit 93:7 %.n)
279+ (group 93:11
280+ (call 93:12 (wing 93:12 aura-conflict) (wing 93:26 b))))))))))
281+ (value 94:1 traced
282+ (gate 94:11
283+ (face 94:14 b (flag 94:16))
284+ (body 95:3
285+ (branch 95:3
286+ (wing 95:6 b)
287+ (arm 96:5 (lit 96:5 %.y) (str 96:9 "ok"))
288+ (arm 97:5
289+ (lit 97:5 %.n)
290+ (body 98:7
291+ (trace 98:7
292+ (str 98:10 "trace")
293+ (body 99:9
294+ (group 99:9
295+ (call 99:10 (wing 99:10 traced) (wing 99:17 b)))))))))))
296+ (value 100:1 unresolved-number
297+ (gate 100:22
298+ (face 100:25 b (flag 100:27))
299+ (body 101:3
300+ (branch 101:3
301+ (wing 101:6 b)
302+ (arm 102:5 (lit 102:5 %.y) (lit 102:9 1))
303+ (arm 103:5
304+ (lit 103:5 %.n)
305+ (group 103:9
306+ (call 103:10 (wing 103:10 unresolved-number) (wing 103:28 b)))))))))
tests/golden/types-recursive-branch/types.txtnew file+38
@@ -0,0 +1,38 @@
1+partial inference; module not checked
2+++ text-forward: $-(? @t)
3+++ text-reverse: $-(? @t)
4+++ ship-result: $-(? @p)
5+++ flag-result: $-(? ?)
6+++ record-result: $-(? [who=@p label=@t])
7+++ list-result: $-(? (list @t))
8+++ input-base: $-(A A)
9+++ inferred-base: $-(A A)
10+++ captured: $-(A A)
11+++ forced: branch widening is not supported by partial inference
12+++ pending: branch widening is not supported by partial inference
13+++ pending-null: branch widening is not supported by partial inference
14+++ dependent: $-(? @t)
15+++ nonself: $-(? @t)
16+++ polymorphic: recursive gate constraint is not supported by partial inference
17+++ no-base: $-(? A)
18+++ malformed: branch does not cover both loobeans
19+++ mixed: branch arms have incompatible types
20+/tests/golden/types-recursive-branch/source.jibb:71:11: first arm has type @t
21+ %.y "ok"
22+ ^
23+/tests/golden/types-recursive-branch/source.jibb:72:11: second arm has type @p
24+ %.n (mixed b)
25+ ^
26+++ sample-base: $-(? ?)
27+++ sample-mismatch: recursive gate constraint is not supported by partial inference
28+++ self-subject: loobean branch subject does not unify with ?
29+++ aura-base: $-(? @u)
30+++ aura-conflict: branch arms have incompatible types
31+/tests/golden/types-recursive-branch/source.jibb:92:11: first arm has type @ux
32+ %.y 0x1f
33+ ^
34+/tests/golden/types-recursive-branch/source.jibb:93:11: second arm has type @t
35+ %.n (aura-conflict b)
36+ ^
37+++ traced: branch widening is not supported by partial inference
38+++ unresolved-number: unresolved aura-variable inference
tests/golden/types-recursive-gate/types.txt+1−1
@@ -1,5 +1,5 @@
1partial inference; module not checked
1partial inference; module not checked
2−++ bounce: branch widening is not supported by partial inference
2+++ bounce: $-(? ?)
3++ recur: $-(A A)
3++ recur: $-(A A)
4++ cord-result: @t
4++ cord-result: @t
5++ ship-result: @p
5++ ship-result: @p
tests/lib/jibb.hoon+144−138
@@ -1656,119 +1656,123 @@
1656/* tok-478 %txt /tests/golden/types-record-to-tuple/tokens/txt
1656/* tok-478 %txt /tests/golden/types-record-to-tuple/tokens/txt
1657/* tre-478 %txt /tests/golden/types-record-to-tuple/tree/txt
1657/* tre-478 %txt /tests/golden/types-record-to-tuple/tree/txt
1658/* typ-478 %txt /tests/golden/types-record-to-tuple/types/txt
1658/* typ-478 %txt /tests/golden/types-record-to-tuple/types/txt
1659−/* src-479 %jibb /tests/golden/types-recursive-gate/source/jibb
1659+/* src-479 %jibb /tests/golden/types-recursive-branch/source/jibb
1660−/* tok-479 %txt /tests/golden/types-recursive-gate/tokens/txt
1660+/* tok-479 %txt /tests/golden/types-recursive-branch/tokens/txt
1661−/* tre-479 %txt /tests/golden/types-recursive-gate/tree/txt
1661+/* tre-479 %txt /tests/golden/types-recursive-branch/tree/txt
1662+/* typ-479 %txt /tests/golden/types-recursive-branch/types/txt
1663+/* src-480 %jibb /tests/golden/types-recursive-gate/source/jibb
1664+/* tok-480 %txt /tests/golden/types-recursive-gate/tokens/txt
1665+/* tre-480 %txt /tests/golden/types-recursive-gate/tree/txt
1662−/* typ-479 %txt /tests/golden/types-recursive-gate/types/txt
1666+/* typ-480 %txt /tests/golden/types-recursive-gate/types/txt
1663−/* src-480 %jibb /tests/golden/types-union-alias/source/jibb
1667+/* src-481 %jibb /tests/golden/types-union-alias/source/jibb
1664−/* tok-480 %txt /tests/golden/types-union-alias/tokens/txt
1668+/* tok-481 %txt /tests/golden/types-union-alias/tokens/txt
1665−/* tre-480 %txt /tests/golden/types-union-alias/tree/txt
1669+/* tre-481 %txt /tests/golden/types-union-alias/tree/txt
1666−/* typ-480 %txt /tests/golden/types-union-alias/types/txt
1670+/* typ-481 %txt /tests/golden/types-union-alias/types/txt
1667−/* src-481 %jibb /tests/golden/types-union-branch-context/source/jibb
1671+/* src-482 %jibb /tests/golden/types-union-branch-context/source/jibb
1668−/* tok-481 %txt /tests/golden/types-union-branch-context/tokens/txt
1672+/* tok-482 %txt /tests/golden/types-union-branch-context/tokens/txt
1669−/* tre-481 %txt /tests/golden/types-union-branch-context/tree/txt
1673+/* tre-482 %txt /tests/golden/types-union-branch-context/tree/txt
1670−/* typ-481 %txt /tests/golden/types-union-branch-context/types/txt
1674+/* typ-482 %txt /tests/golden/types-union-branch-context/types/txt
1671−/* src-482 %jibb /tests/golden/types-union-branch-pending/source/jibb
1675+/* src-483 %jibb /tests/golden/types-union-branch-pending/source/jibb
1672−/* tok-482 %txt /tests/golden/types-union-branch-pending/tokens/txt
1676+/* tok-483 %txt /tests/golden/types-union-branch-pending/tokens/txt
1673−/* tre-482 %txt /tests/golden/types-union-branch-pending/tree/txt
1677+/* tre-483 %txt /tests/golden/types-union-branch-pending/tree/txt
1674−/* typ-482 %txt /tests/golden/types-union-branch-pending/types/txt
1678+/* typ-483 %txt /tests/golden/types-union-branch-pending/types/txt
1675−/* src-483 %jibb /tests/golden/types-union-constructor-shape/source/jibb
1679+/* src-484 %jibb /tests/golden/types-union-constructor-shape/source/jibb
1676−/* tok-483 %txt /tests/golden/types-union-constructor-shape/tokens/txt
1680+/* tok-484 %txt /tests/golden/types-union-constructor-shape/tokens/txt
1677−/* tre-483 %txt /tests/golden/types-union-constructor-shape/tree/txt
1681+/* tre-484 %txt /tests/golden/types-union-constructor-shape/tree/txt
1678−/* typ-483 %txt /tests/golden/types-union-constructor-shape/types/txt
1682+/* typ-484 %txt /tests/golden/types-union-constructor-shape/types/txt
1679−/* src-484 %jibb /tests/golden/types-union-context-flow/source/jibb
1683+/* src-485 %jibb /tests/golden/types-union-context-flow/source/jibb
1680−/* tok-484 %txt /tests/golden/types-union-context-flow/tokens/txt
1684+/* tok-485 %txt /tests/golden/types-union-context-flow/tokens/txt
1681−/* tre-484 %txt /tests/golden/types-union-context-flow/tree/txt
1685+/* tre-485 %txt /tests/golden/types-union-context-flow/tree/txt
1682−/* typ-484 %txt /tests/golden/types-union-context-flow/types/txt
1686+/* typ-485 %txt /tests/golden/types-union-context-flow/types/txt
1683−/* src-485 %jibb /tests/golden/types-union-import/source/jibb
1687+/* src-486 %jibb /tests/golden/types-union-import/source/jibb
1684−/* tok-485 %txt /tests/golden/types-union-import/tokens/txt
1688+/* tok-486 %txt /tests/golden/types-union-import/tokens/txt
1685−/* tre-485 %txt /tests/golden/types-union-import/tree/txt
1689+/* tre-486 %txt /tests/golden/types-union-import/tree/txt
1686−/* mod-485-1 %jibb /tests/golden/types-union-import/modules/ui/lib/jibb
1690+/* mod-486-1 %jibb /tests/golden/types-union-import/modules/ui/lib/jibb
1687−/* typ-485 %txt /tests/golden/types-union-import/types/txt
1691+/* typ-486 %txt /tests/golden/types-union-import/types/txt
1688−/* mtre-485 %txt /tests/golden/types-union-import/module-trees/txt
1692+/* mtre-486 %txt /tests/golden/types-union-import/module-trees/txt
1689−/* src-486 %jibb /tests/golden/types-union-local-pending/source/jibb
1693+/* src-487 %jibb /tests/golden/types-union-local-pending/source/jibb
1690−/* tok-486 %txt /tests/golden/types-union-local-pending/tokens/txt
1694+/* tok-487 %txt /tests/golden/types-union-local-pending/tokens/txt
1691−/* tre-486 %txt /tests/golden/types-union-local-pending/tree/txt
1695+/* tre-487 %txt /tests/golden/types-union-local-pending/tree/txt
1692−/* typ-486 %txt /tests/golden/types-union-local-pending/types/txt
1696+/* typ-487 %txt /tests/golden/types-union-local-pending/types/txt
1693−/* src-487 %jibb /tests/golden/types-union-overlap/source/jibb
1697+/* src-488 %jibb /tests/golden/types-union-overlap/source/jibb
1694−/* tok-487 %txt /tests/golden/types-union-overlap/tokens/txt
1698+/* tok-488 %txt /tests/golden/types-union-overlap/tokens/txt
1695−/* tre-487 %txt /tests/golden/types-union-overlap/tree/txt
1699+/* tre-488 %txt /tests/golden/types-union-overlap/tree/txt
1696−/* typ-487 %txt /tests/golden/types-union-overlap/types/txt
1700+/* typ-488 %txt /tests/golden/types-union-overlap/types/txt
1697−/* src-488 %jibb /tests/golden/types-union-overlap-nested/source/jibb
1701+/* src-489 %jibb /tests/golden/types-union-overlap-nested/source/jibb
1698−/* tok-488 %txt /tests/golden/types-union-overlap-nested/tokens/txt
1702+/* tok-489 %txt /tests/golden/types-union-overlap-nested/tokens/txt
1699−/* tre-488 %txt /tests/golden/types-union-overlap-nested/tree/txt
1703+/* tre-489 %txt /tests/golden/types-union-overlap-nested/tree/txt
1700−/* typ-488 %txt /tests/golden/types-union-overlap-nested/types/txt
1704+/* typ-489 %txt /tests/golden/types-union-overlap-nested/types/txt
1701−/* src-489 %jibb /tests/golden/types-union-phantom-generic/source/jibb
1705+/* src-490 %jibb /tests/golden/types-union-phantom-generic/source/jibb
1702−/* tok-489 %txt /tests/golden/types-union-phantom-generic/tokens/txt
1706+/* tok-490 %txt /tests/golden/types-union-phantom-generic/tokens/txt
1703−/* tre-489 %txt /tests/golden/types-union-phantom-generic/tree/txt
1707+/* tre-490 %txt /tests/golden/types-union-phantom-generic/tree/txt
1704−/* typ-489 %txt /tests/golden/types-union-phantom-generic/types/txt
1708+/* typ-490 %txt /tests/golden/types-union-phantom-generic/types/txt
1705−/* src-490 %jibb /tests/golden/types-union-print-cross-namespace/source/jibb
1709+/* src-491 %jibb /tests/golden/types-union-print-cross-namespace/source/jibb
1706−/* tok-490 %txt /tests/golden/types-union-print-cross-namespace/tokens/txt
1710+/* tok-491 %txt /tests/golden/types-union-print-cross-namespace/tokens/txt
1707−/* tre-490 %txt /tests/golden/types-union-print-cross-namespace/tree/txt
1711+/* tre-491 %txt /tests/golden/types-union-print-cross-namespace/tree/txt
1708−/* mod-490-1 %jibb /tests/golden/types-union-print-cross-namespace/modules/ui/lib/jibb
1712+/* mod-491-1 %jibb /tests/golden/types-union-print-cross-namespace/modules/ui/lib/jibb
1709−/* typ-490 %txt /tests/golden/types-union-print-cross-namespace/types/txt
1713+/* typ-491 %txt /tests/golden/types-union-print-cross-namespace/types/txt
1710−/* mtre-490 %txt /tests/golden/types-union-print-cross-namespace/module-trees/txt
1714+/* mtre-491 %txt /tests/golden/types-union-print-cross-namespace/module-trees/txt
1711−/* src-491 %jibb /tests/golden/types-union-print-distinct/source/jibb
1715+/* src-492 %jibb /tests/golden/types-union-print-distinct/source/jibb
1712−/* tok-491 %txt /tests/golden/types-union-print-distinct/tokens/txt
1716+/* tok-492 %txt /tests/golden/types-union-print-distinct/tokens/txt
1713−/* tre-491 %txt /tests/golden/types-union-print-distinct/tree/txt
1717+/* tre-492 %txt /tests/golden/types-union-print-distinct/tree/txt
1714−/* mod-491-1 %jibb /tests/golden/types-union-print-distinct/modules/ui/left/jibb
1718+/* mod-492-1 %jibb /tests/golden/types-union-print-distinct/modules/ui/left/jibb
1715−/* mod-491-2 %jibb /tests/golden/types-union-print-distinct/modules/ui/right/jibb
1719+/* mod-492-2 %jibb /tests/golden/types-union-print-distinct/modules/ui/right/jibb
1716−/* mod-491-3 %jibb /tests/golden/types-union-print-distinct/modules/ui/twin/jibb
1720+/* mod-492-3 %jibb /tests/golden/types-union-print-distinct/modules/ui/twin/jibb
1717−/* typ-491 %txt /tests/golden/types-union-print-distinct/types/txt
1721+/* typ-492 %txt /tests/golden/types-union-print-distinct/types/txt
1718−/* mtre-491 %txt /tests/golden/types-union-print-distinct/module-trees/txt
1722+/* mtre-492 %txt /tests/golden/types-union-print-distinct/module-trees/txt
1719−/* src-492 %jibb /tests/golden/types-union-print-escape/source/jibb
1723+/* src-493 %jibb /tests/golden/types-union-print-escape/source/jibb
1720−/* tok-492 %txt /tests/golden/types-union-print-escape/tokens/txt
1724+/* tok-493 %txt /tests/golden/types-union-print-escape/tokens/txt
1721−/* tre-492 %txt /tests/golden/types-union-print-escape/tree/txt
1725+/* tre-493 %txt /tests/golden/types-union-print-escape/tree/txt
1722−/* typ-492 %txt /tests/golden/types-union-print-escape/types/txt
1726+/* typ-493 %txt /tests/golden/types-union-print-escape/types/txt
1723−/* src-493 %jibb /tests/golden/types-union-print-local/source/jibb
1727+/* src-494 %jibb /tests/golden/types-union-print-local/source/jibb
1724−/* tok-493 %txt /tests/golden/types-union-print-local/tokens/txt
1728+/* tok-494 %txt /tests/golden/types-union-print-local/tokens/txt
1725−/* tre-493 %txt /tests/golden/types-union-print-local/tree/txt
1729+/* tre-494 %txt /tests/golden/types-union-print-local/tree/txt
1726−/* typ-493 %txt /tests/golden/types-union-print-local/types/txt
1730+/* typ-494 %txt /tests/golden/types-union-print-local/types/txt
1727−/* src-494 %jibb /tests/golden/types-union-print-nested/source/jibb
1731+/* src-495 %jibb /tests/golden/types-union-print-nested/source/jibb
1728−/* tok-494 %txt /tests/golden/types-union-print-nested/tokens/txt
1732+/* tok-495 %txt /tests/golden/types-union-print-nested/tokens/txt
1729−/* tre-494 %txt /tests/golden/types-union-print-nested/tree/txt
1733+/* tre-495 %txt /tests/golden/types-union-print-nested/tree/txt
1730−/* typ-494 %txt /tests/golden/types-union-print-nested/types/txt
1734+/* typ-495 %txt /tests/golden/types-union-print-nested/types/txt
1731−/* src-495 %jibb /tests/golden/types-union-print-same-origin/source/jibb
1735+/* src-496 %jibb /tests/golden/types-union-print-same-origin/source/jibb
1732−/* tok-495 %txt /tests/golden/types-union-print-same-origin/tokens/txt
1736+/* tok-496 %txt /tests/golden/types-union-print-same-origin/tokens/txt
1733−/* tre-495 %txt /tests/golden/types-union-print-same-origin/tree/txt
1737+/* tre-496 %txt /tests/golden/types-union-print-same-origin/tree/txt
1734−/* mod-495-1 %jibb /tests/golden/types-union-print-same-origin/modules/ui/shared/jibb
1738+/* mod-496-1 %jibb /tests/golden/types-union-print-same-origin/modules/ui/shared/jibb
1735−/* typ-495 %txt /tests/golden/types-union-print-same-origin/types/txt
1739+/* typ-496 %txt /tests/golden/types-union-print-same-origin/types/txt
1736−/* mtre-495 %txt /tests/golden/types-union-print-same-origin/module-trees/txt
1740+/* mtre-496 %txt /tests/golden/types-union-print-same-origin/module-trees/txt
1737−/* src-496 %jibb /tests/golden/types-union-print-transitive/source/jibb
1741+/* src-497 %jibb /tests/golden/types-union-print-transitive/source/jibb
1738−/* tok-496 %txt /tests/golden/types-union-print-transitive/tokens/txt
1742+/* tok-497 %txt /tests/golden/types-union-print-transitive/tokens/txt
1739−/* tre-496 %txt /tests/golden/types-union-print-transitive/tree/txt
1743+/* tre-497 %txt /tests/golden/types-union-print-transitive/tree/txt
1740−/* mod-496-1 %jibb /tests/golden/types-union-print-transitive/modules/ui/mid/jibb
1744+/* mod-497-1 %jibb /tests/golden/types-union-print-transitive/modules/ui/mid/jibb
1741−/* mod-496-2 %jibb /tests/golden/types-union-print-transitive/modules/ui/base/jibb
1745+/* mod-497-2 %jibb /tests/golden/types-union-print-transitive/modules/ui/base/jibb
1742−/* typ-496 %txt /tests/golden/types-union-print-transitive/types/txt
1746+/* typ-497 %txt /tests/golden/types-union-print-transitive/types/txt
1743−/* mtre-496 %txt /tests/golden/types-union-print-transitive/module-trees/txt
1747+/* mtre-497 %txt /tests/golden/types-union-print-transitive/module-trees/txt
1744−/* src-497 %jibb /tests/golden/types-union-singleton/source/jibb
1748+/* src-498 %jibb /tests/golden/types-union-singleton/source/jibb
1745−/* tok-497 %txt /tests/golden/types-union-singleton/tokens/txt
1749+/* tok-498 %txt /tests/golden/types-union-singleton/tokens/txt
1746−/* tre-497 %txt /tests/golden/types-union-singleton/tree/txt
1750+/* tre-498 %txt /tests/golden/types-union-singleton/tree/txt
1747−/* typ-497 %txt /tests/golden/types-union-singleton/types/txt
1751+/* typ-498 %txt /tests/golden/types-union-singleton/types/txt
1748−/* src-498 %jibb /tests/golden/types-union-tag-atoms/source/jibb
1752+/* src-499 %jibb /tests/golden/types-union-tag-atoms/source/jibb
1749−/* tok-498 %txt /tests/golden/types-union-tag-atoms/tokens/txt
1753+/* tok-499 %txt /tests/golden/types-union-tag-atoms/tokens/txt
1750−/* tre-498 %txt /tests/golden/types-union-tag-atoms/tree/txt
1754+/* tre-499 %txt /tests/golden/types-union-tag-atoms/tree/txt
1751−/* typ-498 %txt /tests/golden/types-union-tag-atoms/types/txt
1755+/* typ-499 %txt /tests/golden/types-union-tag-atoms/types/txt
1752−/* src-499 %jibb /tests/golden/types-union-tags/source/jibb
1756+/* src-500 %jibb /tests/golden/types-union-tags/source/jibb
1753−/* tok-499 %txt /tests/golden/types-union-tags/tokens/txt
1757+/* tok-500 %txt /tests/golden/types-union-tags/tokens/txt
1754−/* tre-499 %txt /tests/golden/types-union-tags/tree/txt
1758+/* tre-500 %txt /tests/golden/types-union-tags/tree/txt
1755−/* typ-499 %txt /tests/golden/types-union-tags/types/txt
1759+/* typ-500 %txt /tests/golden/types-union-tags/types/txt
1756−/* src-500 %jibb /tests/golden/types-union-unresolved/source/jibb
1760+/* src-501 %jibb /tests/golden/types-union-unresolved/source/jibb
1757−/* tok-500 %txt /tests/golden/types-union-unresolved/tokens/txt
1761+/* tok-501 %txt /tests/golden/types-union-unresolved/tokens/txt
1758−/* tre-500 %txt /tests/golden/types-union-unresolved/tree/txt
1762+/* tre-501 %txt /tests/golden/types-union-unresolved/tree/txt
1759−/* typ-500 %txt /tests/golden/types-union-unresolved/types/txt
1763+/* typ-501 %txt /tests/golden/types-union-unresolved/types/txt
1760−/* src-501 %jibb /tests/golden/types-union-unresolved-flow/source/jibb
1764+/* src-502 %jibb /tests/golden/types-union-unresolved-flow/source/jibb
1761−/* tok-501 %txt /tests/golden/types-union-unresolved-flow/tokens/txt
1765+/* tok-502 %txt /tests/golden/types-union-unresolved-flow/tokens/txt
1762−/* tre-501 %txt /tests/golden/types-union-unresolved-flow/tree/txt
1766+/* tre-502 %txt /tests/golden/types-union-unresolved-flow/tree/txt
1763−/* typ-501 %txt /tests/golden/types-union-unresolved-flow/types/txt
1767+/* typ-502 %txt /tests/golden/types-union-unresolved-flow/types/txt
1764−/* src-502 %jibb /tests/golden/types-unit-context/source/jibb
1768+/* src-503 %jibb /tests/golden/types-unit-context/source/jibb
1765−/* tok-502 %txt /tests/golden/types-unit-context/tokens/txt
1769+/* tok-503 %txt /tests/golden/types-unit-context/tokens/txt
1766−/* tre-502 %txt /tests/golden/types-unit-context/tree/txt
1770+/* tre-503 %txt /tests/golden/types-unit-context/tree/txt
1767−/* typ-502 %txt /tests/golden/types-unit-context/types/txt
1771+/* typ-503 %txt /tests/golden/types-unit-context/types/txt
1768−/* src-503 %jibb /tests/golden/types-unit-patterns/source/jibb
1772+/* src-504 %jibb /tests/golden/types-unit-patterns/source/jibb
1769−/* tok-503 %txt /tests/golden/types-unit-patterns/tokens/txt
1773+/* tok-504 %txt /tests/golden/types-unit-patterns/tokens/txt
1770−/* tre-503 %txt /tests/golden/types-unit-patterns/tree/txt
1774+/* tre-504 %txt /tests/golden/types-unit-patterns/tree/txt
1771−/* typ-503 %txt /tests/golden/types-unit-patterns/types/txt
1775+/* typ-504 %txt /tests/golden/types-unit-patterns/types/txt
1772=/ prepared-prelude (prepare-prelude:jibb prelude-source)
1776=/ prepared-prelude (prepare-prelude:jibb prelude-source)
1773|%
1777|%
1774:: one arm per case
1778:: one arm per case
@@ -2729,56 +2733,58 @@
2729 (weld (check ~.types-record-nested src-477 `tok-477 `tre-477) (check-types ~.types-record-nested ~[%tests %golden ~.types-record-nested %source %jibb] src-477 `typ-477))
2733 (weld (check ~.types-record-nested src-477 `tok-477 `tre-477) (check-types ~.types-record-nested ~[%tests %golden ~.types-record-nested %source %jibb] src-477 `typ-477))
2730++ test-types-record-to-tuple
2734++ test-types-record-to-tuple
2731 (weld (check ~.types-record-to-tuple src-478 `tok-478 `tre-478) (check-types ~.types-record-to-tuple ~[%tests %golden ~.types-record-to-tuple %source %jibb] src-478 `typ-478))
2735 (weld (check ~.types-record-to-tuple src-478 `tok-478 `tre-478) (check-types ~.types-record-to-tuple ~[%tests %golden ~.types-record-to-tuple %source %jibb] src-478 `typ-478))
2736+++ test-types-recursive-branch
2737+ (weld (check ~.types-recursive-branch src-479 `tok-479 `tre-479) (check-module-types ~.types-recursive-branch ~[%tests %golden ~.types-recursive-branch %source %jibb] src-479 `typ-479 ~ ~ ~))
2732++ test-types-recursive-gate
2738++ test-types-recursive-gate
2733− (weld (check ~.types-recursive-gate src-479 `tok-479 `tre-479) (check-types ~.types-recursive-gate ~[%tests %golden ~.types-recursive-gate %source %jibb] src-479 `typ-479))
2739+ (weld (check ~.types-recursive-gate src-480 `tok-480 `tre-480) (check-types ~.types-recursive-gate ~[%tests %golden ~.types-recursive-gate %source %jibb] src-480 `typ-480))
2734++ test-types-union-alias
2740++ test-types-union-alias
2735− (weld (check ~.types-union-alias src-480 `tok-480 `tre-480) (check-types ~.types-union-alias ~[%tests %golden ~.types-union-alias %source %jibb] src-480 `typ-480))
2741+ (weld (check ~.types-union-alias src-481 `tok-481 `tre-481) (check-types ~.types-union-alias ~[%tests %golden ~.types-union-alias %source %jibb] src-481 `typ-481))
2736++ test-types-union-branch-context
2742++ test-types-union-branch-context
2737− (weld (check ~.types-union-branch-context src-481 `tok-481 `tre-481) (check-types ~.types-union-branch-context ~[%tests %golden ~.types-union-branch-context %source %jibb] src-481 `typ-481))
2743+ (weld (check ~.types-union-branch-context src-482 `tok-482 `tre-482) (check-types ~.types-union-branch-context ~[%tests %golden ~.types-union-branch-context %source %jibb] src-482 `typ-482))
2738++ test-types-union-branch-pending
2744++ test-types-union-branch-pending
2739− (weld (check ~.types-union-branch-pending src-482 `tok-482 `tre-482) (check-types ~.types-union-branch-pending ~[%tests %golden ~.types-union-branch-pending %source %jibb] src-482 `typ-482))
2745+ (weld (check ~.types-union-branch-pending src-483 `tok-483 `tre-483) (check-types ~.types-union-branch-pending ~[%tests %golden ~.types-union-branch-pending %source %jibb] src-483 `typ-483))
2740++ test-types-union-constructor-shape
2746++ test-types-union-constructor-shape
2741− (weld (check ~.types-union-constructor-shape src-483 `tok-483 `tre-483) (check-types ~.types-union-constructor-shape ~[%tests %golden ~.types-union-constructor-shape %source %jibb] src-483 `typ-483))
2747+ (weld (check ~.types-union-constructor-shape src-484 `tok-484 `tre-484) (check-types ~.types-union-constructor-shape ~[%tests %golden ~.types-union-constructor-shape %source %jibb] src-484 `typ-484))
2742++ test-types-union-context-flow
2748++ test-types-union-context-flow
2743− (weld (check ~.types-union-context-flow src-484 `tok-484 `tre-484) (check-types ~.types-union-context-flow ~[%tests %golden ~.types-union-context-flow %source %jibb] src-484 `typ-484))
2749+ (weld (check ~.types-union-context-flow src-485 `tok-485 `tre-485) (check-types ~.types-union-context-flow ~[%tests %golden ~.types-union-context-flow %source %jibb] src-485 `typ-485))
2744++ test-types-union-import
2750++ test-types-union-import
2745− (weld (weld (check ~.types-union-import src-485 `tok-485 `tre-485) (check-module-types ~.types-union-import ~[%tests %golden ~.types-union-import %source %jibb] src-485 `typ-485 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-485-1]])) (check-module-trees ~.types-union-import `mtre-485 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-485-1]]))
2751+ (weld (weld (check ~.types-union-import src-486 `tok-486 `tre-486) (check-module-types ~.types-union-import ~[%tests %golden ~.types-union-import %source %jibb] src-486 `typ-486 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-486-1]])) (check-module-trees ~.types-union-import `mtre-486 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-486-1]]))
2746++ test-types-union-local-pending
2752++ test-types-union-local-pending
2747− (weld (check ~.types-union-local-pending src-486 `tok-486 `tre-486) (check-types ~.types-union-local-pending ~[%tests %golden ~.types-union-local-pending %source %jibb] src-486 `typ-486))
2753+ (weld (check ~.types-union-local-pending src-487 `tok-487 `tre-487) (check-types ~.types-union-local-pending ~[%tests %golden ~.types-union-local-pending %source %jibb] src-487 `typ-487))
2748++ test-types-union-overlap
2754++ test-types-union-overlap
2749− (weld (check ~.types-union-overlap src-487 `tok-487 `tre-487) (check-types ~.types-union-overlap ~[%tests %golden ~.types-union-overlap %source %jibb] src-487 `typ-487))
2755+ (weld (check ~.types-union-overlap src-488 `tok-488 `tre-488) (check-types ~.types-union-overlap ~[%tests %golden ~.types-union-overlap %source %jibb] src-488 `typ-488))
2750++ test-types-union-overlap-nested
2756++ test-types-union-overlap-nested
2751− (weld (check ~.types-union-overlap-nested src-488 `tok-488 `tre-488) (check-types ~.types-union-overlap-nested ~[%tests %golden ~.types-union-overlap-nested %source %jibb] src-488 `typ-488))
2757+ (weld (check ~.types-union-overlap-nested src-489 `tok-489 `tre-489) (check-types ~.types-union-overlap-nested ~[%tests %golden ~.types-union-overlap-nested %source %jibb] src-489 `typ-489))
2752++ test-types-union-phantom-generic
2758++ test-types-union-phantom-generic
2753− (weld (check ~.types-union-phantom-generic src-489 `tok-489 `tre-489) (check-types ~.types-union-phantom-generic ~[%tests %golden ~.types-union-phantom-generic %source %jibb] src-489 `typ-489))
2759+ (weld (check ~.types-union-phantom-generic src-490 `tok-490 `tre-490) (check-types ~.types-union-phantom-generic ~[%tests %golden ~.types-union-phantom-generic %source %jibb] src-490 `typ-490))
2754++ test-types-union-print-cross-namespace
2760++ test-types-union-print-cross-namespace
2755− (weld (weld (check ~.types-union-print-cross-namespace src-490 `tok-490 `tre-490) (check-module-types ~.types-union-print-cross-namespace ~[%tests %golden ~.types-union-print-cross-namespace %source %jibb] src-490 `typ-490 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-490-1]])) (check-module-trees ~.types-union-print-cross-namespace `mtre-490 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-490-1]]))
2761+ (weld (weld (check ~.types-union-print-cross-namespace src-491 `tok-491 `tre-491) (check-module-types ~.types-union-print-cross-namespace ~[%tests %golden ~.types-union-print-cross-namespace %source %jibb] src-491 `typ-491 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-491-1]])) (check-module-trees ~.types-union-print-cross-namespace `mtre-491 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-491-1]]))
2756++ test-types-union-print-distinct
2762++ test-types-union-print-distinct
2757− (weld (weld (check ~.types-union-print-distinct src-491 `tok-491 `tre-491) (check-module-types ~.types-union-print-distinct ~[%tests %golden ~.types-union-print-distinct %source %jibb] src-491 `typ-491 ~ ~ ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-491-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-491-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-491-3]])) (check-module-trees ~.types-union-print-distinct `mtre-491 ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-491-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-491-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-491-3]]))
2763+ (weld (weld (check ~.types-union-print-distinct src-492 `tok-492 `tre-492) (check-module-types ~.types-union-print-distinct ~[%tests %golden ~.types-union-print-distinct %source %jibb] src-492 `typ-492 ~ ~ ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-492-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-492-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-492-3]])) (check-module-trees ~.types-union-print-distinct `mtre-492 ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-492-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-492-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-492-3]]))
2758++ test-types-union-print-escape
2764++ test-types-union-print-escape
2759− (weld (check ~.types-union-print-escape src-492 `tok-492 `tre-492) (check-types ~.types-union-print-escape ~[%tests %golden ~.types-union-print-escape %source %jibb] src-492 `typ-492))
2765+ (weld (check ~.types-union-print-escape src-493 `tok-493 `tre-493) (check-types ~.types-union-print-escape ~[%tests %golden ~.types-union-print-escape %source %jibb] src-493 `typ-493))
2760++ test-types-union-print-local
2766++ test-types-union-print-local
2761− (weld (check ~.types-union-print-local src-493 `tok-493 `tre-493) (check-types ~.types-union-print-local ~[%tests %golden ~.types-union-print-local %source %jibb] src-493 `typ-493))
2767+ (weld (check ~.types-union-print-local src-494 `tok-494 `tre-494) (check-types ~.types-union-print-local ~[%tests %golden ~.types-union-print-local %source %jibb] src-494 `typ-494))
2762++ test-types-union-print-nested
2768++ test-types-union-print-nested
2763− (weld (check ~.types-union-print-nested src-494 `tok-494 `tre-494) (check-types ~.types-union-print-nested ~[%tests %golden ~.types-union-print-nested %source %jibb] src-494 `typ-494))
2769+ (weld (check ~.types-union-print-nested src-495 `tok-495 `tre-495) (check-types ~.types-union-print-nested ~[%tests %golden ~.types-union-print-nested %source %jibb] src-495 `typ-495))
2764++ test-types-union-print-same-origin
2770++ test-types-union-print-same-origin
2765− (weld (weld (check ~.types-union-print-same-origin src-495 `tok-495 `tre-495) (check-module-types ~.types-union-print-same-origin ~[%tests %golden ~.types-union-print-same-origin %source %jibb] src-495 `typ-495 ~ ~ ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-495-1]])) (check-module-trees ~.types-union-print-same-origin `mtre-495 ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-495-1]]))
2771+ (weld (weld (check ~.types-union-print-same-origin src-496 `tok-496 `tre-496) (check-module-types ~.types-union-print-same-origin ~[%tests %golden ~.types-union-print-same-origin %source %jibb] src-496 `typ-496 ~ ~ ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-496-1]])) (check-module-trees ~.types-union-print-same-origin `mtre-496 ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-496-1]]))
2766++ test-types-union-print-transitive
2772++ test-types-union-print-transitive
2767− (weld (weld (check ~.types-union-print-transitive src-496 `tok-496 `tre-496) (check-module-types ~.types-union-print-transitive ~[%tests %golden ~.types-union-print-transitive %source %jibb] src-496 `typ-496 ~ ~ ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-496-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-496-2]])) (check-module-trees ~.types-union-print-transitive `mtre-496 ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-496-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-496-2]]))
2773+ (weld (weld (check ~.types-union-print-transitive src-497 `tok-497 `tre-497) (check-module-types ~.types-union-print-transitive ~[%tests %golden ~.types-union-print-transitive %source %jibb] src-497 `typ-497 ~ ~ ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-497-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-497-2]])) (check-module-trees ~.types-union-print-transitive `mtre-497 ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-497-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-497-2]]))
2768++ test-types-union-singleton
2774++ test-types-union-singleton
2769− (weld (check ~.types-union-singleton src-497 `tok-497 `tre-497) (check-types ~.types-union-singleton ~[%tests %golden ~.types-union-singleton %source %jibb] src-497 `typ-497))
2775+ (weld (check ~.types-union-singleton src-498 `tok-498 `tre-498) (check-types ~.types-union-singleton ~[%tests %golden ~.types-union-singleton %source %jibb] src-498 `typ-498))
2770++ test-types-union-tag-atoms
2776++ test-types-union-tag-atoms
2771− (weld (check ~.types-union-tag-atoms src-498 `tok-498 `tre-498) (check-types ~.types-union-tag-atoms ~[%tests %golden ~.types-union-tag-atoms %source %jibb] src-498 `typ-498))
2777+ (weld (check ~.types-union-tag-atoms src-499 `tok-499 `tre-499) (check-types ~.types-union-tag-atoms ~[%tests %golden ~.types-union-tag-atoms %source %jibb] src-499 `typ-499))
2772++ test-types-union-tags
2778++ test-types-union-tags
2773− (weld (check ~.types-union-tags src-499 `tok-499 `tre-499) (check-types ~.types-union-tags ~[%tests %golden ~.types-union-tags %source %jibb] src-499 `typ-499))
2779+ (weld (check ~.types-union-tags src-500 `tok-500 `tre-500) (check-types ~.types-union-tags ~[%tests %golden ~.types-union-tags %source %jibb] src-500 `typ-500))
2774++ test-types-union-unresolved
2780++ test-types-union-unresolved
2775− (weld (check ~.types-union-unresolved src-500 `tok-500 `tre-500) (check-types ~.types-union-unresolved ~[%tests %golden ~.types-union-unresolved %source %jibb] src-500 `typ-500))
2781+ (weld (check ~.types-union-unresolved src-501 `tok-501 `tre-501) (check-types ~.types-union-unresolved ~[%tests %golden ~.types-union-unresolved %source %jibb] src-501 `typ-501))
2776++ test-types-union-unresolved-flow
2782++ test-types-union-unresolved-flow
2777− (weld (check ~.types-union-unresolved-flow src-501 `tok-501 `tre-501) (check-types ~.types-union-unresolved-flow ~[%tests %golden ~.types-union-unresolved-flow %source %jibb] src-501 `typ-501))
2783+ (weld (check ~.types-union-unresolved-flow src-502 `tok-502 `tre-502) (check-types ~.types-union-unresolved-flow ~[%tests %golden ~.types-union-unresolved-flow %source %jibb] src-502 `typ-502))
2778++ test-types-unit-context
2784++ test-types-unit-context
2779− (weld (check ~.types-unit-context src-502 `tok-502 `tre-502) (check-types ~.types-unit-context ~[%tests %golden ~.types-unit-context %source %jibb] src-502 `typ-502))
2785+ (weld (check ~.types-unit-context src-503 `tok-503 `tre-503) (check-types ~.types-unit-context ~[%tests %golden ~.types-unit-context %source %jibb] src-503 `typ-503))
2780++ test-types-unit-patterns
2786++ test-types-unit-patterns
2781− (weld (check ~.types-unit-patterns src-503 `tok-503 `tre-503) (check-types ~.types-unit-patterns ~[%tests %golden ~.types-unit-patterns %source %jibb] src-503 `typ-503))
2787+ (weld (check ~.types-unit-patterns src-504 `tok-504 `tre-504) (check-types ~.types-unit-patterns ~[%tests %golden ~.types-unit-patterns %source %jibb] src-504 `typ-504))
2782::
2788::
2783:: +check: run golden:jibb on a case and compare both outputs
2789:: +check: run golden:jibb on a case and compare both outputs
2784::
2790::