on master help sign in
Infer supported named generic unions
250564ciko
docs/compiler.md+4−4
@@ -56,17 +56,17 @@ 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, closed local mold aliases and acyclic forward value references. It instantiates generalized top-level definitions when they are used. 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; unresolved tags remain pending. Recursive local groups, recursive molds and generic unions remain 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, while variable-dependent face merges, tag context across branches and ambiguous call-result propagation remain unsupported; function compatibility involving nested `@` and variable-dependent joins remain unsupported except for equal types. 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, closed local mold aliases and acyclic forward value references. It instantiates generalized top-level definitions when they are used. 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; unresolved tags remain pending. 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. Generic union aliases and body-local generic union molds remain unsupported, as do recursive local groups and recursive molds. 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, while 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 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
61−For 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 alias may name a transitive union. A 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. Two faces for the same imported origin remain compatible; compatibility between distinct union origins, including in gate types, remains unsupported. Generic unions remain unsupported, even when a parameter is unused. The Hoon bridge does not yet translate union forks into inference, so this printing support does not complete unnamed Hoon union imports.
61+For 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 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 does not yet translate union forks into inference, so this printing support does not complete unnamed Hoon union imports.
62
62
63A known closed union can also provide context to each arm of a complete loobean branch in a cast or a call with a known union sample. Nested branches and transparent groups work; a mismatch reports the expected union and the offending arm. General patterns and context through bodies with local definitions remain unsupported, and unrelated unresolved tags stay pending.
63A known closed union can also provide context to each arm of a complete loobean branch in a cast or a call with a known union sample. Nested branches and transparent groups work; a mismatch reports the expected union and the offending arm. General patterns and context through bodies with local definitions remain unsupported, and unrelated unresolved tags stay pending.
64
64
65−The separate `jibb-dev/lib/jibb-import.hoon` is an unfinished reader for selected Hoon type graphs. It handles named recursion, nested map, set, queue, list, unit, jar and jug arguments, direct ordered maps, and direct `$^` unions whose source branches can be proved disjoint. It also reads ordered map fields in records when the map arguments are syntactically fixed atom molds and other fields are fixed atom molds or standard collections of static atom molds. Collection names must not be shadowed. The reader can also import a mark door sample, removing its outer sample face and validating its build subject. The reader checks explicit Hoon `$%`, `$?` and `$^` unions against the Grammar’s disjointness rule (doc question 22). It re-evaluates statically recognizable source branches before Hoon can collapse them, checks materialized fork cases, and rejects shapes it cannot prove disjoint. Static records may also have verified standard-collection and `path` siblings. One direct explicit union argument in a standard list, set, map or unit is accepted when its call wrapper and collection provenance are verified and its static cases are pairwise disjoint. Other collection-union forms, nested ordered maps, general source-level disjointness and complete integration with the checker remain unfinished. `+golden-types-imports` can consume fixed-aura atoms and nested faced or unfaced cells with valid Jibb face names from caller-supplied reader results for declared `/-` imports; `+golden-types-with-marks` accepts those same shapes from declared mark imports in a separate list. Other forms remain unsupported. Its disjointness proof is conservative and can reject a valid union it cannot prove disjoint. Collection recognition requires the originating `/sur` core. The reader validates direct zuse subjects and Ford subjects consisting of faced imported cores and a validated tail, checking imported cores transitively; it rejects shadowed names, inconsistent core subjects and other subject shapes. For a recursive reference, the reader matches the exact Hoon hold against named arms in validated cores, including transitive Ford imports; it rejects missing, unlabelled or ambiguous origins. Its fixtures include three real Tlon files; `tools/importer-test` compares the internal projection under eval, and the ship test compares the same golden output. `tools/type-import-test` and `tools/type-mark-test` compare bridge reports under eval and on the ship. `tools/clay-fixtures` also passes Clay-built `/sur` molds and mark samples through the Clay-built importer and partial checker.
65+The separate `jibb-dev/lib/jibb-import.hoon` is an unfinished reader for selected Hoon type graphs. It handles named recursion, nested map, set, queue, list, unit, jar and jug arguments, direct ordered maps, and direct `$^` unions whose source branches can be proved disjoint. It also reads ordered map fields in records when the map arguments are syntactically fixed atom molds and other fields are fixed atom molds or standard collections of static atom molds. Collection names must not be shadowed. The reader can also import a mark door sample, removing its outer sample face and validating its build subject. The reader checks explicit Hoon `$%`, `$?` and `$^` unions against the Grammar’s disjointness rule (doc question 22). It re-evaluates statically recognizable source branches before Hoon can collapse them, checks materialized fork cases, and rejects shapes it cannot prove disjoint. Static records may also have verified standard-collection and `path` siblings. One direct explicit union argument in a standard list, set, map or unit is accepted when its call wrapper and collection provenance are verified and its static cases are pairwise disjoint. A synthetic regression checks that forged wrapper subjects, samples and tails are rejected. Other collection-union forms, nested ordered maps, general source-level disjointness and complete integration with the checker remain unfinished. `+golden-types-imports` can consume fixed-aura atoms and nested faced or unfaced cells with valid Jibb face names from caller-supplied reader results for declared `/-` imports; `+golden-types-with-marks` accepts those same shapes from declared mark imports in a separate list. Other forms remain unsupported. Its disjointness proof is conservative and can reject a valid union it cannot prove disjoint. Collection recognition requires the originating `/sur` core. The reader validates direct zuse subjects and Ford subjects consisting of faced imported cores and a validated tail, checking imported cores transitively; it rejects shadowed names, inconsistent core subjects and other subject shapes. For a recursive reference, the reader matches the exact Hoon hold against named arms in validated cores, including transitive Ford imports; it rejects missing, unlabelled or ambiguous origins. Its fixtures include three real Tlon files; `tools/importer-test` compares the internal projection under eval, and the ship test compares the same golden output. `tools/type-import-test` and `tools/type-mark-test` compare bridge reports under eval and on the ship. `tools/clay-fixtures` also passes Clay-built `/sur` molds and mark samples through the Clay-built importer and partial checker.
66
66
67Callers that have a `/sur` core and a name can use `+read-named`: it checks for a locally declared arm before asking Hoon to evaluate the mold, and reports evaluation failures with the final Hoon trace line. `+read-mold-in` remains available when the caller already has the selected type. The checker currently treats a failed import as unsupported rather than rendering the importer's error.
67Callers that have a `/sur` core and a name can use `+read-named`: it checks for a locally declared arm before asking Hoon to evaluate the mold, and reports evaluation failures with the final Hoon trace line. `+read-mold-in` remains available when the caller already has the selected type. The checker currently treats a failed import as unsupported rather than rendering the importer's error.
68
68
69−`+golden-types-with-prelude` accepts case-local Jibb module sources alongside `/sur` and mark results and the vendored prelude source. It resolves reachable ordinary library modules in dependency order, caching completed interfaces per invocation and exporting supported closed value schemes and simple or nonrecursive generic mold aliases. It reserves names from the supplied prelude, detects missing sources and cycles, and rejects a dependency if its interface cannot be inferred by the fragment. API files, modules with `main`, unsupported definitions and many other features remain outside this subset; the prelude inventory itself is incomplete. The older `+golden-types-with-modules` entry point fails closed for imports because it has no prelude scope. Neither entry point claims the module has been checked.
69+`+golden-types-with-prelude` accepts case-local Jibb module sources alongside `/sur` and mark results and the vendored prelude source. It resolves reachable ordinary library modules in dependency order, caching completed interfaces per invocation and exporting supported closed value schemes, direct generic unions, and simple or nonrecursive generic mold aliases whose bodies the fragment supports. It reserves names from the supplied prelude, detects missing sources and cycles, and rejects a dependency if its interface cannot be inferred by the fragment. API files, modules with `main`, unsupported definitions and many other features remain outside this subset; the prelude inventory itself is incomplete. The older `+golden-types-with-modules` entry point fails closed for imports because it has no prelude scope. Neither entry point claims the module has been checked.
70
70
71And the design notes:
71And the design notes:
72
72
docs/open-questions.md+2−1
@@ -18,7 +18,7 @@ On 2026-10-30, @iko adopted gate-free `eq` arguments and map and set keys, treat
18
18
19## Questions milestone 2 raises
19## Questions milestone 2 raises
20
20
21−Found while writing [prompts/milestone-2.md](prompts/milestone-2.md) and checking it against the doc's examples. The numbering is retained so existing references stay valid. Questions 3, 18, 20, 21 and 22 remain open; the other questions are settled.
21+Found while writing [prompts/milestone-2.md](prompts/milestone-2.md), checking it against the doc's examples, and building the checker. The numbering is retained so existing references stay valid. Questions 3, 18, 20, 21, 22 and 23 remain open; the other questions are settled.
22
22
231. **Settled: how the prelude identifies jetted functions.** On 2026-10-30, @iko said the prelude functions have working Jibb implementations, and the compiler recognizes their shapes and uses the Hoon versions so jets can fire.
231. **Settled: how the prelude identifies jetted functions.** On 2026-10-30, @iko said the prelude functions have working Jibb implementations, and the compiler recognizes their shapes and uses the Hoon versions so jets can fire.
242. **Settled: how the prelude keeps helpers private.** On 2026-10-30, @iko chose a separate internal prelude module imported by the prelude, without exposing the imported helpers.
242. **Settled: how the prelude keeps helpers private.** On 2026-10-30, @iko chose a separate internal prelude module imported by the prelude, without exposing the imported helpers.
@@ -42,6 +42,7 @@ Found while writing [prompts/milestone-2.md](prompts/milestone-2.md) and checkin
4220. **The type of Hoon `clap`.** Hoon allows its two input units and combining gate's result to have different types. If only one unit is present it returns that unit; when both are present it returns the combining gate's result. Jibb branches normally need a common type, while every union written in Jibb has a name. Should the Jibb gate require a shared type, infer an unnamed union of the possible values, or wait for a different typing design? Asked @iko on 2026-10-30. `clap` is not implemented while this is open.
4220. **The type of Hoon `clap`.** Hoon allows its two input units and combining gate's result to have different types. If only one unit is present it returns that unit; when both are present it returns the combining gate's result. Jibb branches normally need a common type, while every union written in Jibb has a name. Should the Jibb gate require a shared type, infer an unnamed union of the possible values, or wait for a different typing design? Asked @iko on 2026-10-30. `clap` is not implemented while this is open.
4321. **Duplicate faces in imported Hoon records.** Hoon permits `[a=@ud a=@t]`, and its lookup picks the first `a`. Should Jibb reject the imported type where it is used, use the first field, or permit the type but reject access to the ambiguous field? Asked @iko on 2026-10-30. The inference fragment currently permits the type but declines ambiguous field access (doc question).
4321. **Duplicate faces in imported Hoon records.** Hoon permits `[a=@ud a=@t]`, and its lookup picks the first `a`. Should Jibb reject the imported type where it is used, use the first field, or permit the type but reject access to the ambiguous field? Asked @iko on 2026-10-30. The inference fragment currently permits the type but declines ambiguous field access (doc question).
4422. **Overlapping imported `$%` and `$?` cases.** The Grammar says a union whose cases don't all differ as nouns is rejected, while the import table explicitly mentions that condition only for `$^`; its `$%` and `$?` row says they become a union. Does the general disjointness rule reject imported `$%` and `$?` cases such as `[%x @ud]` and `[%x @t]` where the type is used? Asked @iko on 2026-10-30. The general rule is the provisional reading (doc question); the importer rejects recognizable overlaps and fails closed when it cannot verify them.
4422. **Overlapping imported `$%` and `$?` cases.** The Grammar says a union whose cases don't all differ as nouns is rejected, while the import table explicitly mentions that condition only for `$^`; its `$%` and `$?` row says they become a union. Does the general disjointness rule reject imported `$%` and `$?` cases such as `[%x @ud]` and `[%x @t]` where the type is used? Asked @iko on 2026-10-30. The general rule is the provisional reading (doc question); the importer rejects recognizable overlaps and fails closed when it cannot verify them.
45+23. **Converging explicit capitals.** May a body constrain two separately written capitals to the same type? For `++ repeated |= x=(choice A A) x`, should `++ f |= x=(choice A B) (repeated x)` infer `$-((choice A A) (choice A A))`, or reject it because `A` and `B` are distinct? The same issue arises when casting `(phantom A)` to `(phantom B)` and across local captures. Asked @iko on 2026-10-30. Pending an answer, partial inference declines to merge distinct explicitly written capitals (doc question).
45
46
46## Grammar questions never put to the doc's author
47## Grammar questions never put to the doc's author
47
48
docs/prelude-inventory.md+1−1
@@ -43,7 +43,7 @@ The following is an audit of the Hoon 135 bodies, not a completed Jibb interface
43
43
44`snoc`, `lure`, `fand`, `find`, `flop`, `gulf`, `homo`, `join`, `bake`, `lent`, `levy`, `lien`, `limo`, `murn`, `oust`, `reap`, `rear`, `reel`, `roll`, `scag`, `skid`, `skim`, `skip`, `slag`, `snag`, `snip`, `sort`, `spin`, `spun`, `swag`, `turn`, `weld`, `snap`, `into`, `welp`, `zing`.
44`snoc`, `lure`, `fand`, `find`, `flop`, `gulf`, `homo`, `join`, `bake`, `lent`, `levy`, `lien`, `limo`, `murn`, `oust`, `reap`, `rear`, `reel`, `roll`, `scag`, `skid`, `skim`, `skip`, `slag`, `snag`, `snip`, `sort`, `spin`, `spun`, `swag`, `turn`, `weld`, `snap`, `into`, `welp`, `zing`.
45
45
46−The current prelude writes `snoc`, `lure`, `flop`, `levy`, `lien`, `reel`, `roll`, `skim`, `skip`, `turn` and `weld`. The folds take an explicit initial value as the Prelude table specifies. These implementations still need checker and backend validation.
46+The current prelude writes `snoc`, `lure`, `flop`, `join`, `levy`, `lien`, `murn`, `rear`, `reel`, `roll`, `skim`, `skip`, `snip`, `turn` and `weld`. `murn` keeps the present products of its gate in order; `join` inserts a separator between items; `snip` drops the last item, and `rear` returns it or crashes on an empty list. The folds take an explicit initial value as the Prelude table specifies. These implementations still need checker and backend validation.
47
47
48## 2c
48## 2c
49
49
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 and nested faced or unfaced cells from `/sur` molds and marks into inference. 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 the current prelude names, 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, simple and nonrecursive generic mold aliases, selected faced record casts and field reads, and contextual tags and constructors for closed disjoint unions, including propagation through complete loobean branches in casts and known union-sample calls. Variable-dependent face merges remain unsupported. Supported closed unions print using an in-scope name or imported alias; a union whose name is not accessible prints its cases, parenthesized when nested. The latter is print-only. Different import faces for the same origin remain compatible; compatibility across distinct union origins is still unsupported, as are generic unions even when their parameters are unused. The Hoon bridge cannot yet bring union forks into inference. 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; its golden fixtures include three real Tlon files. The prelude currently has only a few functions, 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 and nested faced or unfaced cells from `/sur` molds and marks into inference. 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 the current prelude names, 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, 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 branches in casts and known union-sample calls. 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. Generic aliases of union molds and body-local generic unions also remain unsupported. The Hoon bridge cannot yet bring union forks into inference. 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. 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
24## Milestone 1: parser and mark
24## Milestone 1: parser and mark
25
25
@@ -37,8 +37,8 @@ What the plan asks for, and where it is:
37
37
38Besides the plan's list:
38Besides the plan's list:
39
39
40−- 481 golden cases: 265 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.
40+- 487 golden cases: 271 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.
41−- The 481-case corpus passed under `urbit eval` in 57.8 s. The fake ship passed all 486 tests, including the importer, importer/checker and mark/checker bridges, module scope and unification checks, with 25.7 s for sync and 53.8 s for tests. The importer golden compares 140 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.
41+- The 487-case corpus passed under `urbit eval` in 78.8 s. The fake ship passed all 492 tests, including the importer, importer/checker and mark/checker bridges, module scope and unification checks, with 25.9 s for sync and 30.9 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.
42- `tools/testdata/selftest` (22 checks) and `tools/testdata/ship-selftest` test the tools themselves.
42- `tools/testdata/selftest` (22 checks) and `tools/testdata/ship-selftest` test the tools themselves.
43- 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.
43- 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.
44- 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).
44- 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).
@@ -70,14 +70,15 @@ Besides the plan's list:
70| edd9277 | 2026-10-30 | Infer nonrecursive generic mold aliases with lexical parameters |
70| edd9277 | 2026-10-30 | Infer nonrecursive generic mold aliases with lexical parameters |
71| 4406f6f | 2026-10-30 | Resolve selected contextual tags and check explicit imported unions |
71| 4406f6f | 2026-10-30 | Resolve selected contextual tags and check explicit imported unions |
72| 5c73614 | 2026-10-30 | Print supported named and escaping union types |
72| 5c73614 | 2026-10-30 | Print supported named and escaping union types |
73−| This change | 2026-10-30 | Propagate union context through loobean branches, read selected unions in Hoon collections, and add `flit` |
73+| 0070584 | 2026-10-30 | Propagate union context through loobean branches, read selected unions in Hoon collections, and add `flit` |
74+| This change | 2026-10-30 | Infer selected named generic unions, test Hoon collection wrappers, and add list helpers |
74
75
75## Checking it
76## Checking it
76
77
77On a machine set up as [development.md](development.md) says:
78On a machine set up as [development.md](development.md) says:
78
79
79```
80```
80−tools/golden # 481 cases under urbit eval
81+tools/golden # 487 cases under urbit eval
81tools/importer-test # the Hoon importer fixture projection
82tools/importer-test # the Hoon importer fixture projection
82tools/type-import-test # the importer/checker bridge fixture
83tools/type-import-test # the importer/checker bridge fixture
83tools/type-mark-test # the mark/checker bridge fixture
84tools/type-mark-test # the mark/checker bridge fixture
@@ -87,7 +88,7 @@ tools/testdata/selftest # the tools themselves
87tools/doc-blocks docs/spec # the doc's examples are golden cases
88tools/doc-blocks docs/spec # the doc's examples are golden cases
88tools/ship start
89tools/ship start
89tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
90tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
90−tools/ship test # the same 481 cases as -test arms on the ship
91+tools/ship test # the same 487 cases as -test arms on the ship
91tools/testdata/ship-selftest
92tools/testdata/ship-selftest
92tools/ship check-commit # |commit stores .jibb files
93tools/ship check-commit # |commit stores .jibb files
93tools/clay-fixtures # example /sur files and marks build through Clay
94tools/clay-fixtures # example /sur files and marks build through Clay
jibb-dev/lib/jibb-import.hoon+14
@@ -1227,6 +1227,19 @@
1227 =/ source=hoon original(q.p (decorate-union-source q.p.original))
1227 =/ source=hoon original(q.p (decorate-union-source q.p.original))
1228 (read-mold %small name typ(q source))
1228 (read-mold %small name typ(q source))
1229::
1229::
1230+:: Synthetic nodes test each part of the direct collection-call proof.
1231+++ collection-wrapper-fixture
1232+ ^- tape
1233+ =/ call=hoon [%cncl [%tsgr [%wing ~[[%.y 7]]] [%cncl [%wing ~[%list]] ~]] ~[[%$ 6]]]
1234+ =/ subject=hoon [%cncl [%tsgr [%wing ~[[%.y 8]]] [%cncl [%wing ~[%list]] ~]] ~[[%$ 6]]]
1235+ =/ sample=hoon [%cncl [%tsgr [%wing ~[[%.y 7]]] [%cncl [%wing ~[%list]] ~]] ~[[%$ 2]]]
1236+ =/ good=hoon [%tsls [%note [%made %x ~] call] [%tsls [%dtts [%$ 14] [%$ 2]] [%$ 6]]]
1237+ =/ tail=hoon [%tsls [%note [%made %x ~] call] [%$ 6]]
1238+ =/ args=(list [hoon hoon]) ~[[call good] [subject good] [sample good] [call tail]]
1239+ =/ flags=(list ?) (turn args |=(pair=[hoon hoon] (direct-collection-source -.pair +.pair)))
1240+ ?: =(flags ~[& | | |]) "valid; forged subject, sample and tail rejected"
1241+ "wrapper guard failed"
1242+::
1230++ overlap-fork-fixture
1243++ overlap-fork-fixture
1231 ^- type
1244 ^- type
1232 =/ nodes=(list type) ~[[%atom %ud ~] [%atom %t ~]]
1245 =/ nodes=(list type) ~[[%atom %ud ~] [%atom %t ~]]
@@ -1349,6 +1362,7 @@
1349 (crip "explicit-three: {(show-result (sample %explicit-three))}")
1362 (crip "explicit-three: {(show-result (sample %explicit-three))}")
1350 (crip "explicit-unknown: {(show-result (sample %explicit-unknown))}")
1363 (crip "explicit-unknown: {(show-result (sample %explicit-unknown))}")
1351 (crip "explicit-nested: {(show-result (sample %explicit-nested))}")
1364 (crip "explicit-nested: {(show-result (sample %explicit-nested))}")
1365+ (crip "collection-union-wrapper: {collection-wrapper-fixture}")
1352 (crip "collection-union-list: {(show-result (sample %collection-union-list))}")
1366 (crip "collection-union-list: {(show-result (sample %collection-union-list))}")
1353 (crip "collection-union-set: {(show-result (sample %collection-union-set))}")
1367 (crip "collection-union-set: {(show-result (sample %collection-union-set))}")
1354 (crip "collection-union-map-key: {(show-result (sample %collection-union-map-key))}")
1368 (crip "collection-union-map-key: {(show-result (sample %collection-union-map-key))}")
jibb-dev/lib/jibb.hoon+94−27
@@ -4595,9 +4595,10 @@
4595:: their defaulting and inferred generalization are implemented.
4595:: their defaulting and inferred generalization are implemented.
4596:: Bare @ is a separate unrestricted atom type. A directional fit check
4596:: Bare @ is a separate unrestricted atom type. A directional fit check
4597:: permits concrete atoms to widen to it, never the reverse. A fit that
4597:: permits concrete atoms to widen to it, never the reverse. A fit that
4598−:: needs a not-yet-implemented constraint remains unsupported. Named closed
4598+:: needs a not-yet-implemented constraint remains unsupported. Named unions
4599−:: unions retain their module of origin separately from their
4599+:: retain origin and ordered arguments, including phantom arguments, apart
4600+:: from their display name. Generic cases must be disjoint for all arguments.
4600−:: displayed name. Union printing is informational; it is not Jibb syntax.
4601+:: Unnamed union printing is informational; it is not Jibb syntax.
4601::
4602::
4602+$ itype
4603+$ itype
4603 $~ [%var 0]
4604 $~ [%var 0]
@@ -4609,7 +4610,7 @@
4609 [%flag ~]
4610 [%flag ~]
4610 [%tag id=@ud literal=lit constructor=?]
4611 [%tag id=@ud literal=lit constructor=?]
4611 [%const literal=lit]
4612 [%const literal=lit]
4612− [%union cases=(list itype) origin=(unit [at=path name=term]) label=(unit @t)]
4613+ [%union cases=(list itype) origin=(unit [at=path name=term]) label=(unit @t) args=(list itype)]
4613 [%face name=term body=itype]
4614 [%face name=term body=itype]
4614 [%fn sample=itype product=itype]
4615 [%fn sample=itype product=itype]
4615 [%cell hed=itype tal=itype]
4616 [%cell hed=itype tal=itype]
@@ -4659,7 +4660,7 @@
4659 %flag |
4660 %flag |
4660 %tag =(n id.t)
4661 %tag =(n id.t)
4661 %const |
4662 %const |
4662− %union (lien cases.t |=(c=itype (itype-occurs n c sub)))
4663+ %union |((lien cases.t |=(c=itype (itype-occurs n c sub))) (lien args.t |=(c=itype (itype-occurs n c sub))))
4663 %face $(t body.t)
4664 %face $(t body.t)
4664 %fn |($(t sample.t) $(t product.t))
4665 %fn |($(t sample.t) $(t product.t))
4665 %cell |($(t hed.t) $(t tal.t))
4666 %cell |($(t hed.t) $(t tal.t))
@@ -4678,8 +4679,10 @@
4678 =. b (itype-walk b sub)
4679 =. b (itype-walk b sub)
4679 ?: =(a b) `sub
4680 ?: =(a b) `sub
4680 ?: &(?=(%union -.a) ?=(%union -.b))
4681 ?: &(?=(%union -.a) ?=(%union -.b))
4682+ ?. =(origin.a origin.b) ~
4681− ?: &(=(origin.a origin.b) =(cases.a cases.b)) `sub
4683+ ?: &(?=(~ args.a) ?=(~ args.b)) ?:(=(cases.a cases.b) `sub ~)
4682− ~
4684+ ?~ origin.a ~
4685+ (itype-unify-args args.a args.b sub)
4683 ?: ?=(%var -.a)
4686 ?: ?=(%var -.a)
4684 ?: (itype-occurs id.a b sub) ~
4687 ?: (itype-occurs id.a b sub) ~
4685 `[[id.a b] sub]
4688 `[[id.a b] sub]
@@ -4718,6 +4721,15 @@
4718 $(a tal.a, b tal.b, sub u.first)
4721 $(a tal.a, b tal.b, sub u.first)
4719 ~
4722 ~
4720::
4723::
4724+++ itype-unify-args
4725+ |= [as=(list itype) bs=(list itype) sub=isub]
4726+ ^- (unit isub)
4727+ ?~ as ?~(bs `sub ~)
4728+ ?~ bs ~
4729+ =/ next=(unit isub) (itype-unify i.as i.bs sub)
4730+ ?~ next ~
4731+ $(as t.as, bs t.bs, sub u.next)
4732+::
4721:: +itype-fit: one-way widening from an actual type to an expected type
4733:: +itype-fit: one-way widening from an actual type to an expected type
4722::
4734::
4723:: An unknown variable used where @ is expected gains a fresh atom
4735:: An unknown variable used where @ is expected gains a fresh atom
@@ -4737,7 +4749,7 @@
4737 %flag |
4749 %flag |
4738 %tag |
4750 %tag |
4739 %const |
4751 %const |
4740− %union (lien cases.t |=(c=itype (itype-has-any-atom c sub)))
4752+ %union |((lien cases.t |=(c=itype (itype-has-any-atom c sub))) (lien args.t |=(c=itype (itype-has-any-atom c sub))))
4741 %face $(t body.t)
4753 %face $(t body.t)
4742 %fn |($(t sample.t) $(t product.t))
4754 %fn |($(t sample.t) $(t product.t))
4743 %cell |($(t hed.t) $(t tal.t))
4755 %cell |($(t hed.t) $(t tal.t))
@@ -4794,7 +4806,7 @@
4794 %flag &
4806 %flag &
4795 %tag &
4807 %tag &
4796 %const &
4808 %const &
4797− %union (lien cases.typ |=(c=itype (itype-has-fixed-atom c)))
4809+ %union |((lien cases.typ |=(c=itype (itype-has-fixed-atom c))) (lien args.typ |=(c=itype (itype-has-fixed-atom c))))
4798 %face $(typ body.typ)
4810 %face $(typ body.typ)
4799 %fn |($(typ sample.typ) $(typ product.typ))
4811 %fn |($(typ sample.typ) $(typ product.typ))
4800 %cell |($(typ hed.typ) $(typ tal.typ))
4812 %cell |($(typ hed.typ) $(typ tal.typ))
@@ -4889,7 +4901,7 @@
4889 %face $(t body.t)
4901 %face $(t body.t)
4890 %fn |($(t sample.t) $(t product.t))
4902 %fn |($(t sample.t) $(t product.t))
4891 %cell |($(t hed.t) $(t tal.t))
4903 %cell |($(t hed.t) $(t tal.t))
4892− %union (lien cases.t |=(c=itype (itype-has-tag c)))
4904+ %union |((lien cases.t |=(c=itype (itype-has-tag c))) (lien args.t |=(c=itype (itype-has-tag c))))
4893 * |
4905 * |
4894 ==
4906 ==
4895::
4907::
@@ -4904,6 +4916,23 @@
4904 * |
4916 * |
4905 ==
4917 ==
4906::
4918::
4919+:: Until a visible generic alias can be selected, expanding a named
4920+:: generic union would hide phantom arguments and its origin. This is a
4921+:: limitation of partial inference, not the unnamed-union print notation.
4922+::
4923+++ itype-has-hidden-generic
4924+ |= t=itype
4925+ ^- ?
4926+ ?- -.t
4927+ %union
4928+ ?: &(?=(~ label.t) ?=(^ args.t)) &
4929+ (lien (weld args.t cases.t) |=(c=itype (itype-has-hidden-generic c)))
4930+ %face $(t body.t)
4931+ %fn |($(t sample.t) $(t product.t))
4932+ %cell |($(t hed.t) $(t tal.t))
4933+ * |
4934+ ==
4935+::
4907++ itype-fit-cases
4936++ itype-fit-cases
4908 |= [actual=itype cases=(list itype) sub=isub next=@ud]
4937 |= [actual=itype cases=(list itype) sub=isub next=@ud]
4909 ^- ifit
4938 ^- ifit
@@ -4951,7 +4980,12 @@
4951 =. expected (itype-walk expected sub)
4980 =. expected (itype-walk expected sub)
4952 ?: =(actual expected) [%ok sub next]
4981 ?: =(actual expected) [%ok sub next]
4953 ?: &(?=(%union -.actual) ?=(%union -.expected))
4982 ?: &(?=(%union -.actual) ?=(%union -.expected))
4983+ ?. =(origin.actual origin.expected) [%unknown ~]
4984+ ?: &(?=(~ args.actual) ?=(~ args.expected))
4954− ?: &(=(origin.actual origin.expected) =(cases.actual cases.expected)) [%ok sub next]
4985+ ?:(=(cases.actual cases.expected) [%ok sub next] [%unknown ~])
4986+ ?~ origin.actual [%unknown ~]
4987+ =/ unified=(unit isub) (itype-unify-args args.actual args.expected sub)
4988+ ?^ unified [%ok u.unified next]
4955 [%unknown ~]
4989 [%unknown ~]
4956 ?: ?=(%union -.actual) [%unknown ~]
4990 ?: ?=(%union -.actual) [%unknown ~]
4957 ?: &(?=(%union -.expected) |(?=(%avar -.actual) ?=(%nvar -.actual))) [%unknown ~]
4991 ?: &(?=(%union -.expected) |(?=(%avar -.actual) ?=(%nvar -.actual))) [%unknown ~]
@@ -5106,7 +5140,7 @@
5106 ^- itype
5140 ^- itype
5107 =. t (itype-walk t sub)
5141 =. t (itype-walk t sub)
5108 ?: ?=(%union -.t)
5142 ?: ?=(%union -.t)
5109− [%union (turn cases.t |=(c=itype (itype-normalize c sub))) origin.t label.t]
5143+ [%union (turn cases.t |=(c=itype (itype-normalize c sub))) origin.t label.t (turn args.t |=(c=itype (itype-normalize c sub)))]
5110 ?: ?=(%face -.t)
5144 ?: ?=(%face -.t)
5111 [%face name.t $(t body.t)]
5145 [%face name.t $(t body.t)]
5112 ?: ?=(%fn -.t)
5146 ?: ?=(%fn -.t)
@@ -5161,7 +5195,7 @@
5161 %flag ~
5195 %flag ~
5162 %tag ~
5196 %tag ~
5163 %const ~
5197 %const ~
5164− %union (zing (turn cases.t |=(c=itype (itype-vars c))))
5198+ %union (zing (turn (weld args.t cases.t) |=(c=itype (itype-vars c))))
5165 %face $(t body.t)
5199 %face $(t body.t)
5166 %fn (weld $(t sample.t) $(t product.t))
5200 %fn (weld $(t sample.t) $(t product.t))
5167 %cell (weld $(t hed.t) $(t tal.t))
5201 %cell (weld $(t hed.t) $(t tal.t))
@@ -5197,7 +5231,7 @@
5197 %flag t
5231 %flag t
5198 %tag t
5232 %tag t
5199 %const t
5233 %const t
5200− %union [%union (turn cases.t |=(c=itype (itype-rename c ren))) origin.t label.t]
5234+ %union [%union (turn cases.t |=(c=itype (itype-rename c ren))) origin.t label.t (turn args.t |=(c=itype (itype-rename c ren)))]
5201 %face [%face name.t $(t body.t)]
5235 %face [%face name.t $(t body.t)]
5202 %fn [%fn $(t sample.t) $(t product.t)]
5236 %fn [%fn $(t sample.t) $(t product.t)]
5203 %cell [%cell $(t hed.t) $(t tal.t)]
5237 %cell [%cell $(t hed.t) $(t tal.t)]
@@ -5218,7 +5252,7 @@
5218 %flag |
5252 %flag |
5219 %tag |
5253 %tag |
5220 %const |
5254 %const |
5221− %union (lien cases.t |=(c=itype (itype-var-is-atom n c)))
5255+ %union |((lien cases.t |=(c=itype (itype-var-is-atom n c))) (lien args.t |=(c=itype (itype-var-is-atom n c))))
5222 %face $(t body.t)
5256 %face $(t body.t)
5223 %fn |($(t sample.t) $(t product.t))
5257 %fn |($(t sample.t) $(t product.t))
5224 %cell |($(t hed.t) $(t tal.t))
5258 %cell |($(t hed.t) $(t tal.t))
@@ -5403,7 +5437,7 @@
5403 =? alias ?=(~ alias) (imported-union-alias u.origin.t molds.iface)
5437 =? alias ?=(~ alias) (imported-union-alias u.origin.t molds.iface)
5404 ?~ alias ~
5438 ?~ alias ~
5405 `(crip "{(trip u.alias)}.{(trip face)}")
5439 `(crip "{(trip u.alias)}.{(trip face)}")
5406− [%union (turn cases.t |=(c=itype (itype-in-import c iface face))) origin.t label]
5440+ [%union (turn cases.t |=(c=itype (itype-in-import c iface face))) origin.t label (turn args.t |=(c=itype (itype-in-import c iface face)))]
5407 %face [%face name.t $(t body.t)]
5441 %face [%face name.t $(t body.t)]
5408 %fn [%fn $(t sample.t) $(t product.t)]
5442 %fn [%fn $(t sample.t) $(t product.t)]
5409 %cell [%cell $(t hed.t) $(t tal.t)]
5443 %cell [%cell $(t hed.t) $(t tal.t)]
@@ -5413,9 +5447,12 @@
5413++ label-direct-union
5447++ label-direct-union
5414 |= [typ=itype body=shape name=term state=istate]
5448 |= [typ=itype body=shape name=term state=istate]
5415 ^- itype
5449 ^- itype
5450+ ?. ?=(%union -.typ) typ
5416− ?. &(?=(%union -.body) ?=(%union -.typ)) typ
5451+ =/ direct=? ?=(%union -.body)
5452+ =? direct ?=(%generic -.body) ?=(%union -.body.body)
5453+ ?. direct typ
5417 ?. (lien top-molds.state |=(n=term =(n name))) typ
5454 ?. (lien top-molds.state |=(n=term =(n name))) typ
5418− [%union cases.typ `[at.state name] `name]
5455+ [%union cases.typ `[at.state name] `name args.typ]
5419::
5456::
5420:: Generic mold parameters are lexical and distinct from the enclosing
5457:: Generic mold parameters are lexical and distinct from the enclosing
5421:: value's capital variables. Arguments are substituted only once, so
5458:: value's capital variables. Arguments are substituted only once, so
@@ -5481,8 +5518,9 @@
5481 =/ out=(unit [typ=itype state=istate])
5518 =/ out=(unit [typ=itype state=istate])
5482 (infer-simple-shape body.sh state(next next.fresh, params params.fresh, in-mold &))
5519 (infer-simple-shape body.sh state(next next.fresh, params params.fresh, in-mold &))
5483 ?~ out ~
5520 ?~ out ~
5484− :: Generic union identity must include its arguments; defer that case.
5485− ?: ?=(%union -.typ.u.out) ~
5521+ ?: &(?=(%union -.typ.u.out) !?=(%union -.body.sh)) ~
5522+ =? typ.u.out ?=(%union -.typ.u.out)
5523+ typ.u.out(args (turn vars.fresh |=(n=@ud `itype`[%var n])))
5486 =/ used=(list @ud) (itype-vars typ.u.out)
5524 =/ used=(list @ud) (itype-vars typ.u.out)
5487 ?. (levy used |=(n=@ud (lien vars.fresh |=(p=@ud =(p n))))) ~
5525 ?. (levy used |=(n=@ud (lien vars.fresh |=(p=@ud =(p n))))) ~
5488 `[[typ.u.out vars.fresh] state.u.out(params params.state, in-mold in-mold.state)]
5526 `[[typ.u.out vars.fresh] state.u.out(params params.state, in-mold in-mold.state)]
@@ -5508,8 +5546,7 @@
5508 ?. (levy pairs |=(p=upair =(%disjoint relation.p))) ~
5546 ?. (levy pairs |=(p=upair =(%disjoint relation.p))) ~
5509 =/ cs=(unit [types=(list itype) state=istate]) (infer-shape-args cases.sh state)
5547 =/ cs=(unit [types=(list itype) state=istate]) (infer-shape-args cases.sh state)
5510 ?~ cs ~
5548 ?~ cs ~
5511− ?: (lien types.u.cs |=(t=itype ?=(^ (itype-vars t)))) ~
5512− `[[%union types.u.cs ~ ~] state.u.cs]
5549+ `[[%union types.u.cs ~ ~ ~] state.u.cs]
5513 %cell (infer-simple-fields fields.sh state)
5550 %cell (infer-simple-fields fields.sh state)
5514 %fn
5551 %fn
5515 =/ arg=(unit [typ=itype state=istate]) $(sh sample.sh)
5552 =/ arg=(unit [typ=itype state=istate]) $(sh sample.sh)
@@ -5569,7 +5606,10 @@
5569 =/ out=(unit [typ=itype state=istate])
5606 =/ out=(unit [typ=itype state=istate])
5570 $(sh body.u.found, state state.u.args(active [n active.state.u.args], in-mold &, params u.params))
5607 $(sh body.u.found, state state.u.args(active [n active.state.u.args], in-mold &, params u.params))
5571 ?~ out ~
5608 ?~ out ~
5572− ?: ?=(%union -.typ.u.out) ~
5609+ ?: &(?=(%union -.typ.u.out) !?=(%union -.body.u.found)) ~
5610+ ?: &(?=(%union -.typ.u.out) !(lien top-molds.state.u.args |=(x=term =(x n)))) ~
5611+ =? typ.u.out ?=(%union -.typ.u.out)
5612+ (label-direct-union typ.u.out(args types.u.args) u.found n state.u.args)
5573 `[typ.u.out state.u.out(active active.state.u.args, in-mold in-mold.state.u.args, params params.state.u.args)]
5613 `[typ.u.out state.u.out(active active.state.u.args, in-mold in-mold.state.u.args, params params.state.u.args)]
5574 %tvar
5614 %tvar
5575 =/ param=(unit itype) (iparam-lookup name.sh params.state)
5615 =/ param=(unit itype) (iparam-lookup name.sh params.state)
@@ -6048,7 +6088,10 @@
6048 %flag "?"
6088 %flag "?"
6049 %tag (trip txt.literal.t)
6089 %tag (trip txt.literal.t)
6050 %const (trip txt.literal.t)
6090 %const (trip txt.literal.t)
6091+ %union
6051− %union ?~(label.t (show-itype-cases cases.t sub) (trip u.label.t))
6092+ ?~ label.t (show-itype-cases cases.t sub)
6093+ ?~ args.t (trip u.label.t)
6094+ "({(trip u.label.t)} {(show-itype-cases args.t sub)})"
6052 %face "[{(trip name.t)}={(show-itype-context body.t sub)}]"
6095 %face "[{(trip name.t)}={(show-itype-context body.t sub)}]"
6053 %fn "$-({(show-itype-context sample.t sub)} {(show-itype-context product.t sub)})"
6096 %fn "$-({(show-itype-context sample.t sub)} {(show-itype-context product.t sub)})"
6054 %cell "[{(show-itype-item hed.t sub)} {(show-itype-item tal.t sub)}]"
6097 %cell "[{(show-itype-item hed.t sub)} {(show-itype-item tal.t sub)}]"
@@ -6090,7 +6133,7 @@
6090 %flag |
6133 %flag |
6091 %tag |
6134 %tag |
6092 %const |
6135 %const |
6093− %union (lien cases.typ |=(c=itype (itype-has-nvar c)))
6136+ %union |((lien cases.typ |=(c=itype (itype-has-nvar c))) (lien args.typ |=(c=itype (itype-has-nvar c))))
6094 %face $(typ body.typ)
6137 %face $(typ body.typ)
6095 %fn |($(typ sample.typ) $(typ product.typ))
6138 %fn |($(typ sample.typ) $(typ product.typ))
6096 %cell |($(typ hed.typ) $(typ tal.typ))
6139 %cell |($(typ hed.typ) $(typ tal.typ))
@@ -6109,13 +6152,35 @@
6109:: A capital in a written mold is generalized with its enclosing ++.
6152:: A capital in a written mold is generalized with its enclosing ++.
6110:: Atom constraints may remain generic; until full rigidity checking
6153:: Atom constraints may remain generic; until full rigidity checking
6111:: is implemented, do not report a type if one became more specific.
6154:: is implemented, do not report a type if one became more specific.
6155+:: Whether distinct written capitals may become equal is a doc question;
6156+:: the partial checker leaves such inference unsupported for now.
6157+::
6158+++ cap-id-in
6159+ |= [n=@ud caps=icaps sub=isub]
6160+ ^- ?
6161+ ?~ caps |
6162+ =/ resolved=itype (itype-walk [%var id.i.caps] sub)
6163+ =/ ident=(unit @ud)
6164+ ?+ -.resolved ~
6165+ %var `id.resolved
6166+ %avar `id.resolved
6167+ ==
6168+ ?~ ident $(caps t.caps)
6169+ ?: =(n u.ident) &
6170+ $(caps t.caps)
6112::
6171::
6113++ constrained-capitals
6172++ constrained-capitals
6114 |= [caps=icaps sub=isub]
6173 |= [caps=icaps sub=isub]
6115 ^- ?
6174 ^- ?
6116 ?~ caps |
6175 ?~ caps |
6117 =/ resolved=itype (itype-walk [%var id.i.caps] sub)
6176 =/ resolved=itype (itype-walk [%var id.i.caps] sub)
6177+ =/ ident=(unit @ud)
6178+ ?+ -.resolved ~
6118− ?. |(?=(%var -.resolved) ?=(%avar -.resolved)) &
6179+ %var `id.resolved
6180+ %avar `id.resolved
6181+ ==
6182+ ?~ ident &
6183+ ?: (cap-id-in u.ident t.caps sub) &
6119 $(caps t.caps)
6184 $(caps t.caps)
6120::
6185::
6121:: An atom variable may be generalized when an explicit capital, sample
6186:: An atom variable may be generalized when an explicit capital, sample
@@ -6144,7 +6209,7 @@
6144 %flag |
6209 %flag |
6145 %tag |
6210 %tag |
6146 %const |
6211 %const |
6147− %union (lien cases.t |=(c=itype (has-atom-var n c)))
6212+ %union |((lien cases.t |=(c=itype (has-atom-var n c))) (lien args.t |=(c=itype (has-atom-var n c))))
6148 %face $(t body.t)
6213 %face $(t body.t)
6149 %fn |($(t sample.t) $(t product.t))
6214 %fn |($(t sample.t) $(t product.t))
6150 %cell |($(t hed.t) $(t tal.t))
6215 %cell |($(t hed.t) $(t tal.t))
@@ -6614,6 +6679,8 @@
6614 =/ typ=itype (default-decimals (itype-normalize typ.p.result sub.state.p.result))
6679 =/ typ=itype (default-decimals (itype-normalize typ.p.result sub.state.p.result))
6615 ?: |((pending-tags tags.state.p.result sub.state.p.result) (itype-has-tag typ))
6680 ?: |((pending-tags tags.state.p.result sub.state.p.result) (itype-has-tag typ))
6616 $(ds t.ds, lines [(crip "++ {(trip name.d)}: tag needs context in partial inference") lines])
6681 $(ds t.ds, lines [(crip "++ {(trip name.d)}: tag needs context in partial inference") lines])
6682+ ?: (itype-has-hidden-generic typ)
6683+ $(ds t.ds, lines [(crip "++ {(trip name.d)}: generic union name is not available in this scope") lines])
6617 ?: (unsupported-atom-vars typ caps.state.p.result binders.state.p.result sub.state.p.result)
6684 ?: (unsupported-atom-vars typ caps.state.p.result binders.state.p.result sub.state.p.result)
6618 $(ds t.ds, lines [(crip "++ {(trip name.d)}: unresolved aura-variable inference") lines])
6685 $(ds t.ds, lines [(crip "++ {(trip name.d)}: unresolved aura-variable inference") lines])
6619 =/ vars=(list @ud) (unique-type-vars (itype-vars typ))
6686 =/ vars=(list @ud) (unique-type-vars (itype-vars typ))
jibb-dev/lib/jibb/prelude.jibb+36
@@ -235,3 +235,39 @@
235 ?- (predicate value)
235 ?- (predicate value)
236 %.y `value
236 %.y `value
237 %.n ~
237 %.n ~
238+
239+++ murn |= args=[(list A) $-(A (unit B))]
240+ ?- args
241+ [xs f]
242+ ?- xs
243+ ~ ~
244+ [item rest]
245+ ?- (f item)
246+ ~ (murn rest f)
247+ [~ value] [value (murn rest f)]
248+
249+++ join |= args=[A (list A)]
250+ ?- args
251+ [separator xs]
252+ ?- xs
253+ ~ ~
254+ [item rest]
255+ ?- rest
256+ ~ [item ~]
257+ [next more] [item [separator (join separator rest)]]
258+
259+++ snip |= xs=(list A)
260+ ?- xs
261+ ~ ~
262+ [item rest]
263+ ?- rest
264+ ~ ~
265+ [next more] [item (snip rest)]
266+
267+++ rear |= xs=(list A)
268+ ?- xs
269+ ~ !!
270+ [item rest]
271+ ?- rest
272+ ~ item
273+ [next more] (rear rest)
tests/golden/module-cache-incomplete/about.txt+1−1
@@ -1,4 +1,4 @@
1source: Grammar, Modules: "Everything is exported and read through the import's face"; Imports: "Import cycles are errors".
1source: Grammar, Modules: "Everything is exported and read through the import's face"; Imports: "Import cycles are errors".
2−tests: A shared library with a generic union mold, which partial inference does not yet support, yields no interface even though one value could be inferred.
2+tests: A shared library with a generic alias of a generic union, which partial inference does not yet support, yields no interface even though one value could be inferred.
3expect: parses
3expect: parses
4expect-types: a partial inference report
4expect-types: a partial inference report
tests/golden/module-cache-incomplete/module-trees.txt+7−4
@@ -1,11 +1,14 @@
1/ui/bad.jibb
1/ui/bad.jibb
2(module
2(module
3− (mold 1:1 choice
3+ (mold 1:1 original
4− (generic 1:11 A
4+ (generic 1:13 A
5 (union 2:3
5 (union 2:3
6 (cell 2:3
6 (cell 2:3
7 (const 2:4 %some)
7 (const 2:4 %some)
8 (face 2:10 value (tvar 2:16 A)))
8 (face 2:10 value (tvar 2:16 A)))
9 (const 3:3 %none))))
9 (const 3:3 %none))))
10+ (mold 4:1 choice
11+ (generic 4:11 A
12+ (apply 4:18 original (tvar 4:28 A))))
10− (value 4:1 id
13+ (value 5:1 id
11− (gate-wide 4:7 (bind 4:10 x) (wing 4:12 x))))
14+ (gate-wide 5:7 (bind 5:10 x) (wing 5:12 x))))
tests/golden/module-cache-incomplete/modules/ui/bad.jibb+2−1
@@ -1,4 +1,5 @@
1−+$ choice |$ [A]
1++$ original |$ [A]
2 [%some value=A]
2 [%some value=A]
3 %none
3 %none
4++$ choice |$ [A] (original A)
4++ id |=(x x)
5++ id |=(x x)
tests/golden/prelude-unit-list-transforms/about.txt+2−2
@@ -1,4 +1,4 @@
1−source: Overview, Prelude: "The exported inventory includes all names from the Hoon library sections listed below, excluding the groups explicitly left out"; Hoon 2a includes `drop`, `bind`, `biff`, `flit`, `both` and `clef`, and 2b includes `skim`, `skip`, `levy`, `lien`, `roll` and `reel`. Folds take an explicit start.
1+source: Overview, Prelude: "The exported inventory includes all names from the Hoon library sections listed below, excluding the groups explicitly left out"; Hoon 2a includes `drop`, `bind`, `biff`, `flit`, `both` and `clef`, and 2b includes `join`, `murn`, `rear`, `snip`, `skim`, `skip`, `levy`, `lien`, `roll` and `reel`. Folds take an explicit start.
2−tests: The complete current prelude parses, including unit-to-list conversion, unit mapping and flat mapping, a curried unit-producing filter, two ways to combine units, complementary list filters, all/any predicates, and left and right folds. The filters retain the order of their selected items.
2+tests: The complete current prelude parses, including unit-to-list conversion, unit mapping and flat mapping, a curried unit-producing filter, two ways to combine units, complementary list filters, present-product mapping, joining, last-item operations, all/any predicates, and left and right folds. The filters retain the order of their selected items.
3expect: parses
3expect: parses
4expect-types: a partial inference report, not a checked module; unit and list gate typing is not complete
4expect-types: a partial inference report, not a checked module; unit and list gate typing is not complete
tests/golden/prelude-unit-list-transforms/source.jibb+36
@@ -235,3 +235,39 @@
235 ?- (predicate value)
235 ?- (predicate value)
236 %.y `value
236 %.y `value
237 %.n ~
237 %.n ~
238+
239+++ murn |= args=[(list A) $-(A (unit B))]
240+ ?- args
241+ [xs f]
242+ ?- xs
243+ ~ ~
244+ [item rest]
245+ ?- (f item)
246+ ~ (murn rest f)
247+ [~ value] [value (murn rest f)]
248+
249+++ join |= args=[A (list A)]
250+ ?- args
251+ [separator xs]
252+ ?- xs
253+ ~ ~
254+ [item rest]
255+ ?- rest
256+ ~ [item ~]
257+ [next more] [item [separator (join separator rest)]]
258+
259+++ snip |= xs=(list A)
260+ ?- xs
261+ ~ ~
262+ [item rest]
263+ ?- rest
264+ ~ ~
265+ [next more] [item (snip rest)]
266+
267+++ rear |= xs=(list A)
268+ ?- xs
269+ ~ !!
270+ [item rest]
271+ ?- rest
272+ ~ item
273+ [next more] (rear rest)
tests/golden/prelude-unit-list-transforms/tokens.txt+220−4
@@ -1456,7 +1456,223 @@
1456237:7 NEWLINE
1456237:7 NEWLINE
1457237:7 lit %.n
1457237:7 lit %.n
1458237:11 lit ~
1458237:11 lit ~
1459+239:1 DEDENT
1460+239:1 DEDENT
1461+239:1 DEDENT
1462+239:1 NEWLINE
1463+239:1 glyph ++
1464+239:4 name murn
1465+239:9 glyph |=
1466+239:12 name args
1467+239:16 tight glyph =
1468+239:17 tight glyph [
1469+239:18 tight glyph (
1470+239:19 tight name list
1471+239:24 tvar A
1472+239:25 tight glyph )
1473+239:27 glyph $-(
1474+239:30 tight tvar A
1475+239:32 glyph (
1476+239:33 tight name unit
1477+239:38 tvar B
1478+239:39 tight glyph )
1479+239:40 tight glyph )
1480+239:41 tight glyph ]
1481+240:3 INDENT
1482+240:3 glyph ?-
1483+240:6 name args
1484+241:5 INDENT
1485+241:5 glyph [
1486+241:6 tight name xs
1487+241:9 name f
1488+241:10 tight glyph ]
1489+242:7 INDENT
1490+242:7 glyph ?-
1491+242:10 name xs
1492+243:9 INDENT
1493+243:9 lit ~
1494+243:11 lit ~
1495+244:9 NEWLINE
1496+244:9 glyph [
1497+244:10 tight name item
1498+244:15 name rest
1499+244:19 tight glyph ]
1500+245:11 INDENT
1501+245:11 glyph ?-
1502+245:14 glyph (
1503+245:15 tight name f
1504+245:17 name item
1505+245:21 tight glyph )
1506+246:13 INDENT
1507+246:13 lit ~
1508+246:15 glyph (
1509+246:16 tight name murn
1510+246:21 name rest
1511+246:26 name f
1512+246:27 tight glyph )
1513+247:13 NEWLINE
1514+247:13 glyph [
1515+247:14 tight lit ~
1516+247:16 name value
1517+247:21 tight glyph ]
1518+247:23 glyph [
1519+247:24 tight name value
1520+247:30 glyph (
1521+247:31 tight name murn
1522+247:36 name rest
1523+247:41 name f
1524+247:42 tight glyph )
1525+247:43 tight glyph ]
1459−237:12 DEDENT
1526+249:1 DEDENT
1527+249:1 DEDENT
1528+249:1 DEDENT
1529+249:1 DEDENT
1530+249:1 DEDENT
1531+249:1 DEDENT
1532+249:1 NEWLINE
1533+249:1 glyph ++
1534+249:4 name join
1535+249:9 glyph |=
1536+249:12 name args
1537+249:16 tight glyph =
1538+249:17 tight glyph [
1539+249:18 tight tvar A
1540+249:20 glyph (
1541+249:21 tight name list
1542+249:26 tvar A
1543+249:27 tight glyph )
1544+249:28 tight glyph ]
1545+250:3 INDENT
1546+250:3 glyph ?-
1547+250:6 name args
1548+251:5 INDENT
1549+251:5 glyph [
1550+251:6 tight name separator
1551+251:16 name xs
1552+251:18 tight glyph ]
1553+252:7 INDENT
1554+252:7 glyph ?-
1555+252:10 name xs
1556+253:9 INDENT
1557+253:9 lit ~
1558+253:11 lit ~
1559+254:9 NEWLINE
1560+254:9 glyph [
1561+254:10 tight name item
1562+254:15 name rest
1563+254:19 tight glyph ]
1564+255:11 INDENT
1565+255:11 glyph ?-
1566+255:14 name rest
1567+256:13 INDENT
1568+256:13 lit ~
1569+256:15 glyph [
1570+256:16 tight name item
1571+256:21 lit ~
1572+256:22 tight glyph ]
1573+257:13 NEWLINE
1574+257:13 glyph [
1575+257:14 tight name next
1576+257:19 name more
1577+257:23 tight glyph ]
1578+257:25 glyph [
1579+257:26 tight name item
1580+257:31 glyph [
1581+257:32 tight name separator
1582+257:42 glyph (
1583+257:43 tight name join
1584+257:48 name separator
1585+257:58 name rest
1586+257:62 tight glyph )
1587+257:63 tight glyph ]
1588+257:64 tight glyph ]
1460−237:12 DEDENT
1589+259:1 DEDENT
1590+259:1 DEDENT
1591+259:1 DEDENT
1592+259:1 DEDENT
1593+259:1 DEDENT
1594+259:1 DEDENT
1595+259:1 NEWLINE
1596+259:1 glyph ++
1597+259:4 name snip
1598+259:9 glyph |=
1599+259:12 name xs
1600+259:14 tight glyph =
1601+259:15 tight glyph (
1602+259:16 tight name list
1603+259:21 tvar A
1604+259:22 tight glyph )
1605+260:3 INDENT
1606+260:3 glyph ?-
1607+260:6 name xs
1608+261:5 INDENT
1609+261:5 lit ~
1610+261:7 lit ~
1611+262:5 NEWLINE
1612+262:5 glyph [
1613+262:6 tight name item
1614+262:11 name rest
1615+262:15 tight glyph ]
1616+263:7 INDENT
1617+263:7 glyph ?-
1618+263:10 name rest
1619+264:9 INDENT
1620+264:9 lit ~
1621+264:11 lit ~
1622+265:9 NEWLINE
1623+265:9 glyph [
1624+265:10 tight name next
1625+265:15 name more
1626+265:19 tight glyph ]
1627+265:21 glyph [
1628+265:22 tight name item
1629+265:27 glyph (
1630+265:28 tight name snip
1631+265:33 name rest
1632+265:37 tight glyph )
1633+265:38 tight glyph ]
1461−237:12 DEDENT
1634+267:1 DEDENT
1635+267:1 DEDENT
1636+267:1 DEDENT
1637+267:1 DEDENT
1638+267:1 NEWLINE
1639+267:1 glyph ++
1640+267:4 name rear
1641+267:9 glyph |=
1642+267:12 name xs
1643+267:14 tight glyph =
1644+267:15 tight glyph (
1645+267:16 tight name list
1646+267:21 tvar A
1647+267:22 tight glyph )
1648+268:3 INDENT
1649+268:3 glyph ?-
1650+268:6 name xs
1651+269:5 INDENT
1652+269:5 lit ~
1653+269:7 glyph !!
1654+270:5 NEWLINE
1655+270:5 glyph [
1656+270:6 tight name item
1657+270:11 name rest
1658+270:15 tight glyph ]
1659+271:7 INDENT
1660+271:7 glyph ?-
1661+271:10 name rest
1662+272:9 INDENT
1663+272:9 lit ~
1664+272:11 name item
1665+273:9 NEWLINE
1666+273:9 glyph [
1667+273:10 tight name next
1668+273:15 name more
1669+273:19 tight glyph ]
1670+273:21 glyph (
1671+273:22 tight name rear
1672+273:27 name rest
1673+273:31 tight glyph )
1674+273:32 DEDENT
1675+273:32 DEDENT
1676+273:32 DEDENT
1677+273:32 DEDENT
1462−237:12 NEWLINE
1678+273:32 NEWLINE
tests/golden/prelude-unit-list-transforms/tree.txt+103−1
@@ -624,4 +624,106 @@
624 (arm 236:7
624 (arm 236:7
625 (lit 236:7 %.y)
625 (lit 236:7 %.y)
626 (unit 236:11 (wing 236:12 value)))
626 (unit 236:11 (wing 236:12 value)))
627− (arm 237:7 (lit 237:7 %.n) (lit 237:11 ~)))))))))
627+ (arm 237:7 (lit 237:7 %.n) (lit 237:11 ~))))))))
628+ (value 239:1 murn
629+ (gate 239:9
630+ (face 239:12 args
631+ (cell 239:17
632+ (apply 239:18 list (tvar 239:24 A))
633+ (fn 239:27
634+ (tvar 239:30 A)
635+ (apply 239:32 unit (tvar 239:38 B)))))
636+ (body 240:3
637+ (branch 240:3
638+ (wing 240:6 args)
639+ (arm 241:5
640+ (cell 241:5 (bind 241:6 xs) (bind 241:9 f))
641+ (body 242:7
642+ (branch 242:7
643+ (wing 242:10 xs)
644+ (arm 243:9 (lit 243:9 ~) (lit 243:11 ~))
645+ (arm 244:9
646+ (cell 244:9 (bind 244:10 item) (bind 244:15 rest))
647+ (body 245:11
648+ (branch 245:11
649+ (group 245:14
650+ (call 245:15 (wing 245:15 f) (wing 245:17 item)))
651+ (arm 246:13
652+ (lit 246:13 ~)
653+ (group 246:15
654+ (call 246:16 (wing 246:16 murn) (wing 246:21 rest) (wing 246:26 f))))
655+ (arm 247:13
656+ (cell 247:13 (lit 247:14 ~) (bind 247:16 value))
657+ (tuple 247:23
658+ (wing 247:24 value)
659+ (group 247:30
660+ (call 247:31 (wing 247:31 murn) (wing 247:36 rest) (wing 247:41 f)))))))))))))))
661+ (value 249:1 join
662+ (gate 249:9
663+ (face 249:12 args
664+ (cell 249:17
665+ (tvar 249:18 A)
666+ (apply 249:20 list (tvar 249:26 A))))
667+ (body 250:3
668+ (branch 250:3
669+ (wing 250:6 args)
670+ (arm 251:5
671+ (cell 251:5 (bind 251:6 separator) (bind 251:16 xs))
672+ (body 252:7
673+ (branch 252:7
674+ (wing 252:10 xs)
675+ (arm 253:9 (lit 253:9 ~) (lit 253:11 ~))
676+ (arm 254:9
677+ (cell 254:9 (bind 254:10 item) (bind 254:15 rest))
678+ (body 255:11
679+ (branch 255:11
680+ (wing 255:14 rest)
681+ (arm 256:13
682+ (lit 256:13 ~)
683+ (tuple 256:15 (wing 256:16 item) (lit 256:21 ~)))
684+ (arm 257:13
685+ (cell 257:13 (bind 257:14 next) (bind 257:19 more))
686+ (tuple 257:25
687+ (wing 257:26 item)
688+ (tuple 257:31
689+ (wing 257:32 separator)
690+ (group 257:42
691+ (call 257:43 (wing 257:43 join) (wing 257:48 separator) (wing 257:58 rest))))))))))))))))
692+ (value 259:1 snip
693+ (gate 259:9
694+ (face 259:12 xs
695+ (apply 259:15 list (tvar 259:21 A)))
696+ (body 260:3
697+ (branch 260:3
698+ (wing 260:6 xs)
699+ (arm 261:5 (lit 261:5 ~) (lit 261:7 ~))
700+ (arm 262:5
701+ (cell 262:5 (bind 262:6 item) (bind 262:11 rest))
702+ (body 263:7
703+ (branch 263:7
704+ (wing 263:10 rest)
705+ (arm 264:9 (lit 264:9 ~) (lit 264:11 ~))
706+ (arm 265:9
707+ (cell 265:9 (bind 265:10 next) (bind 265:15 more))
708+ (tuple 265:21
709+ (wing 265:22 item)
710+ (group 265:27
711+ (call 265:28 (wing 265:28 snip) (wing 265:33 rest))))))))))))
712+ (value 267:1 rear
713+ (gate 267:9
714+ (face 267:12 xs
715+ (apply 267:15 list (tvar 267:21 A)))
716+ (body 268:3
717+ (branch 268:3
718+ (wing 268:6 xs)
719+ (arm 269:5 (lit 269:5 ~) (crash 269:7))
720+ (arm 270:5
721+ (cell 270:5 (bind 270:6 item) (bind 270:11 rest))
722+ (body 271:7
723+ (branch 271:7
724+ (wing 271:10 rest)
725+ (arm 272:9 (lit 272:9 ~) (wing 272:11 item))
726+ (arm 273:9
727+ (cell 273:9 (bind 273:10 next) (bind 273:15 more))
728+ (group 273:21
729+ (call 273:22 (wing 273:22 rear) (wing 273:27 rest))))))))))))
tests/golden/prelude-unit-list-transforms/types.txt+4
@@ -51,3 +51,7 @@ partial inference; module not checked
51++ roll: sample mold is not supported by partial inference
51++ roll: sample mold is not supported by partial inference
52++ reel: sample mold is not supported by partial inference
52++ reel: sample mold is not supported by partial inference
53++ flit: expression is not supported by partial inference
53++ flit: expression is not supported by partial inference
54+++ murn: sample mold is not supported by partial inference
55+++ join: sample mold is not supported by partial inference
56+++ snip: sample mold is not supported by partial inference
57+++ rear: sample mold is not supported by partial inference
tests/golden/types-generic-union-capitals/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Decisions, Type variables: "Capitals, generalized per `++`; a capital in a local `++` shares the enclosing `++`'s variable of that name, and a different type takes a different capital".
2+tests: Distinct explicit capitals, repeated capitals, and local captures in generic-union molds. The partial checker must not silently merge distinct explicit capitals pending the doc question; the same repeated capital remains usable.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-generic-union-capitals/source.jibbnew file+17
@@ -0,0 +1,17 @@
1++$ choice |$ [A B]
2+ [%one value=A]
3+ [%two value=B]
4++$ phantom |$ [A]
5+ %yes
6+ %no
7+++ repeated |= x=(choice A A) x
8+++ independent |= x=(choice A B) x
9+++ already-same |= x=(choice A A) (repeated x)
10+++ merge-call |= x=(choice A B) (repeated x)
11+++ phantom-cast |= x=(phantom A) ^- (phantom B) x
12+++ local-merge |= x=(choice A B)
13+ ++ local |= y=(choice A A) y
14+ (local x)
15+++ captured-merge |= x=(choice A B)
16+ ++ captured |= flag=? x
17+ (repeated (captured %.y))
tests/golden/types-generic-union-capitals/tokens.txtnew file+162
@@ -0,0 +1,162 @@
1+1:1 glyph +$
2+1:4 name choice
3+1:11 glyph |$
4+1:14 glyph [
5+1:15 tight tvar A
6+1:17 tvar B
7+1:18 tight glyph ]
8+2:3 INDENT
9+2:3 glyph [
10+2:4 tight lit %one
11+2:9 name value
12+2:14 tight glyph =
13+2:15 tight tvar A
14+2:16 tight glyph ]
15+3:3 NEWLINE
16+3:3 glyph [
17+3:4 tight lit %two
18+3:9 name value
19+3:14 tight glyph =
20+3:15 tight tvar B
21+3:16 tight glyph ]
22+4:1 DEDENT
23+4:1 NEWLINE
24+4:1 glyph +$
25+4:4 name phantom
26+4:12 glyph |$
27+4:15 glyph [
28+4:16 tight tvar A
29+4:17 tight glyph ]
30+5:3 INDENT
31+5:3 lit %yes
32+6:3 NEWLINE
33+6:3 lit %no
34+7:1 DEDENT
35+7:1 NEWLINE
36+7:1 glyph ++
37+7:4 name repeated
38+7:13 glyph |=
39+7:16 name x
40+7:17 tight glyph =
41+7:18 tight glyph (
42+7:19 tight name choice
43+7:26 tvar A
44+7:28 tvar A
45+7:29 tight glyph )
46+7:31 name x
47+8:1 NEWLINE
48+8:1 glyph ++
49+8:4 name independent
50+8:16 glyph |=
51+8:19 name x
52+8:20 tight glyph =
53+8:21 tight glyph (
54+8:22 tight name choice
55+8:29 tvar A
56+8:31 tvar B
57+8:32 tight glyph )
58+8:34 name x
59+9:1 NEWLINE
60+9:1 glyph ++
61+9:4 name already-same
62+9:17 glyph |=
63+9:20 name x
64+9:21 tight glyph =
65+9:22 tight glyph (
66+9:23 tight name choice
67+9:30 tvar A
68+9:32 tvar A
69+9:33 tight glyph )
70+9:35 glyph (
71+9:36 tight name repeated
72+9:45 name x
73+9:46 tight glyph )
74+10:1 NEWLINE
75+10:1 glyph ++
76+10:4 name merge-call
77+10:15 glyph |=
78+10:18 name x
79+10:19 tight glyph =
80+10:20 tight glyph (
81+10:21 tight name choice
82+10:28 tvar A
83+10:30 tvar B
84+10:31 tight glyph )
85+10:33 glyph (
86+10:34 tight name repeated
87+10:43 name x
88+10:44 tight glyph )
89+11:1 NEWLINE
90+11:1 glyph ++
91+11:4 name phantom-cast
92+11:17 glyph |=
93+11:20 name x
94+11:21 tight glyph =
95+11:22 tight glyph (
96+11:23 tight name phantom
97+11:31 tvar A
98+11:32 tight glyph )
99+11:34 glyph ^-
100+11:37 glyph (
101+11:38 tight name phantom
102+11:46 tvar B
103+11:47 tight glyph )
104+11:49 name x
105+12:1 NEWLINE
106+12:1 glyph ++
107+12:4 name local-merge
108+12:16 glyph |=
109+12:19 name x
110+12:20 tight glyph =
111+12:21 tight glyph (
112+12:22 tight name choice
113+12:29 tvar A
114+12:31 tvar B
115+12:32 tight glyph )
116+13:3 INDENT
117+13:3 glyph ++
118+13:6 name local
119+13:12 glyph |=
120+13:15 name y
121+13:16 tight glyph =
122+13:17 tight glyph (
123+13:18 tight name choice
124+13:25 tvar A
125+13:27 tvar A
126+13:28 tight glyph )
127+13:30 name y
128+14:3 NEWLINE
129+14:3 glyph (
130+14:4 tight name local
131+14:10 name x
132+14:11 tight glyph )
133+15:1 DEDENT
134+15:1 NEWLINE
135+15:1 glyph ++
136+15:4 name captured-merge
137+15:19 glyph |=
138+15:22 name x
139+15:23 tight glyph =
140+15:24 tight glyph (
141+15:25 tight name choice
142+15:32 tvar A
143+15:34 tvar B
144+15:35 tight glyph )
145+16:3 INDENT
146+16:3 glyph ++
147+16:6 name captured
148+16:15 glyph |=
149+16:18 name flag
150+16:22 tight glyph =
151+16:23 tight glyph ?
152+16:25 name x
153+17:3 NEWLINE
154+17:3 glyph (
155+17:4 tight name repeated
156+17:13 glyph (
157+17:14 tight name captured
158+17:23 lit %.y
159+17:26 tight glyph )
160+17:27 tight glyph )
161+17:28 DEDENT
162+17:28 NEWLINE
tests/golden/types-generic-union-capitals/tree.txtnew file+68
@@ -0,0 +1,68 @@
1+(module
2+ (mold 1:1 choice
3+ (generic 1:11 A B
4+ (union 2:3
5+ (cell 2:3
6+ (const 2:4 %one)
7+ (face 2:9 value (tvar 2:15 A)))
8+ (cell 3:3
9+ (const 3:4 %two)
10+ (face 3:9 value (tvar 3:15 B))))))
11+ (mold 4:1 phantom
12+ (generic 4:12 A
13+ (union 5:3 (const 5:3 %yes) (const 6:3 %no))))
14+ (value 7:1 repeated
15+ (gate 7:13
16+ (face 7:16 x
17+ (apply 7:18 choice (tvar 7:26 A) (tvar 7:28 A)))
18+ (wing 7:31 x)))
19+ (value 8:1 independent
20+ (gate 8:16
21+ (face 8:19 x
22+ (apply 8:21 choice (tvar 8:29 A) (tvar 8:31 B)))
23+ (wing 8:34 x)))
24+ (value 9:1 already-same
25+ (gate 9:17
26+ (face 9:20 x
27+ (apply 9:22 choice (tvar 9:30 A) (tvar 9:32 A)))
28+ (group 9:35
29+ (call 9:36 (wing 9:36 repeated) (wing 9:45 x)))))
30+ (value 10:1 merge-call
31+ (gate 10:15
32+ (face 10:18 x
33+ (apply 10:20 choice (tvar 10:28 A) (tvar 10:30 B)))
34+ (group 10:33
35+ (call 10:34 (wing 10:34 repeated) (wing 10:43 x)))))
36+ (value 11:1 phantom-cast
37+ (gate 11:17
38+ (face 11:20 x
39+ (apply 11:22 phantom (tvar 11:31 A)))
40+ (cast 11:34
41+ (apply 11:37 phantom (tvar 11:46 B))
42+ (wing 11:49 x))))
43+ (value 12:1 local-merge
44+ (gate 12:16
45+ (face 12:19 x
46+ (apply 12:21 choice (tvar 12:29 A) (tvar 12:31 B)))
47+ (body 13:3
48+ (value 13:3 local
49+ (gate 13:12
50+ (face 13:15 y
51+ (apply 13:17 choice (tvar 13:25 A) (tvar 13:27 A)))
52+ (wing 13:30 y)))
53+ (group 14:3
54+ (call 14:4 (wing 14:4 local) (wing 14:10 x))))))
55+ (value 15:1 captured-merge
56+ (gate 15:19
57+ (face 15:22 x
58+ (apply 15:24 choice (tvar 15:32 A) (tvar 15:34 B)))
59+ (body 16:3
60+ (value 16:3 captured
61+ (gate 16:15
62+ (face 16:18 flag (flag 16:23))
63+ (wing 16:25 x)))
64+ (group 17:3
65+ (call 17:4
66+ (wing 17:4 repeated)
67+ (group 17:13
68+ (call 17:14 (wing 17:14 captured) (lit 17:23 %.y)))))))))
tests/golden/types-generic-union-capitals/types.txtnew file+10
@@ -0,0 +1,10 @@
1+partial inference; module not checked
2++$ choice: cases proven disjoint; mold not checked
3++$ phantom: cases proven disjoint; mold not checked
4+++ repeated: $-((choice A A) (choice A A))
5+++ independent: $-((choice A B) (choice A B))
6+++ already-same: $-((choice A A) (choice A A))
7+++ merge-call: explicit capital constraints are not supported by partial inference
8+++ phantom-cast: explicit capital constraints are not supported by partial inference
9+++ local-merge: explicit capital constraints are not supported by partial inference
10+++ captured-merge: explicit capital constraints are not supported by partial inference
tests/golden/types-generic-union-errors/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Molds: union cases "must differ as nouns"; Tag resolution: "Tags take their union from context".
2+tests: Generic union arity, an unknown tag, mismatched payload and an overlapping instantiation do not silently succeed.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-generic-union-errors/source.jibbnew file+11
@@ -0,0 +1,11 @@
1++$ choice |$ [V E]
2+ [%ok value=V]
3+ [%err error=E]
4++$ overlap |$ [A]
5+ A
6+ @t
7+++ few |= x=(choice @t) x
8+++ many |= x=(choice @t @p @ud) x
9+++ bad-tag ^- (choice @t @p) %missing
10+++ bad-payload ^- (choice @t @p) [%ok ~zod]
11+++ overlap-use |= x=(overlap @t) x
tests/golden/types-generic-union-errors/tokens.txtnew file+93
@@ -0,0 +1,93 @@
1+1:1 glyph +$
2+1:4 name choice
3+1:11 glyph |$
4+1:14 glyph [
5+1:15 tight tvar V
6+1:17 tvar E
7+1:18 tight glyph ]
8+2:3 INDENT
9+2:3 glyph [
10+2:4 tight lit %ok
11+2:8 name value
12+2:13 tight glyph =
13+2:14 tight tvar V
14+2:15 tight glyph ]
15+3:3 NEWLINE
16+3:3 glyph [
17+3:4 tight lit %err
18+3:9 name error
19+3:14 tight glyph =
20+3:15 tight tvar E
21+3:16 tight glyph ]
22+4:1 DEDENT
23+4:1 NEWLINE
24+4:1 glyph +$
25+4:4 name overlap
26+4:12 glyph |$
27+4:15 glyph [
28+4:16 tight tvar A
29+4:17 tight glyph ]
30+5:3 INDENT
31+5:3 tvar A
32+6:3 NEWLINE
33+6:3 aura @t
34+7:1 DEDENT
35+7:1 NEWLINE
36+7:1 glyph ++
37+7:4 name few
38+7:8 glyph |=
39+7:11 name x
40+7:12 tight glyph =
41+7:13 tight glyph (
42+7:14 tight name choice
43+7:21 aura @t
44+7:23 tight glyph )
45+7:25 name x
46+8:1 NEWLINE
47+8:1 glyph ++
48+8:4 name many
49+8:9 glyph |=
50+8:12 name x
51+8:13 tight glyph =
52+8:14 tight glyph (
53+8:15 tight name choice
54+8:22 aura @t
55+8:25 aura @p
56+8:28 aura @ud
57+8:31 tight glyph )
58+8:33 name x
59+9:1 NEWLINE
60+9:1 glyph ++
61+9:4 name bad-tag
62+9:12 glyph ^-
63+9:15 glyph (
64+9:16 tight name choice
65+9:23 aura @t
66+9:26 aura @p
67+9:28 tight glyph )
68+9:30 lit %missing
69+10:1 NEWLINE
70+10:1 glyph ++
71+10:4 name bad-payload
72+10:16 glyph ^-
73+10:19 glyph (
74+10:20 tight name choice
75+10:27 aura @t
76+10:30 aura @p
77+10:32 tight glyph )
78+10:34 glyph [
79+10:35 tight lit %ok
80+10:39 lit ~zod
81+10:43 tight glyph ]
82+11:1 NEWLINE
83+11:1 glyph ++
84+11:4 name overlap-use
85+11:16 glyph |=
86+11:19 name x
87+11:20 tight glyph =
88+11:21 tight glyph (
89+11:22 tight name overlap
90+11:30 aura @t
91+11:32 tight glyph )
92+11:34 name x
93+11:35 NEWLINE
tests/golden/types-generic-union-errors/tree.txtnew file+36
@@ -0,0 +1,36 @@
1+(module
2+ (mold 1:1 choice
3+ (generic 1:11 V E
4+ (union 2:3
5+ (cell 2:3
6+ (const 2:4 %ok)
7+ (face 2:8 value (tvar 2:14 V)))
8+ (cell 3:3
9+ (const 3:4 %err)
10+ (face 3:9 error (tvar 3:15 E))))))
11+ (mold 4:1 overlap
12+ (generic 4:12 A
13+ (union 5:3 (tvar 5:3 A) (aura 6:3 @t))))
14+ (value 7:1 few
15+ (gate 7:8
16+ (face 7:11 x
17+ (apply 7:13 choice (aura 7:21 @t)))
18+ (wing 7:25 x)))
19+ (value 8:1 many
20+ (gate 8:9
21+ (face 8:12 x
22+ (apply 8:14 choice (aura 8:22 @t) (aura 8:25 @p) (aura 8:28 @ud)))
23+ (wing 8:33 x)))
24+ (value 9:1 bad-tag
25+ (cast 9:12
26+ (apply 9:15 choice (aura 9:23 @t) (aura 9:26 @p))
27+ (lit 9:30 %missing)))
28+ (value 10:1 bad-payload
29+ (cast 10:16
30+ (apply 10:19 choice (aura 10:27 @t) (aura 10:30 @p))
31+ (tuple 10:34 (lit 10:35 %ok) (lit 10:39 ~zod))))
32+ (value 11:1 overlap-use
33+ (gate 11:16
34+ (face 11:19 x
35+ (apply 11:21 overlap (aura 11:30 @t)))
36+ (wing 11:34 x))))
tests/golden/types-generic-union-errors/types.txtnew file+26
@@ -0,0 +1,26 @@
1+partial inference; module not checked
2++$ choice: cases proven disjoint; mold not checked
3++$ overlap: overlapping cases; mold not checked
4+/tests/golden/types-generic-union-errors/source.jibb:5:3: first union case
5+ A
6+ ^
7+/tests/golden/types-generic-union-errors/source.jibb:6:3: overlapping case
8+ @t
9+ ^
10+++ few: sample mold is not supported by partial inference
11+++ many: sample mold is not supported by partial inference
12+++ bad-tag: cast mold and expression type do not unify
13+/tests/golden/types-generic-union-errors/source.jibb:9:15: cast mold
14+++ bad-tag ^- (choice @t @p) %missing
15+ ^
16+/tests/golden/types-generic-union-errors/source.jibb:9:30: expression
17+++ bad-tag ^- (choice @t @p) %missing
18+ ^
19+++ bad-payload: cast mold and expression type do not unify
20+/tests/golden/types-generic-union-errors/source.jibb:10:19: cast mold
21+++ bad-payload ^- (choice @t @p) [%ok ~zod]
22+ ^
23+/tests/golden/types-generic-union-errors/source.jibb:10:34: expression
24+++ bad-payload ^- (choice @t @p) [%ok ~zod]
25+ ^
26+++ overlap-use: sample mold is not supported by partial inference
tests/golden/types-generic-union-escaping/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Modules: "Everything is exported and read through the import's face"; Molds: a generic mold declares its parameters after `|$`.
2+tests: A transitive value carries a generic union whose defining module is not directly visible. Its phantom arguments must not be lost to an unnamed printout; the partial printer declines this case.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-generic-union-escaping/module-trees.txtnew file+16
@@ -0,0 +1,16 @@
1+/ui/base.jibb
2+(module
3+ (mold 1:1 phantom
4+ (generic 1:12 A
5+ (union 2:3 (const 2:3 %yes) (const 3:3 %no)))))
6+/ui/mid.jibb
7+(module
8+ (jibb 1:1 base /ui/base)
9+ (value 2:1 text
10+ (cast 2:9
11+ (apply 2:12 phantom.base (aura 2:26 @t))
12+ (lit 2:30 %yes)))
13+ (value 3:1 ship
14+ (cast 3:9
15+ (apply 3:12 phantom.base (aura 3:26 @p))
16+ (lit 3:30 %yes))))
tests/golden/types-generic-union-escaping/modules.txtnew file+2
@@ -0,0 +1,2 @@
1+/ui/base.jibb
2+/ui/mid.jibb
tests/golden/types-generic-union-escaping/modules/ui/base.jibbnew file+3
@@ -0,0 +1,3 @@
1++$ phantom |$ [A]
2+ %yes
3+ %no
tests/golden/types-generic-union-escaping/modules/ui/mid.jibbnew file+3
@@ -0,0 +1,3 @@
1+/= base /ui/base
2+++ text ^- (phantom.base @t) %yes
3+++ ship ^- (phantom.base @p) %yes
tests/golden/types-generic-union-escaping/source.jibbnew file+3
@@ -0,0 +1,3 @@
1+/= mid /ui/mid
2+++ text-value text.mid
3+++ ship-value ship.mid
tests/golden/types-generic-union-escaping/tokens.txtnew file+15
@@ -0,0 +1,15 @@
1+1:1 glyph /=
2+1:5 name mid
3+1:9 glyph /
4+1:10 tight knot ui
5+1:12 tight glyph /
6+1:13 tight knot mid
7+2:1 NEWLINE
8+2:1 glyph ++
9+2:4 name text-value
10+2:15 wing text.mid
11+3:1 NEWLINE
12+3:1 glyph ++
13+3:4 name ship-value
14+3:15 wing ship.mid
15+3:23 NEWLINE
tests/golden/types-generic-union-escaping/tree.txtnew file+4
@@ -0,0 +1,4 @@
1+(module
2+ (jibb 1:1 mid /ui/mid)
3+ (value 2:1 text-value (wing 2:15 text.mid))
4+ (value 3:1 ship-value (wing 3:15 ship.mid)))
tests/golden/types-generic-union-escaping/types.txtnew file+3
@@ -0,0 +1,3 @@
1+partial inference; module not checked
2+++ text-value: generic union name is not available in this scope
3+++ ship-value: generic union name is not available in this scope
tests/golden/types-generic-union-import/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Modules: "Everything is exported and read through the import's face"; Molds: recursive molds go by name and module.
2+tests: A generic union shared through two faces retains one origin and instantiated arguments, while an identically shaped mold from another module has a different origin.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-generic-union-import/module-trees.txtnew file+32
@@ -0,0 +1,32 @@
1+/ui/shared.jibb
2+(module
3+ (mold 1:1 choice
4+ (generic 1:11 V E
5+ (union 2:3
6+ (cell 2:3
7+ (const 2:4 %ok)
8+ (face 2:8 value (tvar 2:14 V)))
9+ (cell 3:3
10+ (const 3:4 %err)
11+ (face 3:9 error (tvar 3:15 E))))))
12+ (value 4:1 identity
13+ (gate 4:13
14+ (face 4:16 x
15+ (apply 4:18 choice (tvar 4:26 A) (tvar 4:28 B)))
16+ (wing 4:31 x))))
17+/ui/twin.jibb
18+(module
19+ (mold 1:1 choice
20+ (generic 1:11 V E
21+ (union 2:3
22+ (cell 2:3
23+ (const 2:4 %ok)
24+ (face 2:8 value (tvar 2:14 V)))
25+ (cell 3:3
26+ (const 3:4 %err)
27+ (face 3:9 error (tvar 3:15 E))))))
28+ (value 4:1 identity
29+ (gate 4:13
30+ (face 4:16 x
31+ (apply 4:18 choice (tvar 4:26 A) (tvar 4:28 B)))
32+ (wing 4:31 x))))
tests/golden/types-generic-union-import/modules.txtnew file+2
@@ -0,0 +1,2 @@
1+/ui/shared.jibb
2+/ui/twin.jibb
tests/golden/types-generic-union-import/modules/ui/shared.jibbnew file+4
@@ -0,0 +1,4 @@
1++$ choice |$ [V E]
2+ [%ok value=V]
3+ [%err error=E]
4+++ identity |= x=(choice A B) x
tests/golden/types-generic-union-import/modules/ui/twin.jibbnew file+4
@@ -0,0 +1,4 @@
1++$ choice |$ [V E]
2+ [%ok value=V]
3+ [%err error=E]
4+++ identity |= x=(choice A B) x
tests/golden/types-generic-union-import/source.jibbnew file+9
@@ -0,0 +1,9 @@
1+/= left /ui/shared
2+/= right /ui/shared
3+/= twin /ui/twin
4+++ from-left ^- (choice.left @t @p) [%ok "hi"]
5+++ consume |= x=(choice.right @t @p) x
6+++ same-origin (consume from-left)
7+++ different |= x=(choice.twin @t @p) x
8+++ cross-origin (different from-left)
9+++ polymorphic (identity.right from-left)
tests/golden/types-generic-union-import/tokens.txtnew file+79
@@ -0,0 +1,79 @@
1+1:1 glyph /=
2+1:5 name left
3+1:10 glyph /
4+1:11 tight knot ui
5+1:13 tight glyph /
6+1:14 tight knot shared
7+2:1 NEWLINE
8+2:1 glyph /=
9+2:5 name right
10+2:11 glyph /
11+2:12 tight knot ui
12+2:14 tight glyph /
13+2:15 tight knot shared
14+3:1 NEWLINE
15+3:1 glyph /=
16+3:5 name twin
17+3:10 glyph /
18+3:11 tight knot ui
19+3:13 tight glyph /
20+3:14 tight knot twin
21+4:1 NEWLINE
22+4:1 glyph ++
23+4:4 name from-left
24+4:14 glyph ^-
25+4:17 glyph (
26+4:18 tight wing choice.left
27+4:30 aura @t
28+4:33 aura @p
29+4:35 tight glyph )
30+4:37 glyph [
31+4:38 tight lit %ok
32+4:42 str "hi"
33+4:46 tight glyph ]
34+5:1 NEWLINE
35+5:1 glyph ++
36+5:4 name consume
37+5:12 glyph |=
38+5:15 name x
39+5:16 tight glyph =
40+5:17 tight glyph (
41+5:18 tight wing choice.right
42+5:31 aura @t
43+5:34 aura @p
44+5:36 tight glyph )
45+5:38 name x
46+6:1 NEWLINE
47+6:1 glyph ++
48+6:4 name same-origin
49+6:16 glyph (
50+6:17 tight name consume
51+6:25 name from-left
52+6:34 tight glyph )
53+7:1 NEWLINE
54+7:1 glyph ++
55+7:4 name different
56+7:14 glyph |=
57+7:17 name x
58+7:18 tight glyph =
59+7:19 tight glyph (
60+7:20 tight wing choice.twin
61+7:32 aura @t
62+7:35 aura @p
63+7:37 tight glyph )
64+7:39 name x
65+8:1 NEWLINE
66+8:1 glyph ++
67+8:4 name cross-origin
68+8:17 glyph (
69+8:18 tight name different
70+8:28 name from-left
71+8:37 tight glyph )
72+9:1 NEWLINE
73+9:1 glyph ++
74+9:4 name polymorphic
75+9:16 glyph (
76+9:17 tight wing identity.right
77+9:32 name from-left
78+9:41 tight glyph )
79+9:42 NEWLINE
tests/golden/types-generic-union-import/tree.txtnew file+27
@@ -0,0 +1,27 @@
1+(module
2+ (jibb 1:1 left /ui/shared)
3+ (jibb 2:1 right /ui/shared)
4+ (jibb 3:1 twin /ui/twin)
5+ (value 4:1 from-left
6+ (cast 4:14
7+ (apply 4:17 choice.left (aura 4:30 @t) (aura 4:33 @p))
8+ (tuple 4:37 (lit 4:38 %ok) (str 4:42 "hi"))))
9+ (value 5:1 consume
10+ (gate 5:12
11+ (face 5:15 x
12+ (apply 5:17 choice.right (aura 5:31 @t) (aura 5:34 @p)))
13+ (wing 5:38 x)))
14+ (value 6:1 same-origin
15+ (group 6:16
16+ (call 6:17 (wing 6:17 consume) (wing 6:25 from-left))))
17+ (value 7:1 different
18+ (gate 7:14
19+ (face 7:17 x
20+ (apply 7:19 choice.twin (aura 7:32 @t) (aura 7:35 @p)))
21+ (wing 7:39 x)))
22+ (value 8:1 cross-origin
23+ (group 8:17
24+ (call 8:18 (wing 8:18 different) (wing 8:28 from-left))))
25+ (value 9:1 polymorphic
26+ (group 9:16
27+ (call 9:17 (wing 9:17 identity.right) (wing 9:32 from-left)))))
tests/golden/types-generic-union-import/types.txtnew file+7
@@ -0,0 +1,7 @@
1+partial inference; module not checked
2+++ from-left: (choice.left @t @p)
3+++ consume: $-((choice.right @t @p) (choice.right @t @p))
4+++ same-origin: (choice.right @t @p)
5+++ different: $-((choice.twin @t @p) (choice.twin @t @p))
6+++ cross-origin: call constraint is not supported by partial inference
7+++ polymorphic: (choice.right @t @p)
tests/golden/types-generic-union-local/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Molds: "Every union written in Jibb has a name"; Tag resolution: tags take their union from context. Generic molds are applied with their arguments.
2+tests: A two-parameter generic union resolves tagged values and constructors, exercises independent and repeated arguments across identity gates, swapped aliases, fail-closed comparison of different phantom arguments, and a phantom gate argument; an unrelated tag remains unresolved.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-generic-union-local/source.jibbnew file+34
@@ -0,0 +1,34 @@
1++$ choice |$ [V E]
2+ [%ok value=V]
3+ [%err error=E]
4++$ phantom |$ [A]
5+ %yes
6+ %no
7++$ swapped |$ [A B] (choice B A)
8+++ text-choice ^- (choice @t @p) [%ok "hi"]
9+++ ship-choice ^- (choice @t @p) [%err ~zod]
10+++ text-constructor ^- $-(@t (choice @t @p)) |=%ok
11+++ ship-constructor ^- $-(@p (choice @t @p)) |=%err
12+++ inverse-choice ^- (choice @p @t) [%ok ~zod]
13+++ test-phantom ^- (phantom @t) %yes
14+++ phantom-gate ^- (phantom $-(@t @p)) %yes
15+++ identity |= x=(choice A B) x
16+++ repeated |= x=(choice A A) x
17+++ reverse |= x=(swapped A B) x
18+++ first (identity text-choice)
19+++ second (identity ship-choice)
20+++ third (identity inverse-choice)
21+++ repeated-call (repeated text-choice)
22+++ swap-concrete ^- (swapped @t @p) [%ok ~zod]
23+++ wrong-phantom |= x=(phantom @t) ^- (phantom @p) x
24+++ forced |= flag=?
25+ ^- (choice A @p)
26+ ?- flag
27+ %.y [%ok "hi"]
28+ %.n [%err ~zod]
29+++ pending |= flag=?
30+ ~& %orphan
31+ ^- (choice @t @p)
32+ ?- flag
33+ %.y [%ok "hi"]
34+ %.n [%err ~zod]
tests/golden/types-generic-union-local/tokens.txtnew file+297
@@ -0,0 +1,297 @@
1+1:1 glyph +$
2+1:4 name choice
3+1:11 glyph |$
4+1:14 glyph [
5+1:15 tight tvar V
6+1:17 tvar E
7+1:18 tight glyph ]
8+2:3 INDENT
9+2:3 glyph [
10+2:4 tight lit %ok
11+2:8 name value
12+2:13 tight glyph =
13+2:14 tight tvar V
14+2:15 tight glyph ]
15+3:3 NEWLINE
16+3:3 glyph [
17+3:4 tight lit %err
18+3:9 name error
19+3:14 tight glyph =
20+3:15 tight tvar E
21+3:16 tight glyph ]
22+4:1 DEDENT
23+4:1 NEWLINE
24+4:1 glyph +$
25+4:4 name phantom
26+4:12 glyph |$
27+4:15 glyph [
28+4:16 tight tvar A
29+4:17 tight glyph ]
30+5:3 INDENT
31+5:3 lit %yes
32+6:3 NEWLINE
33+6:3 lit %no
34+7:1 DEDENT
35+7:1 NEWLINE
36+7:1 glyph +$
37+7:4 name swapped
38+7:12 glyph |$
39+7:15 glyph [
40+7:16 tight tvar A
41+7:18 tvar B
42+7:19 tight glyph ]
43+7:21 glyph (
44+7:22 tight name choice
45+7:29 tvar B
46+7:31 tvar A
47+7:32 tight glyph )
48+8:1 NEWLINE
49+8:1 glyph ++
50+8:4 name text-choice
51+8:16 glyph ^-
52+8:19 glyph (
53+8:20 tight name choice
54+8:27 aura @t
55+8:30 aura @p
56+8:32 tight glyph )
57+8:34 glyph [
58+8:35 tight lit %ok
59+8:39 str "hi"
60+8:43 tight glyph ]
61+9:1 NEWLINE
62+9:1 glyph ++
63+9:4 name ship-choice
64+9:16 glyph ^-
65+9:19 glyph (
66+9:20 tight name choice
67+9:27 aura @t
68+9:30 aura @p
69+9:32 tight glyph )
70+9:34 glyph [
71+9:35 tight lit %err
72+9:40 lit ~zod
73+9:44 tight glyph ]
74+10:1 NEWLINE
75+10:1 glyph ++
76+10:4 name text-constructor
77+10:21 glyph ^-
78+10:24 glyph $-(
79+10:27 tight aura @t
80+10:30 glyph (
81+10:31 tight name choice
82+10:38 aura @t
83+10:41 aura @p
84+10:43 tight glyph )
85+10:44 tight glyph )
86+10:46 glyph |=
87+10:48 tight lit %ok
88+11:1 NEWLINE
89+11:1 glyph ++
90+11:4 name ship-constructor
91+11:21 glyph ^-
92+11:24 glyph $-(
93+11:27 tight aura @p
94+11:30 glyph (
95+11:31 tight name choice
96+11:38 aura @t
97+11:41 aura @p
98+11:43 tight glyph )
99+11:44 tight glyph )
100+11:46 glyph |=
101+11:48 tight lit %err
102+12:1 NEWLINE
103+12:1 glyph ++
104+12:4 name inverse-choice
105+12:19 glyph ^-
106+12:22 glyph (
107+12:23 tight name choice
108+12:30 aura @p
109+12:33 aura @t
110+12:35 tight glyph )
111+12:37 glyph [
112+12:38 tight lit %ok
113+12:42 lit ~zod
114+12:46 tight glyph ]
115+13:1 NEWLINE
116+13:1 glyph ++
117+13:4 name test-phantom
118+13:17 glyph ^-
119+13:20 glyph (
120+13:21 tight name phantom
121+13:29 aura @t
122+13:31 tight glyph )
123+13:33 lit %yes
124+14:1 NEWLINE
125+14:1 glyph ++
126+14:4 name phantom-gate
127+14:17 glyph ^-
128+14:20 glyph (
129+14:21 tight name phantom
130+14:29 glyph $-(
131+14:32 tight aura @t
132+14:35 aura @p
133+14:37 tight glyph )
134+14:38 tight glyph )
135+14:40 lit %yes
136+15:1 NEWLINE
137+15:1 glyph ++
138+15:4 name identity
139+15:13 glyph |=
140+15:16 name x
141+15:17 tight glyph =
142+15:18 tight glyph (
143+15:19 tight name choice
144+15:26 tvar A
145+15:28 tvar B
146+15:29 tight glyph )
147+15:31 name x
148+16:1 NEWLINE
149+16:1 glyph ++
150+16:4 name repeated
151+16:13 glyph |=
152+16:16 name x
153+16:17 tight glyph =
154+16:18 tight glyph (
155+16:19 tight name choice
156+16:26 tvar A
157+16:28 tvar A
158+16:29 tight glyph )
159+16:31 name x
160+17:1 NEWLINE
161+17:1 glyph ++
162+17:4 name reverse
163+17:12 glyph |=
164+17:15 name x
165+17:16 tight glyph =
166+17:17 tight glyph (
167+17:18 tight name swapped
168+17:26 tvar A
169+17:28 tvar B
170+17:29 tight glyph )
171+17:31 name x
172+18:1 NEWLINE
173+18:1 glyph ++
174+18:4 name first
175+18:10 glyph (
176+18:11 tight name identity
177+18:20 name text-choice
178+18:31 tight glyph )
179+19:1 NEWLINE
180+19:1 glyph ++
181+19:4 name second
182+19:11 glyph (
183+19:12 tight name identity
184+19:21 name ship-choice
185+19:32 tight glyph )
186+20:1 NEWLINE
187+20:1 glyph ++
188+20:4 name third
189+20:10 glyph (
190+20:11 tight name identity
191+20:20 name inverse-choice
192+20:34 tight glyph )
193+21:1 NEWLINE
194+21:1 glyph ++
195+21:4 name repeated-call
196+21:18 glyph (
197+21:19 tight name repeated
198+21:28 name text-choice
199+21:39 tight glyph )
200+22:1 NEWLINE
201+22:1 glyph ++
202+22:4 name swap-concrete
203+22:18 glyph ^-
204+22:21 glyph (
205+22:22 tight name swapped
206+22:30 aura @t
207+22:33 aura @p
208+22:35 tight glyph )
209+22:37 glyph [
210+22:38 tight lit %ok
211+22:42 lit ~zod
212+22:46 tight glyph ]
213+23:1 NEWLINE
214+23:1 glyph ++
215+23:4 name wrong-phantom
216+23:18 glyph |=
217+23:21 name x
218+23:22 tight glyph =
219+23:23 tight glyph (
220+23:24 tight name phantom
221+23:32 aura @t
222+23:34 tight glyph )
223+23:36 glyph ^-
224+23:39 glyph (
225+23:40 tight name phantom
226+23:48 aura @p
227+23:50 tight glyph )
228+23:52 name x
229+24:1 NEWLINE
230+24:1 glyph ++
231+24:4 name forced
232+24:11 glyph |=
233+24:14 name flag
234+24:18 tight glyph =
235+24:19 tight glyph ?
236+25:3 INDENT
237+25:3 glyph ^-
238+25:6 glyph (
239+25:7 tight name choice
240+25:14 tvar A
241+25:16 aura @p
242+25:18 tight glyph )
243+26:5 INDENT
244+26:5 glyph ?-
245+26:8 name flag
246+27:7 INDENT
247+27:7 lit %.y
248+27:11 glyph [
249+27:12 tight lit %ok
250+27:16 str "hi"
251+27:20 tight glyph ]
252+28:7 NEWLINE
253+28:7 lit %.n
254+28:11 glyph [
255+28:12 tight lit %err
256+28:17 lit ~zod
257+28:21 tight glyph ]
258+29:1 DEDENT
259+29:1 DEDENT
260+29:1 DEDENT
261+29:1 NEWLINE
262+29:1 glyph ++
263+29:4 name pending
264+29:12 glyph |=
265+29:15 name flag
266+29:19 tight glyph =
267+29:20 tight glyph ?
268+30:3 INDENT
269+30:3 glyph ~&
270+30:6 lit %orphan
271+31:5 INDENT
272+31:5 glyph ^-
273+31:8 glyph (
274+31:9 tight name choice
275+31:16 aura @t
276+31:19 aura @p
277+31:21 tight glyph )
278+32:7 INDENT
279+32:7 glyph ?-
280+32:10 name flag
281+33:9 INDENT
282+33:9 lit %.y
283+33:13 glyph [
284+33:14 tight lit %ok
285+33:18 str "hi"
286+33:22 tight glyph ]
287+34:9 NEWLINE
288+34:9 lit %.n
289+34:13 glyph [
290+34:14 tight lit %err
291+34:19 lit ~zod
292+34:23 tight glyph ]
293+34:24 DEDENT
294+34:24 DEDENT
295+34:24 DEDENT
296+34:24 DEDENT
297+34:24 NEWLINE
tests/golden/types-generic-union-local/tree.txtnew file+120
@@ -0,0 +1,120 @@
1+(module
2+ (mold 1:1 choice
3+ (generic 1:11 V E
4+ (union 2:3
5+ (cell 2:3
6+ (const 2:4 %ok)
7+ (face 2:8 value (tvar 2:14 V)))
8+ (cell 3:3
9+ (const 3:4 %err)
10+ (face 3:9 error (tvar 3:15 E))))))
11+ (mold 4:1 phantom
12+ (generic 4:12 A
13+ (union 5:3 (const 5:3 %yes) (const 6:3 %no))))
14+ (mold 7:1 swapped
15+ (generic 7:12 A B
16+ (apply 7:21 choice (tvar 7:29 B) (tvar 7:31 A))))
17+ (value 8:1 text-choice
18+ (cast 8:16
19+ (apply 8:19 choice (aura 8:27 @t) (aura 8:30 @p))
20+ (tuple 8:34 (lit 8:35 %ok) (str 8:39 "hi"))))
21+ (value 9:1 ship-choice
22+ (cast 9:16
23+ (apply 9:19 choice (aura 9:27 @t) (aura 9:30 @p))
24+ (tuple 9:34 (lit 9:35 %err) (lit 9:40 ~zod))))
25+ (value 10:1 text-constructor
26+ (cast 10:21
27+ (fn 10:24
28+ (aura 10:27 @t)
29+ (apply 10:30 choice (aura 10:38 @t) (aura 10:41 @p)))
30+ (ctor 10:46 %ok)))
31+ (value 11:1 ship-constructor
32+ (cast 11:21
33+ (fn 11:24
34+ (aura 11:27 @p)
35+ (apply 11:30 choice (aura 11:38 @t) (aura 11:41 @p)))
36+ (ctor 11:46 %err)))
37+ (value 12:1 inverse-choice
38+ (cast 12:19
39+ (apply 12:22 choice (aura 12:30 @p) (aura 12:33 @t))
40+ (tuple 12:37 (lit 12:38 %ok) (lit 12:42 ~zod))))
41+ (value 13:1 test-phantom
42+ (cast 13:17
43+ (apply 13:20 phantom (aura 13:29 @t))
44+ (lit 13:33 %yes)))
45+ (value 14:1 phantom-gate
46+ (cast 14:17
47+ (apply 14:20 phantom
48+ (fn 14:29 (aura 14:32 @t) (aura 14:35 @p)))
49+ (lit 14:40 %yes)))
50+ (value 15:1 identity
51+ (gate 15:13
52+ (face 15:16 x
53+ (apply 15:18 choice (tvar 15:26 A) (tvar 15:28 B)))
54+ (wing 15:31 x)))
55+ (value 16:1 repeated
56+ (gate 16:13
57+ (face 16:16 x
58+ (apply 16:18 choice (tvar 16:26 A) (tvar 16:28 A)))
59+ (wing 16:31 x)))
60+ (value 17:1 reverse
61+ (gate 17:12
62+ (face 17:15 x
63+ (apply 17:17 swapped (tvar 17:26 A) (tvar 17:28 B)))
64+ (wing 17:31 x)))
65+ (value 18:1 first
66+ (group 18:10
67+ (call 18:11 (wing 18:11 identity) (wing 18:20 text-choice))))
68+ (value 19:1 second
69+ (group 19:11
70+ (call 19:12 (wing 19:12 identity) (wing 19:21 ship-choice))))
71+ (value 20:1 third
72+ (group 20:10
73+ (call 20:11 (wing 20:11 identity) (wing 20:20 inverse-choice))))
74+ (value 21:1 repeated-call
75+ (group 21:18
76+ (call 21:19 (wing 21:19 repeated) (wing 21:28 text-choice))))
77+ (value 22:1 swap-concrete
78+ (cast 22:18
79+ (apply 22:21 swapped (aura 22:30 @t) (aura 22:33 @p))
80+ (tuple 22:37 (lit 22:38 %ok) (lit 22:42 ~zod))))
81+ (value 23:1 wrong-phantom
82+ (gate 23:18
83+ (face 23:21 x
84+ (apply 23:23 phantom (aura 23:32 @t)))
85+ (cast 23:36
86+ (apply 23:39 phantom (aura 23:48 @p))
87+ (wing 23:52 x))))
88+ (value 24:1 forced
89+ (gate 24:11
90+ (face 24:14 flag (flag 24:19))
91+ (body 25:3
92+ (cast 25:3
93+ (apply 25:6 choice (tvar 25:14 A) (aura 25:16 @p))
94+ (body 26:5
95+ (branch 26:5
96+ (wing 26:8 flag)
97+ (arm 27:7
98+ (lit 27:7 %.y)
99+ (tuple 27:11 (lit 27:12 %ok) (str 27:16 "hi")))
100+ (arm 28:7
101+ (lit 28:7 %.n)
102+ (tuple 28:11 (lit 28:12 %err) (lit 28:17 ~zod)))))))))
103+ (value 29:1 pending
104+ (gate 29:12
105+ (face 29:15 flag (flag 29:20))
106+ (body 30:3
107+ (trace 30:3
108+ (lit 30:6 %orphan)
109+ (body 31:5
110+ (cast 31:5
111+ (apply 31:8 choice (aura 31:16 @t) (aura 31:19 @p))
112+ (body 32:7
113+ (branch 32:7
114+ (wing 32:10 flag)
115+ (arm 33:9
116+ (lit 33:9 %.y)
117+ (tuple 33:13 (lit 33:14 %ok) (str 33:18 "hi")))
118+ (arm 34:9
119+ (lit 34:9 %.n)
120+ (tuple 34:13 (lit 34:14 %err) (lit 34:19 ~zod))))))))))))
tests/golden/types-generic-union-local/types.txtnew file+22
@@ -0,0 +1,22 @@
1+partial inference; module not checked
2++$ choice: cases proven disjoint; mold not checked
3++$ phantom: cases proven disjoint; mold not checked
4++$ swapped: not checked
5+++ text-choice: (choice @t @p)
6+++ ship-choice: (choice @t @p)
7+++ text-constructor: $-(@t (choice @t @p))
8+++ ship-constructor: $-(@p (choice @t @p))
9+++ inverse-choice: (choice @p @t)
10+++ test-phantom: (phantom @t)
11+++ phantom-gate: (phantom $-(@t @p))
12+++ identity: $-((choice A B) (choice A B))
13+++ repeated: $-((choice A A) (choice A A))
14+++ reverse: sample mold is not supported by partial inference
15+++ first: (choice @t @p)
16+++ second: (choice @t @p)
17+++ third: (choice @p @t)
18+++ repeated-call: call constraint is not supported by partial inference
19+++ swap-concrete: cast mold is not supported by partial inference
20+++ wrong-phantom: cast constraint is not supported by partial inference
21+++ forced: explicit capital constraints are not supported by partial inference
22+++ pending: tag needs context in partial inference
tests/golden/types-generic-union-transitive/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Modules: "Everything is exported and read through the import's face"; Molds: generic molds.
2+tests: A transitive generic union alias reverses arguments; the partial checker rejects the unsupported alias rather than exporting an incomplete interface. This case will also exercise origin preservation through imported values and callers when aliases are supported.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-generic-union-transitive/module-trees.txtnew file+23
@@ -0,0 +1,23 @@
1+/ui/base.jibb
2+(module
3+ (mold 1:1 choice
4+ (generic 1:11 V E
5+ (union 2:3
6+ (cell 2:3
7+ (const 2:4 %ok)
8+ (face 2:8 value (tvar 2:14 V)))
9+ (cell 3:3
10+ (const 3:4 %err)
11+ (face 3:9 error (tvar 3:15 E)))))))
12+/ui/mid.jibb
13+(module
14+ (jibb 1:1 base /ui/base)
15+ (mold 2:1 relay
16+ (generic 2:10 A B
17+ (apply 2:19 choice.base (tvar 2:32 B) (tvar 2:34 A))))
18+ (value 3:1 make
19+ (gate 3:9
20+ (face 3:12 x (tvar 3:14 A))
21+ (cast 3:16
22+ (apply 3:19 relay (tvar 3:26 A) (tvar 3:28 B))
23+ (tuple 3:31 (lit 3:32 %err) (wing 3:37 x))))))
tests/golden/types-generic-union-transitive/modules.txtnew file+2
@@ -0,0 +1,2 @@
1+/ui/base.jibb
2+/ui/mid.jibb
tests/golden/types-generic-union-transitive/modules/ui/base.jibbnew file+3
@@ -0,0 +1,3 @@
1++$ choice |$ [V E]
2+ [%ok value=V]
3+ [%err error=E]
tests/golden/types-generic-union-transitive/modules/ui/mid.jibbnew file+3
@@ -0,0 +1,3 @@
1+/= base /ui/base
2++$ relay |$ [A B] (choice.base B A)
3+++ make |= x=A ^- (relay A B) [%err x]
tests/golden/types-generic-union-transitive/source.jibbnew file+4
@@ -0,0 +1,4 @@
1+/= mid /ui/mid
2+++ concrete ^- (relay.mid @t @p) [%ok ~zod]
3+++ via (make.mid "hi")
4+++ generic |= x=(relay.mid A B) x
tests/golden/types-generic-union-transitive/tokens.txtnew file+39
@@ -0,0 +1,39 @@
1+1:1 glyph /=
2+1:5 name mid
3+1:9 glyph /
4+1:10 tight knot ui
5+1:12 tight glyph /
6+1:13 tight knot mid
7+2:1 NEWLINE
8+2:1 glyph ++
9+2:4 name concrete
10+2:13 glyph ^-
11+2:16 glyph (
12+2:17 tight wing relay.mid
13+2:27 aura @t
14+2:30 aura @p
15+2:32 tight glyph )
16+2:34 glyph [
17+2:35 tight lit %ok
18+2:39 lit ~zod
19+2:43 tight glyph ]
20+3:1 NEWLINE
21+3:1 glyph ++
22+3:4 name via
23+3:8 glyph (
24+3:9 tight wing make.mid
25+3:18 str "hi"
26+3:22 tight glyph )
27+4:1 NEWLINE
28+4:1 glyph ++
29+4:4 name generic
30+4:12 glyph |=
31+4:15 name x
32+4:16 tight glyph =
33+4:17 tight glyph (
34+4:18 tight wing relay.mid
35+4:28 tvar A
36+4:30 tvar B
37+4:31 tight glyph )
38+4:33 name x
39+4:34 NEWLINE
tests/golden/types-generic-union-transitive/tree.txtnew file+14
@@ -0,0 +1,14 @@
1+(module
2+ (jibb 1:1 mid /ui/mid)
3+ (value 2:1 concrete
4+ (cast 2:13
5+ (apply 2:16 relay.mid (aura 2:27 @t) (aura 2:30 @p))
6+ (tuple 2:34 (lit 2:35 %ok) (lit 2:39 ~zod))))
7+ (value 3:1 via
8+ (group 3:8
9+ (call 3:9 (wing 3:9 make.mid) (str 3:18 "hi"))))
10+ (value 4:1 generic
11+ (gate 4:12
12+ (face 4:15 x
13+ (apply 4:17 relay.mid (tvar 4:28 A) (tvar 4:30 B)))
14+ (wing 4:33 x))))
tests/golden/types-generic-union-transitive/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+module mold needs unsupported inference: /ui/mid/jibb
tests/golden/types-union-phantom-generic/about.txt+1−1
@@ -1,4 +1,4 @@
1source: Grammar, Molds: a generic mold declares its parameters after `|$`, and a union takes its cases below its name.
1source: Grammar, Molds: a generic mold declares its parameters after `|$`, and a union takes its cases below its name.
2−tests: A generic union remains unsupported even when its parameter is unused, until its type identity retains the arguments.
2+tests: A generic union with an unused parameter retains its argument in the printed type.
3expect: parses
3expect: parses
4expect-types: a partial inference report
4expect-types: a partial inference report
tests/golden/types-union-phantom-generic/types.txt+1−1
@@ -1,3 +1,3 @@
1partial inference; module not checked
1partial inference; module not checked
2+$ phantom: cases proven disjoint; mold not checked
2+$ phantom: cases proven disjoint; mold not checked
3−++ example: cast mold is not supported by partial inference
3+++ example: (phantom @t)
tests/importer/about.txt+2−3
@@ -8,9 +8,8 @@ forks are checked too. A standard list, set, map or unit can have one direct
8explicit union argument when the exact call wrapper and collection provenance
8explicit union argument when the exact call wrapper and collection provenance
9are validated and all union cases are static and pairwise disjoint. Cases
9are validated and all union cases are static and pairwise disjoint. Cases
10cover overlap, collapsed branches, multiple or nested unions, dependent
10cover overlap, collapsed branches, multiple or nested unions, dependent
11−branches and a shadowed collection. A direct forged-wrapper regression
11+branches, forged subject, sample and tail wrappers, and a shadowed
12−still needs a test that compiles in practical time. Unsupported forms fail
13−closed; nested `$@` cases remain supported. The provisional reading is recorded in doc question 22. `ford.txt`
12+collection. Unsupported forms fail closed; nested `$@` cases remain supported. The provisional reading is recorded in doc question 22. `ford.txt`
14checks a synthetic imported subject and selected mold; other cases check
13checks a synthetic imported subject and selected mold; other cases check
15transitive imports, named mold lookup, missing names, shadowing, unprovenanced
14transitive imports, named mold lookup, missing names, shadowing, unprovenanced
16recursive holds, malformed
15recursive holds, malformed
tests/importer/tree.txt+1
@@ -60,6 +60,7 @@ explicit-subsumed: error: a Hoon union has overlapping cases
60explicit-three: (union [a @ud] [b @t] [c @p])
60explicit-three: (union [a @ud] [b @t] [c @p])
61explicit-unknown: error: a Hoon union needs a source-level disjointness check
61explicit-unknown: error: a Hoon union needs a source-level disjointness check
62explicit-nested: error: a Hoon union has overlapping cases
62explicit-nested: error: a Hoon union has overlapping cases
63+collection-union-wrapper: valid; forged subject, sample and tail rejected
63collection-union-list: (list (union [x @ud] [y @t]))
64collection-union-list: (list (union [x @ud] [y @t]))
64collection-union-set: (set (union [x @ud] [y @t]))
65collection-union-set: (set (union [x @ud] [y @t]))
65collection-union-map-key: (map (union [x @ud] [y @t]) (list @ud))
66collection-union-map-key: (map (union [x @ud] [y @t]) (list @ud))
tests/lib/jibb.hoon+407−362
@@ -1367,302 +1367,335 @@
1367/* tok-415 %txt /tests/golden/types-generic-repeated/tokens/txt
1367/* tok-415 %txt /tests/golden/types-generic-repeated/tokens/txt
1368/* tre-415 %txt /tests/golden/types-generic-repeated/tree/txt
1368/* tre-415 %txt /tests/golden/types-generic-repeated/tree/txt
1369/* typ-415 %txt /tests/golden/types-generic-repeated/types/txt
1369/* typ-415 %txt /tests/golden/types-generic-repeated/types/txt
1370−/* src-416 %jibb /tests/golden/types-import-mark/source/jibb
1370+/* src-416 %jibb /tests/golden/types-generic-union-capitals/source/jibb
1371−/* tok-416 %txt /tests/golden/types-import-mark/tokens/txt
1371+/* tok-416 %txt /tests/golden/types-generic-union-capitals/tokens/txt
1372−/* tre-416 %txt /tests/golden/types-import-mark/tree/txt
1372+/* tre-416 %txt /tests/golden/types-generic-union-capitals/tree/txt
1373−/* typ-416 %txt /tests/golden/types-import-mark/types/txt
1373+/* typ-416 %txt /tests/golden/types-generic-union-capitals/types/txt
1374−/* imp-416-1 %txt /tests/golden/types-import-mark/sur/fixture/txt
1374+/* src-417 %jibb /tests/golden/types-generic-union-errors/source/jibb
1375−/* mark-416-1 %txt /tests/golden/types-import-mark/mar/label/txt
1375+/* tok-417 %txt /tests/golden/types-generic-union-errors/tokens/txt
1376−/* src-417 %jibb /tests/golden/types-import-mark-record/source/jibb
1376+/* tre-417 %txt /tests/golden/types-generic-union-errors/tree/txt
1377−/* tok-417 %txt /tests/golden/types-import-mark-record/tokens/txt
1377+/* typ-417 %txt /tests/golden/types-generic-union-errors/types/txt
1378−/* tre-417 %txt /tests/golden/types-import-mark-record/tree/txt
1378+/* src-418 %jibb /tests/golden/types-generic-union-escaping/source/jibb
1379−/* typ-417 %txt /tests/golden/types-import-mark-record/types/txt
1379+/* tok-418 %txt /tests/golden/types-generic-union-escaping/tokens/txt
1380−/* mark-417-1 %txt /tests/golden/types-import-mark-record/mar/note/txt
1380+/* tre-418 %txt /tests/golden/types-generic-union-escaping/tree/txt
1381−/* mark-417-2 %txt /tests/golden/types-import-mark-record/mar/choice/txt
1381+/* mod-418-1 %jibb /tests/golden/types-generic-union-escaping/modules/ui/base/jibb
1382−/* src-418 %jibb /tests/golden/types-import-missing-mold/source/jibb
1382+/* mod-418-2 %jibb /tests/golden/types-generic-union-escaping/modules/ui/mid/jibb
1383−/* tok-418 %txt /tests/golden/types-import-missing-mold/tokens/txt
1383+/* typ-418 %txt /tests/golden/types-generic-union-escaping/types/txt
1384−/* tre-418 %txt /tests/golden/types-import-missing-mold/tree/txt
1384+/* mtre-418 %txt /tests/golden/types-generic-union-escaping/module-trees/txt
1385−/* typ-418 %txt /tests/golden/types-import-missing-mold/types/txt
1385+/* src-419 %jibb /tests/golden/types-generic-union-import/source/jibb
1386−/* imp-418-1 %txt /tests/golden/types-import-missing-mold/sur/fixture/txt
1386+/* tok-419 %txt /tests/golden/types-generic-union-import/tokens/txt
1387−/* src-419 %jibb /tests/golden/types-import-sur/source/jibb
1387+/* tre-419 %txt /tests/golden/types-generic-union-import/tree/txt
1388−/* tok-419 %txt /tests/golden/types-import-sur/tokens/txt
1388+/* mod-419-1 %jibb /tests/golden/types-generic-union-import/modules/ui/shared/jibb
1389−/* tre-419 %txt /tests/golden/types-import-sur/tree/txt
1389+/* mod-419-2 %jibb /tests/golden/types-generic-union-import/modules/ui/twin/jibb
1390−/* typ-419 %txt /tests/golden/types-import-sur/types/txt
1390+/* typ-419 %txt /tests/golden/types-generic-union-import/types/txt
1391−/* imp-419-1 %txt /tests/golden/types-import-sur/sur/fixture/txt
1391+/* mtre-419 %txt /tests/golden/types-generic-union-import/module-trees/txt
1392−/* imp-419-2 %txt /tests/golden/types-import-sur/sur/fixture/txt
1392+/* src-420 %jibb /tests/golden/types-generic-union-local/source/jibb
1393−/* src-420 %jibb /tests/golden/types-import-sur-record-graph/source/jibb
1393+/* tok-420 %txt /tests/golden/types-generic-union-local/tokens/txt
1394−/* tok-420 %txt /tests/golden/types-import-sur-record-graph/tokens/txt
1394+/* tre-420 %txt /tests/golden/types-generic-union-local/tree/txt
1395−/* tre-420 %txt /tests/golden/types-import-sur-record-graph/tree/txt
1395+/* typ-420 %txt /tests/golden/types-generic-union-local/types/txt
1396−/* mod-420-1 %jibb /tests/golden/types-import-sur-record-graph/modules/ui/lib/jibb
1396+/* src-421 %jibb /tests/golden/types-generic-union-transitive/source/jibb
1397−/* typ-420 %txt /tests/golden/types-import-sur-record-graph/types/txt
1397+/* tok-421 %txt /tests/golden/types-generic-union-transitive/tokens/txt
1398−/* imp-420-1 %txt /tests/golden/types-import-sur-record-graph/sur/fixture/txt
1398+/* tre-421 %txt /tests/golden/types-generic-union-transitive/tree/txt
1399−/* mtre-420 %txt /tests/golden/types-import-sur-record-graph/module-trees/txt
1399+/* mod-421-1 %jibb /tests/golden/types-generic-union-transitive/modules/ui/base/jibb
1400−/* src-421 %jibb /tests/golden/types-module-fixtures/source/jibb
1400+/* mod-421-2 %jibb /tests/golden/types-generic-union-transitive/modules/ui/mid/jibb
1401−/* tok-421 %txt /tests/golden/types-module-fixtures/tokens/txt
1401+/* typ-421 %txt /tests/golden/types-generic-union-transitive/types/txt
1402−/* tre-421 %txt /tests/golden/types-module-fixtures/tree/txt
1402+/* mtre-421 %txt /tests/golden/types-generic-union-transitive/module-trees/txt
1403−/* mod-421-1 %jibb /tests/golden/types-module-fixtures/modules/ui/api/blog/jibb
1403+/* src-422 %jibb /tests/golden/types-import-mark/source/jibb
1404−/* mod-421-2 %jibb /tests/golden/types-module-fixtures/modules/ui/components/card/jibb
1404+/* tok-422 %txt /tests/golden/types-import-mark/tokens/txt
1405−/* typ-421 %txt /tests/golden/types-module-fixtures/types/txt
1405+/* tre-422 %txt /tests/golden/types-import-mark/tree/txt
1406−/* mtre-421 %txt /tests/golden/types-module-fixtures/module-trees/txt
1406+/* typ-422 %txt /tests/golden/types-import-mark/types/txt
1407−/* src-422 %jibb /tests/golden/types-module-mixed/source/jibb
1407+/* imp-422-1 %txt /tests/golden/types-import-mark/sur/fixture/txt
1408−/* tok-422 %txt /tests/golden/types-module-mixed/tokens/txt
1408+/* mark-422-1 %txt /tests/golden/types-import-mark/mar/label/txt
1409−/* tre-422 %txt /tests/golden/types-module-mixed/tree/txt
1409+/* src-423 %jibb /tests/golden/types-import-mark-record/source/jibb
1410−/* mod-422-1 %jibb /tests/golden/types-module-mixed/modules/ui/helper/jibb
1410+/* tok-423 %txt /tests/golden/types-import-mark-record/tokens/txt
1411−/* typ-422 %txt /tests/golden/types-module-mixed/types/txt
1411+/* tre-423 %txt /tests/golden/types-import-mark-record/tree/txt
1412−/* imp-422-1 %txt /tests/golden/types-module-mixed/sur/fixture/txt
1412+/* typ-423 %txt /tests/golden/types-import-mark-record/types/txt
1413−/* mark-422-1 %txt /tests/golden/types-module-mixed/mar/label/txt
1413+/* mark-423-1 %txt /tests/golden/types-import-mark-record/mar/note/txt
1414−/* mtre-422 %txt /tests/golden/types-module-mixed/module-trees/txt
1414+/* mark-423-2 %txt /tests/golden/types-import-mark-record/mar/choice/txt
1415−/* src-423 %jibb /tests/golden/types-partial-apply/source/jibb
1415+/* src-424 %jibb /tests/golden/types-import-missing-mold/source/jibb
1416−/* tok-423 %txt /tests/golden/types-partial-apply/tokens/txt
1416+/* tok-424 %txt /tests/golden/types-import-missing-mold/tokens/txt
1417−/* tre-423 %txt /tests/golden/types-partial-apply/tree/txt
1417+/* tre-424 %txt /tests/golden/types-import-missing-mold/tree/txt
1418−/* typ-423 %txt /tests/golden/types-partial-apply/types/txt
1418+/* typ-424 %txt /tests/golden/types-import-missing-mold/types/txt
1419−/* src-424 %jibb /tests/golden/types-partial-atom-alias/source/jibb
1419+/* imp-424-1 %txt /tests/golden/types-import-missing-mold/sur/fixture/txt
1420−/* tok-424 %txt /tests/golden/types-partial-atom-alias/tokens/txt
1420+/* src-425 %jibb /tests/golden/types-import-sur/source/jibb
1421−/* tre-424 %txt /tests/golden/types-partial-atom-alias/tree/txt
1421+/* tok-425 %txt /tests/golden/types-import-sur/tokens/txt
1422−/* typ-424 %txt /tests/golden/types-partial-atom-alias/types/txt
1422+/* tre-425 %txt /tests/golden/types-import-sur/tree/txt
1423−/* src-425 %jibb /tests/golden/types-partial-atom-constraint/source/jibb
1423+/* typ-425 %txt /tests/golden/types-import-sur/types/txt
1424−/* tok-425 %txt /tests/golden/types-partial-atom-constraint/tokens/txt
1424+/* imp-425-1 %txt /tests/golden/types-import-sur/sur/fixture/txt
1425−/* tre-425 %txt /tests/golden/types-partial-atom-constraint/tree/txt
1425+/* imp-425-2 %txt /tests/golden/types-import-sur/sur/fixture/txt
1426−/* typ-425 %txt /tests/golden/types-partial-atom-constraint/types/txt
1426+/* src-426 %jibb /tests/golden/types-import-sur-record-graph/source/jibb
1427−/* src-426 %jibb /tests/golden/types-partial-atom-widening/source/jibb
1427+/* tok-426 %txt /tests/golden/types-import-sur-record-graph/tokens/txt
1428−/* tok-426 %txt /tests/golden/types-partial-atom-widening/tokens/txt
1428+/* tre-426 %txt /tests/golden/types-import-sur-record-graph/tree/txt
1429−/* tre-426 %txt /tests/golden/types-partial-atom-widening/tree/txt
1429+/* mod-426-1 %jibb /tests/golden/types-import-sur-record-graph/modules/ui/lib/jibb
1430−/* typ-426 %txt /tests/golden/types-partial-atom-widening/types/txt
1430+/* typ-426 %txt /tests/golden/types-import-sur-record-graph/types/txt
1431−/* src-427 %jibb /tests/golden/types-partial-aura/source/jibb
1431+/* imp-426-1 %txt /tests/golden/types-import-sur-record-graph/sur/fixture/txt
1432−/* tok-427 %txt /tests/golden/types-partial-aura/tokens/txt
1432+/* mtre-426 %txt /tests/golden/types-import-sur-record-graph/module-trees/txt
1433−/* tre-427 %txt /tests/golden/types-partial-aura/tree/txt
1433+/* src-427 %jibb /tests/golden/types-module-fixtures/source/jibb
1434−/* typ-427 %txt /tests/golden/types-partial-aura/types/txt
1434+/* tok-427 %txt /tests/golden/types-module-fixtures/tokens/txt
1435−/* src-428 %jibb /tests/golden/types-partial-aura-family/source/jibb
1435+/* tre-427 %txt /tests/golden/types-module-fixtures/tree/txt
1436−/* tok-428 %txt /tests/golden/types-partial-aura-family/tokens/txt
1436+/* mod-427-1 %jibb /tests/golden/types-module-fixtures/modules/ui/api/blog/jibb
1437−/* tre-428 %txt /tests/golden/types-partial-aura-family/tree/txt
1437+/* mod-427-2 %jibb /tests/golden/types-module-fixtures/modules/ui/components/card/jibb
1438−/* typ-428 %txt /tests/golden/types-partial-aura-family/types/txt
1438+/* typ-427 %txt /tests/golden/types-module-fixtures/types/txt
1439−/* src-429 %jibb /tests/golden/types-partial-aura-generalization/source/jibb
1439+/* mtre-427 %txt /tests/golden/types-module-fixtures/module-trees/txt
1440−/* tok-429 %txt /tests/golden/types-partial-aura-generalization/tokens/txt
1440+/* src-428 %jibb /tests/golden/types-module-mixed/source/jibb
1441−/* tre-429 %txt /tests/golden/types-partial-aura-generalization/tree/txt
1441+/* tok-428 %txt /tests/golden/types-module-mixed/tokens/txt
1442−/* typ-429 %txt /tests/golden/types-partial-aura-generalization/types/txt
1442+/* tre-428 %txt /tests/golden/types-module-mixed/tree/txt
1443−/* src-430 %jibb /tests/golden/types-partial-bare-atom/source/jibb
1443+/* mod-428-1 %jibb /tests/golden/types-module-mixed/modules/ui/helper/jibb
1444−/* tok-430 %txt /tests/golden/types-partial-bare-atom/tokens/txt
1444+/* typ-428 %txt /tests/golden/types-module-mixed/types/txt
1445−/* tre-430 %txt /tests/golden/types-partial-bare-atom/tree/txt
1445+/* imp-428-1 %txt /tests/golden/types-module-mixed/sur/fixture/txt
1446−/* typ-430 %txt /tests/golden/types-partial-bare-atom/types/txt
1446+/* mark-428-1 %txt /tests/golden/types-module-mixed/mar/label/txt
1447−/* src-431 %jibb /tests/golden/types-partial-branch-widening/source/jibb
1447+/* mtre-428 %txt /tests/golden/types-module-mixed/module-trees/txt
1448−/* tok-431 %txt /tests/golden/types-partial-branch-widening/tokens/txt
1448+/* src-429 %jibb /tests/golden/types-partial-apply/source/jibb
1449−/* tre-431 %txt /tests/golden/types-partial-branch-widening/tree/txt
1449+/* tok-429 %txt /tests/golden/types-partial-apply/tokens/txt
1450−/* typ-431 %txt /tests/golden/types-partial-branch-widening/types/txt
1450+/* tre-429 %txt /tests/golden/types-partial-apply/tree/txt
1451−/* src-432 %jibb /tests/golden/types-partial-conflicting-sites/source/jibb
1451+/* typ-429 %txt /tests/golden/types-partial-apply/types/txt
1452−/* tok-432 %txt /tests/golden/types-partial-conflicting-sites/tokens/txt
1452+/* src-430 %jibb /tests/golden/types-partial-atom-alias/source/jibb
1453−/* tre-432 %txt /tests/golden/types-partial-conflicting-sites/tree/txt
1453+/* tok-430 %txt /tests/golden/types-partial-atom-alias/tokens/txt
1454−/* typ-432 %txt /tests/golden/types-partial-conflicting-sites/types/txt
1454+/* tre-430 %txt /tests/golden/types-partial-atom-alias/tree/txt
1455−/* src-433 %jibb /tests/golden/types-partial-decimal-default/source/jibb
1455+/* typ-430 %txt /tests/golden/types-partial-atom-alias/types/txt
1456−/* tok-433 %txt /tests/golden/types-partial-decimal-default/tokens/txt
1456+/* src-431 %jibb /tests/golden/types-partial-atom-constraint/source/jibb
1457−/* tre-433 %txt /tests/golden/types-partial-decimal-default/tree/txt
1457+/* tok-431 %txt /tests/golden/types-partial-atom-constraint/tokens/txt
1458−/* typ-433 %txt /tests/golden/types-partial-decimal-default/types/txt
1458+/* tre-431 %txt /tests/golden/types-partial-atom-constraint/tree/txt
1459−/* src-434 %jibb /tests/golden/types-partial-dependency-chain/source/jibb
1459+/* typ-431 %txt /tests/golden/types-partial-atom-constraint/types/txt
1460−/* tok-434 %txt /tests/golden/types-partial-dependency-chain/tokens/txt
1460+/* src-432 %jibb /tests/golden/types-partial-atom-widening/source/jibb
1461−/* tre-434 %txt /tests/golden/types-partial-dependency-chain/tree/txt
1461+/* tok-432 %txt /tests/golden/types-partial-atom-widening/tokens/txt
1462−/* typ-434 %txt /tests/golden/types-partial-dependency-chain/types/txt
1462+/* tre-432 %txt /tests/golden/types-partial-atom-widening/tree/txt
1463−/* src-435 %jibb /tests/golden/types-partial-explicit-capital/source/jibb
1463+/* typ-432 %txt /tests/golden/types-partial-atom-widening/types/txt
1464−/* tok-435 %txt /tests/golden/types-partial-explicit-capital/tokens/txt
1464+/* src-433 %jibb /tests/golden/types-partial-aura/source/jibb
1465−/* tre-435 %txt /tests/golden/types-partial-explicit-capital/tree/txt
1465+/* tok-433 %txt /tests/golden/types-partial-aura/tokens/txt
1466−/* typ-435 %txt /tests/golden/types-partial-explicit-capital/types/txt
1466+/* tre-433 %txt /tests/golden/types-partial-aura/tree/txt
1467−/* src-436 %jibb /tests/golden/types-partial-forward/source/jibb
1467+/* typ-433 %txt /tests/golden/types-partial-aura/types/txt
1468−/* tok-436 %txt /tests/golden/types-partial-forward/tokens/txt
1468+/* src-434 %jibb /tests/golden/types-partial-aura-family/source/jibb
1469−/* tre-436 %txt /tests/golden/types-partial-forward/tree/txt
1469+/* tok-434 %txt /tests/golden/types-partial-aura-family/tokens/txt
1470−/* typ-436 %txt /tests/golden/types-partial-forward/types/txt
1470+/* tre-434 %txt /tests/golden/types-partial-aura-family/tree/txt
1471−/* src-437 %jibb /tests/golden/types-partial-generalization/source/jibb
1471+/* typ-434 %txt /tests/golden/types-partial-aura-family/types/txt
1472−/* tok-437 %txt /tests/golden/types-partial-generalization/tokens/txt
1472+/* src-435 %jibb /tests/golden/types-partial-aura-generalization/source/jibb
1473−/* tre-437 %txt /tests/golden/types-partial-generalization/tree/txt
1473+/* tok-435 %txt /tests/golden/types-partial-aura-generalization/tokens/txt
1474−/* typ-437 %txt /tests/golden/types-partial-generalization/types/txt
1474+/* tre-435 %txt /tests/golden/types-partial-aura-generalization/tree/txt
1475−/* src-438 %jibb /tests/golden/types-partial-identity/source/jibb
1475+/* typ-435 %txt /tests/golden/types-partial-aura-generalization/types/txt
1476−/* tok-438 %txt /tests/golden/types-partial-identity/tokens/txt
1476+/* src-436 %jibb /tests/golden/types-partial-bare-atom/source/jibb
1477−/* tre-438 %txt /tests/golden/types-partial-identity/tree/txt
1477+/* tok-436 %txt /tests/golden/types-partial-bare-atom/tokens/txt
1478−/* typ-438 %txt /tests/golden/types-partial-identity/types/txt
1478+/* tre-436 %txt /tests/golden/types-partial-bare-atom/tree/txt
1479−/* src-439 %jibb /tests/golden/types-partial-independent-atoms/source/jibb
1479+/* typ-436 %txt /tests/golden/types-partial-bare-atom/types/txt
1480−/* tok-439 %txt /tests/golden/types-partial-independent-atoms/tokens/txt
1480+/* src-437 %jibb /tests/golden/types-partial-branch-widening/source/jibb
1481−/* tre-439 %txt /tests/golden/types-partial-independent-atoms/tree/txt
1481+/* tok-437 %txt /tests/golden/types-partial-branch-widening/tokens/txt
1482−/* typ-439 %txt /tests/golden/types-partial-independent-atoms/types/txt
1482+/* tre-437 %txt /tests/golden/types-partial-branch-widening/tree/txt
1483−/* src-440 %jibb /tests/golden/types-partial-local-molds/source/jibb
1483+/* typ-437 %txt /tests/golden/types-partial-branch-widening/types/txt
1484−/* tok-440 %txt /tests/golden/types-partial-local-molds/tokens/txt
1484+/* src-438 %jibb /tests/golden/types-partial-conflicting-sites/source/jibb
1485−/* tre-440 %txt /tests/golden/types-partial-local-molds/tree/txt
1485+/* tok-438 %txt /tests/golden/types-partial-conflicting-sites/tokens/txt
1486−/* typ-440 %txt /tests/golden/types-partial-local-molds/types/txt
1486+/* tre-438 %txt /tests/golden/types-partial-conflicting-sites/tree/txt
1487−/* src-441 %jibb /tests/golden/types-partial-locals/source/jibb
1487+/* typ-438 %txt /tests/golden/types-partial-conflicting-sites/types/txt
1488−/* tok-441 %txt /tests/golden/types-partial-locals/tokens/txt
1488+/* src-439 %jibb /tests/golden/types-partial-decimal-default/source/jibb
1489−/* tre-441 %txt /tests/golden/types-partial-locals/tree/txt
1489+/* tok-439 %txt /tests/golden/types-partial-decimal-default/tokens/txt
1490−/* typ-441 %txt /tests/golden/types-partial-locals/types/txt
1490+/* tre-439 %txt /tests/golden/types-partial-decimal-default/tree/txt
1491−/* src-442 %jibb /tests/golden/types-partial-many-atom-constraints/source/jibb
1491+/* typ-439 %txt /tests/golden/types-partial-decimal-default/types/txt
1492−/* tok-442 %txt /tests/golden/types-partial-many-atom-constraints/tokens/txt
1492+/* src-440 %jibb /tests/golden/types-partial-dependency-chain/source/jibb
1493−/* tre-442 %txt /tests/golden/types-partial-many-atom-constraints/tree/txt
1493+/* tok-440 %txt /tests/golden/types-partial-dependency-chain/tokens/txt
1494−/* typ-442 %txt /tests/golden/types-partial-many-atom-constraints/types/txt
1494+/* tre-440 %txt /tests/golden/types-partial-dependency-chain/tree/txt
1495−/* src-443 %jibb /tests/golden/types-partial-mold-bare-aura/source/jibb
1495+/* typ-440 %txt /tests/golden/types-partial-dependency-chain/types/txt
1496−/* tok-443 %txt /tests/golden/types-partial-mold-bare-aura/tokens/txt
1496+/* src-441 %jibb /tests/golden/types-partial-explicit-capital/source/jibb
1497−/* tre-443 %txt /tests/golden/types-partial-mold-bare-aura/tree/txt
1497+/* tok-441 %txt /tests/golden/types-partial-explicit-capital/tokens/txt
1498−/* typ-443 %txt /tests/golden/types-partial-mold-bare-aura/types/txt
1498+/* tre-441 %txt /tests/golden/types-partial-explicit-capital/tree/txt
1499−/* src-444 %jibb /tests/golden/types-partial-mold-composite/source/jibb
1499+/* typ-441 %txt /tests/golden/types-partial-explicit-capital/types/txt
1500−/* tok-444 %txt /tests/golden/types-partial-mold-composite/tokens/txt
1500+/* src-442 %jibb /tests/golden/types-partial-forward/source/jibb
1501−/* tre-444 %txt /tests/golden/types-partial-mold-composite/tree/txt
1501+/* tok-442 %txt /tests/golden/types-partial-forward/tokens/txt
1502−/* typ-444 %txt /tests/golden/types-partial-mold-composite/types/txt
1502+/* tre-442 %txt /tests/golden/types-partial-forward/tree/txt
1503−/* src-445 %jibb /tests/golden/types-partial-mold-forward/source/jibb
1503+/* typ-442 %txt /tests/golden/types-partial-forward/types/txt
1504−/* tok-445 %txt /tests/golden/types-partial-mold-forward/tokens/txt
1504+/* src-443 %jibb /tests/golden/types-partial-generalization/source/jibb
1505−/* tre-445 %txt /tests/golden/types-partial-mold-forward/tree/txt
1505+/* tok-443 %txt /tests/golden/types-partial-generalization/tokens/txt
1506−/* typ-445 %txt /tests/golden/types-partial-mold-forward/types/txt
1506+/* tre-443 %txt /tests/golden/types-partial-generalization/tree/txt
1507−/* src-446 %jibb /tests/golden/types-partial-mold-recursive/source/jibb
1507+/* typ-443 %txt /tests/golden/types-partial-generalization/types/txt
1508−/* tok-446 %txt /tests/golden/types-partial-mold-recursive/tokens/txt
1508+/* src-444 %jibb /tests/golden/types-partial-identity/source/jibb
1509−/* tre-446 %txt /tests/golden/types-partial-mold-recursive/tree/txt
1509+/* tok-444 %txt /tests/golden/types-partial-identity/tokens/txt
1510−/* typ-446 %txt /tests/golden/types-partial-mold-recursive/types/txt
1510+/* tre-444 %txt /tests/golden/types-partial-identity/tree/txt
1511−/* src-447 %jibb /tests/golden/types-partial-occurs/source/jibb
1511+/* typ-444 %txt /tests/golden/types-partial-identity/types/txt
1512−/* tok-447 %txt /tests/golden/types-partial-occurs/tokens/txt
1512+/* src-445 %jibb /tests/golden/types-partial-independent-atoms/source/jibb
1513−/* tre-447 %txt /tests/golden/types-partial-occurs/tree/txt
1513+/* tok-445 %txt /tests/golden/types-partial-independent-atoms/tokens/txt
1514−/* typ-447 %txt /tests/golden/types-partial-occurs/types/txt
1514+/* tre-445 %txt /tests/golden/types-partial-independent-atoms/tree/txt
1515−/* src-448 %jibb /tests/golden/types-partial-projection/source/jibb
1515+/* typ-445 %txt /tests/golden/types-partial-independent-atoms/types/txt
1516−/* tok-448 %txt /tests/golden/types-partial-projection/tokens/txt
1516+/* src-446 %jibb /tests/golden/types-partial-local-molds/source/jibb
1517−/* tre-448 %txt /tests/golden/types-partial-projection/tree/txt
1517+/* tok-446 %txt /tests/golden/types-partial-local-molds/tokens/txt
1518−/* typ-448 %txt /tests/golden/types-partial-projection/types/txt
1518+/* tre-446 %txt /tests/golden/types-partial-local-molds/tree/txt
1519−/* src-449 %jibb /tests/golden/types-partial-shadow-global/source/jibb
1519+/* typ-446 %txt /tests/golden/types-partial-local-molds/types/txt
1520−/* tok-449 %txt /tests/golden/types-partial-shadow-global/tokens/txt
1520+/* src-447 %jibb /tests/golden/types-partial-locals/source/jibb
1521−/* tre-449 %txt /tests/golden/types-partial-shadow-global/tree/txt
1521+/* tok-447 %txt /tests/golden/types-partial-locals/tokens/txt
1522−/* typ-449 %txt /tests/golden/types-partial-shadow-global/types/txt
1522+/* tre-447 %txt /tests/golden/types-partial-locals/tree/txt
1523−/* src-450 %jibb /tests/golden/types-partial-shared-tvar/source/jibb
1523+/* typ-447 %txt /tests/golden/types-partial-locals/types/txt
1524−/* tok-450 %txt /tests/golden/types-partial-shared-tvar/tokens/txt
1524+/* src-448 %jibb /tests/golden/types-partial-many-atom-constraints/source/jibb
1525−/* tre-450 %txt /tests/golden/types-partial-shared-tvar/tree/txt
1525+/* tok-448 %txt /tests/golden/types-partial-many-atom-constraints/tokens/txt
1526−/* typ-450 %txt /tests/golden/types-partial-shared-tvar/types/txt
1526+/* tre-448 %txt /tests/golden/types-partial-many-atom-constraints/tree/txt
1527−/* src-451 %jibb /tests/golden/types-partial-union-cases/source/jibb
1527+/* typ-448 %txt /tests/golden/types-partial-many-atom-constraints/types/txt
1528−/* tok-451 %txt /tests/golden/types-partial-union-cases/tokens/txt
1528+/* src-449 %jibb /tests/golden/types-partial-mold-bare-aura/source/jibb
1529−/* tre-451 %txt /tests/golden/types-partial-union-cases/tree/txt
1529+/* tok-449 %txt /tests/golden/types-partial-mold-bare-aura/tokens/txt
1530−/* typ-451 %txt /tests/golden/types-partial-union-cases/types/txt
1530+/* tre-449 %txt /tests/golden/types-partial-mold-bare-aura/tree/txt
1531−/* src-452 %jibb /tests/golden/types-partial-union-edges/source/jibb
1531+/* typ-449 %txt /tests/golden/types-partial-mold-bare-aura/types/txt
1532−/* tok-452 %txt /tests/golden/types-partial-union-edges/tokens/txt
1532+/* src-450 %jibb /tests/golden/types-partial-mold-composite/source/jibb
1533−/* tre-452 %txt /tests/golden/types-partial-union-edges/tree/txt
1533+/* tok-450 %txt /tests/golden/types-partial-mold-composite/tokens/txt
1534−/* typ-452 %txt /tests/golden/types-partial-union-edges/types/txt
1534+/* tre-450 %txt /tests/golden/types-partial-mold-composite/tree/txt
1535−/* src-453 %jibb /tests/golden/types-partial-unresolved-tag/source/jibb
1535+/* typ-450 %txt /tests/golden/types-partial-mold-composite/types/txt
1536−/* tok-453 %txt /tests/golden/types-partial-unresolved-tag/tokens/txt
1536+/* src-451 %jibb /tests/golden/types-partial-mold-forward/source/jibb
1537−/* tre-453 %txt /tests/golden/types-partial-unresolved-tag/tree/txt
1537+/* tok-451 %txt /tests/golden/types-partial-mold-forward/tokens/txt
1538−/* typ-453 %txt /tests/golden/types-partial-unresolved-tag/types/txt
1538+/* tre-451 %txt /tests/golden/types-partial-mold-forward/tree/txt
1539−/* src-454 %jibb /tests/golden/types-record-bound-variable/source/jibb
1539+/* typ-451 %txt /tests/golden/types-partial-mold-forward/types/txt
1540−/* tok-454 %txt /tests/golden/types-record-bound-variable/tokens/txt
1540+/* src-452 %jibb /tests/golden/types-partial-mold-recursive/source/jibb
1541−/* tre-454 %txt /tests/golden/types-record-bound-variable/tree/txt
1541+/* tok-452 %txt /tests/golden/types-partial-mold-recursive/tokens/txt
1542−/* typ-454 %txt /tests/golden/types-record-bound-variable/types/txt
1542+/* tre-452 %txt /tests/golden/types-partial-mold-recursive/tree/txt
1543−/* src-455 %jibb /tests/golden/types-record-faces/source/jibb
1543+/* typ-452 %txt /tests/golden/types-partial-mold-recursive/types/txt
1544−/* tok-455 %txt /tests/golden/types-record-faces/tokens/txt
1544+/* src-453 %jibb /tests/golden/types-partial-occurs/source/jibb
1545−/* tre-455 %txt /tests/golden/types-record-faces/tree/txt
1545+/* tok-453 %txt /tests/golden/types-partial-occurs/tokens/txt
1546−/* typ-455 %txt /tests/golden/types-record-faces/types/txt
1546+/* tre-453 %txt /tests/golden/types-partial-occurs/tree/txt
1547−/* src-456 %jibb /tests/golden/types-record-import/source/jibb
1547+/* typ-453 %txt /tests/golden/types-partial-occurs/types/txt
1548−/* tok-456 %txt /tests/golden/types-record-import/tokens/txt
1548+/* src-454 %jibb /tests/golden/types-partial-projection/source/jibb
1549−/* tre-456 %txt /tests/golden/types-record-import/tree/txt
1549+/* tok-454 %txt /tests/golden/types-partial-projection/tokens/txt
1550−/* mod-456-1 %jibb /tests/golden/types-record-import/modules/ui/lib/jibb
1550+/* tre-454 %txt /tests/golden/types-partial-projection/tree/txt
1551−/* typ-456 %txt /tests/golden/types-record-import/types/txt
1551+/* typ-454 %txt /tests/golden/types-partial-projection/types/txt
1552−/* mtre-456 %txt /tests/golden/types-record-import/module-trees/txt
1552+/* src-455 %jibb /tests/golden/types-partial-shadow-global/source/jibb
1553−/* src-457 %jibb /tests/golden/types-record-local-scheme/source/jibb
1553+/* tok-455 %txt /tests/golden/types-partial-shadow-global/tokens/txt
1554−/* tok-457 %txt /tests/golden/types-record-local-scheme/tokens/txt
1554+/* tre-455 %txt /tests/golden/types-partial-shadow-global/tree/txt
1555−/* tre-457 %txt /tests/golden/types-record-local-scheme/tree/txt
1555+/* typ-455 %txt /tests/golden/types-partial-shadow-global/types/txt
1556−/* typ-457 %txt /tests/golden/types-record-local-scheme/types/txt
1556+/* src-456 %jibb /tests/golden/types-partial-shared-tvar/source/jibb
1557−/* src-458 %jibb /tests/golden/types-record-nested/source/jibb
1557+/* tok-456 %txt /tests/golden/types-partial-shared-tvar/tokens/txt
1558−/* tok-458 %txt /tests/golden/types-record-nested/tokens/txt
1558+/* tre-456 %txt /tests/golden/types-partial-shared-tvar/tree/txt
1559−/* tre-458 %txt /tests/golden/types-record-nested/tree/txt
1559+/* typ-456 %txt /tests/golden/types-partial-shared-tvar/types/txt
1560−/* typ-458 %txt /tests/golden/types-record-nested/types/txt
1560+/* src-457 %jibb /tests/golden/types-partial-union-cases/source/jibb
1561−/* src-459 %jibb /tests/golden/types-record-to-tuple/source/jibb
1561+/* tok-457 %txt /tests/golden/types-partial-union-cases/tokens/txt
1562−/* tok-459 %txt /tests/golden/types-record-to-tuple/tokens/txt
1562+/* tre-457 %txt /tests/golden/types-partial-union-cases/tree/txt
1563−/* tre-459 %txt /tests/golden/types-record-to-tuple/tree/txt
1563+/* typ-457 %txt /tests/golden/types-partial-union-cases/types/txt
1564−/* typ-459 %txt /tests/golden/types-record-to-tuple/types/txt
1564+/* src-458 %jibb /tests/golden/types-partial-union-edges/source/jibb
1565−/* src-460 %jibb /tests/golden/types-union-alias/source/jibb
1565+/* tok-458 %txt /tests/golden/types-partial-union-edges/tokens/txt
1566−/* tok-460 %txt /tests/golden/types-union-alias/tokens/txt
1566+/* tre-458 %txt /tests/golden/types-partial-union-edges/tree/txt
1567−/* tre-460 %txt /tests/golden/types-union-alias/tree/txt
1567+/* typ-458 %txt /tests/golden/types-partial-union-edges/types/txt
1568−/* typ-460 %txt /tests/golden/types-union-alias/types/txt
1568+/* src-459 %jibb /tests/golden/types-partial-unresolved-tag/source/jibb
1569−/* src-461 %jibb /tests/golden/types-union-branch-context/source/jibb
1569+/* tok-459 %txt /tests/golden/types-partial-unresolved-tag/tokens/txt
1570−/* tok-461 %txt /tests/golden/types-union-branch-context/tokens/txt
1570+/* tre-459 %txt /tests/golden/types-partial-unresolved-tag/tree/txt
1571−/* tre-461 %txt /tests/golden/types-union-branch-context/tree/txt
1571+/* typ-459 %txt /tests/golden/types-partial-unresolved-tag/types/txt
1572−/* typ-461 %txt /tests/golden/types-union-branch-context/types/txt
1572+/* src-460 %jibb /tests/golden/types-record-bound-variable/source/jibb
1573−/* src-462 %jibb /tests/golden/types-union-branch-pending/source/jibb
1573+/* tok-460 %txt /tests/golden/types-record-bound-variable/tokens/txt
1574−/* tok-462 %txt /tests/golden/types-union-branch-pending/tokens/txt
1574+/* tre-460 %txt /tests/golden/types-record-bound-variable/tree/txt
1575−/* tre-462 %txt /tests/golden/types-union-branch-pending/tree/txt
1575+/* typ-460 %txt /tests/golden/types-record-bound-variable/types/txt
1576−/* typ-462 %txt /tests/golden/types-union-branch-pending/types/txt
1576+/* src-461 %jibb /tests/golden/types-record-faces/source/jibb
1577−/* src-463 %jibb /tests/golden/types-union-constructor-shape/source/jibb
1577+/* tok-461 %txt /tests/golden/types-record-faces/tokens/txt
1578−/* tok-463 %txt /tests/golden/types-union-constructor-shape/tokens/txt
1578+/* tre-461 %txt /tests/golden/types-record-faces/tree/txt
1579−/* tre-463 %txt /tests/golden/types-union-constructor-shape/tree/txt
1579+/* typ-461 %txt /tests/golden/types-record-faces/types/txt
1580−/* typ-463 %txt /tests/golden/types-union-constructor-shape/types/txt
1580+/* src-462 %jibb /tests/golden/types-record-import/source/jibb
1581−/* src-464 %jibb /tests/golden/types-union-context-flow/source/jibb
1581+/* tok-462 %txt /tests/golden/types-record-import/tokens/txt
1582−/* tok-464 %txt /tests/golden/types-union-context-flow/tokens/txt
1582+/* tre-462 %txt /tests/golden/types-record-import/tree/txt
1583−/* tre-464 %txt /tests/golden/types-union-context-flow/tree/txt
1583+/* mod-462-1 %jibb /tests/golden/types-record-import/modules/ui/lib/jibb
1584−/* typ-464 %txt /tests/golden/types-union-context-flow/types/txt
1584+/* typ-462 %txt /tests/golden/types-record-import/types/txt
1585−/* src-465 %jibb /tests/golden/types-union-import/source/jibb
1585+/* mtre-462 %txt /tests/golden/types-record-import/module-trees/txt
1586−/* tok-465 %txt /tests/golden/types-union-import/tokens/txt
1586+/* src-463 %jibb /tests/golden/types-record-local-scheme/source/jibb
1587−/* tre-465 %txt /tests/golden/types-union-import/tree/txt
1587+/* tok-463 %txt /tests/golden/types-record-local-scheme/tokens/txt
1588−/* mod-465-1 %jibb /tests/golden/types-union-import/modules/ui/lib/jibb
1588+/* tre-463 %txt /tests/golden/types-record-local-scheme/tree/txt
1589−/* typ-465 %txt /tests/golden/types-union-import/types/txt
1589+/* typ-463 %txt /tests/golden/types-record-local-scheme/types/txt
1590−/* mtre-465 %txt /tests/golden/types-union-import/module-trees/txt
1590+/* src-464 %jibb /tests/golden/types-record-nested/source/jibb
1591−/* src-466 %jibb /tests/golden/types-union-local-pending/source/jibb
1591+/* tok-464 %txt /tests/golden/types-record-nested/tokens/txt
1592−/* tok-466 %txt /tests/golden/types-union-local-pending/tokens/txt
1592+/* tre-464 %txt /tests/golden/types-record-nested/tree/txt
1593−/* tre-466 %txt /tests/golden/types-union-local-pending/tree/txt
1593+/* typ-464 %txt /tests/golden/types-record-nested/types/txt
1594−/* typ-466 %txt /tests/golden/types-union-local-pending/types/txt
1594+/* src-465 %jibb /tests/golden/types-record-to-tuple/source/jibb
1595−/* src-467 %jibb /tests/golden/types-union-overlap/source/jibb
1595+/* tok-465 %txt /tests/golden/types-record-to-tuple/tokens/txt
1596−/* tok-467 %txt /tests/golden/types-union-overlap/tokens/txt
1596+/* tre-465 %txt /tests/golden/types-record-to-tuple/tree/txt
1597−/* tre-467 %txt /tests/golden/types-union-overlap/tree/txt
1597+/* typ-465 %txt /tests/golden/types-record-to-tuple/types/txt
1598−/* typ-467 %txt /tests/golden/types-union-overlap/types/txt
1598+/* src-466 %jibb /tests/golden/types-union-alias/source/jibb
1599−/* src-468 %jibb /tests/golden/types-union-overlap-nested/source/jibb
1599+/* tok-466 %txt /tests/golden/types-union-alias/tokens/txt
1600−/* tok-468 %txt /tests/golden/types-union-overlap-nested/tokens/txt
1600+/* tre-466 %txt /tests/golden/types-union-alias/tree/txt
1601−/* tre-468 %txt /tests/golden/types-union-overlap-nested/tree/txt
1601+/* typ-466 %txt /tests/golden/types-union-alias/types/txt
1602−/* typ-468 %txt /tests/golden/types-union-overlap-nested/types/txt
1602+/* src-467 %jibb /tests/golden/types-union-branch-context/source/jibb
1603−/* src-469 %jibb /tests/golden/types-union-phantom-generic/source/jibb
1603+/* tok-467 %txt /tests/golden/types-union-branch-context/tokens/txt
1604−/* tok-469 %txt /tests/golden/types-union-phantom-generic/tokens/txt
1604+/* tre-467 %txt /tests/golden/types-union-branch-context/tree/txt
1605−/* tre-469 %txt /tests/golden/types-union-phantom-generic/tree/txt
1605+/* typ-467 %txt /tests/golden/types-union-branch-context/types/txt
1606−/* typ-469 %txt /tests/golden/types-union-phantom-generic/types/txt
1606+/* src-468 %jibb /tests/golden/types-union-branch-pending/source/jibb
1607−/* src-470 %jibb /tests/golden/types-union-print-cross-namespace/source/jibb
1607+/* tok-468 %txt /tests/golden/types-union-branch-pending/tokens/txt
1608−/* tok-470 %txt /tests/golden/types-union-print-cross-namespace/tokens/txt
1608+/* tre-468 %txt /tests/golden/types-union-branch-pending/tree/txt
1609−/* tre-470 %txt /tests/golden/types-union-print-cross-namespace/tree/txt
1609+/* typ-468 %txt /tests/golden/types-union-branch-pending/types/txt
1610−/* mod-470-1 %jibb /tests/golden/types-union-print-cross-namespace/modules/ui/lib/jibb
1610+/* src-469 %jibb /tests/golden/types-union-constructor-shape/source/jibb
1611−/* typ-470 %txt /tests/golden/types-union-print-cross-namespace/types/txt
1611+/* tok-469 %txt /tests/golden/types-union-constructor-shape/tokens/txt
1612−/* mtre-470 %txt /tests/golden/types-union-print-cross-namespace/module-trees/txt
1612+/* tre-469 %txt /tests/golden/types-union-constructor-shape/tree/txt
1613−/* src-471 %jibb /tests/golden/types-union-print-distinct/source/jibb
1613+/* typ-469 %txt /tests/golden/types-union-constructor-shape/types/txt
1614−/* tok-471 %txt /tests/golden/types-union-print-distinct/tokens/txt
1614+/* src-470 %jibb /tests/golden/types-union-context-flow/source/jibb
1615−/* tre-471 %txt /tests/golden/types-union-print-distinct/tree/txt
1615+/* tok-470 %txt /tests/golden/types-union-context-flow/tokens/txt
1616−/* mod-471-1 %jibb /tests/golden/types-union-print-distinct/modules/ui/left/jibb
1616+/* tre-470 %txt /tests/golden/types-union-context-flow/tree/txt
1617−/* mod-471-2 %jibb /tests/golden/types-union-print-distinct/modules/ui/right/jibb
1617+/* typ-470 %txt /tests/golden/types-union-context-flow/types/txt
1618−/* mod-471-3 %jibb /tests/golden/types-union-print-distinct/modules/ui/twin/jibb
1618+/* src-471 %jibb /tests/golden/types-union-import/source/jibb
1619−/* typ-471 %txt /tests/golden/types-union-print-distinct/types/txt
1619+/* tok-471 %txt /tests/golden/types-union-import/tokens/txt
1620−/* mtre-471 %txt /tests/golden/types-union-print-distinct/module-trees/txt
1620+/* tre-471 %txt /tests/golden/types-union-import/tree/txt
1621−/* src-472 %jibb /tests/golden/types-union-print-escape/source/jibb
1621+/* mod-471-1 %jibb /tests/golden/types-union-import/modules/ui/lib/jibb
1622−/* tok-472 %txt /tests/golden/types-union-print-escape/tokens/txt
1622+/* typ-471 %txt /tests/golden/types-union-import/types/txt
1623−/* tre-472 %txt /tests/golden/types-union-print-escape/tree/txt
1623+/* mtre-471 %txt /tests/golden/types-union-import/module-trees/txt
1624−/* typ-472 %txt /tests/golden/types-union-print-escape/types/txt
1624+/* src-472 %jibb /tests/golden/types-union-local-pending/source/jibb
1625−/* src-473 %jibb /tests/golden/types-union-print-local/source/jibb
1625+/* tok-472 %txt /tests/golden/types-union-local-pending/tokens/txt
1626−/* tok-473 %txt /tests/golden/types-union-print-local/tokens/txt
1626+/* tre-472 %txt /tests/golden/types-union-local-pending/tree/txt
1627−/* tre-473 %txt /tests/golden/types-union-print-local/tree/txt
1627+/* typ-472 %txt /tests/golden/types-union-local-pending/types/txt
1628−/* typ-473 %txt /tests/golden/types-union-print-local/types/txt
1628+/* src-473 %jibb /tests/golden/types-union-overlap/source/jibb
1629−/* src-474 %jibb /tests/golden/types-union-print-nested/source/jibb
1629+/* tok-473 %txt /tests/golden/types-union-overlap/tokens/txt
1630−/* tok-474 %txt /tests/golden/types-union-print-nested/tokens/txt
1630+/* tre-473 %txt /tests/golden/types-union-overlap/tree/txt
1631−/* tre-474 %txt /tests/golden/types-union-print-nested/tree/txt
1631+/* typ-473 %txt /tests/golden/types-union-overlap/types/txt
1632−/* typ-474 %txt /tests/golden/types-union-print-nested/types/txt
1632+/* src-474 %jibb /tests/golden/types-union-overlap-nested/source/jibb
1633−/* src-475 %jibb /tests/golden/types-union-print-same-origin/source/jibb
1633+/* tok-474 %txt /tests/golden/types-union-overlap-nested/tokens/txt
1634−/* tok-475 %txt /tests/golden/types-union-print-same-origin/tokens/txt
1634+/* tre-474 %txt /tests/golden/types-union-overlap-nested/tree/txt
1635−/* tre-475 %txt /tests/golden/types-union-print-same-origin/tree/txt
1635+/* typ-474 %txt /tests/golden/types-union-overlap-nested/types/txt
1636−/* mod-475-1 %jibb /tests/golden/types-union-print-same-origin/modules/ui/shared/jibb
1636+/* src-475 %jibb /tests/golden/types-union-phantom-generic/source/jibb
1637−/* typ-475 %txt /tests/golden/types-union-print-same-origin/types/txt
1637+/* tok-475 %txt /tests/golden/types-union-phantom-generic/tokens/txt
1638−/* mtre-475 %txt /tests/golden/types-union-print-same-origin/module-trees/txt
1638+/* tre-475 %txt /tests/golden/types-union-phantom-generic/tree/txt
1639−/* src-476 %jibb /tests/golden/types-union-print-transitive/source/jibb
1639+/* typ-475 %txt /tests/golden/types-union-phantom-generic/types/txt
1640−/* tok-476 %txt /tests/golden/types-union-print-transitive/tokens/txt
1640+/* src-476 %jibb /tests/golden/types-union-print-cross-namespace/source/jibb
1641−/* tre-476 %txt /tests/golden/types-union-print-transitive/tree/txt
1641+/* tok-476 %txt /tests/golden/types-union-print-cross-namespace/tokens/txt
1642−/* mod-476-1 %jibb /tests/golden/types-union-print-transitive/modules/ui/mid/jibb
1642+/* tre-476 %txt /tests/golden/types-union-print-cross-namespace/tree/txt
1643−/* mod-476-2 %jibb /tests/golden/types-union-print-transitive/modules/ui/base/jibb
1643+/* mod-476-1 %jibb /tests/golden/types-union-print-cross-namespace/modules/ui/lib/jibb
1644−/* typ-476 %txt /tests/golden/types-union-print-transitive/types/txt
1644+/* typ-476 %txt /tests/golden/types-union-print-cross-namespace/types/txt
1645−/* mtre-476 %txt /tests/golden/types-union-print-transitive/module-trees/txt
1645+/* mtre-476 %txt /tests/golden/types-union-print-cross-namespace/module-trees/txt
1646−/* src-477 %jibb /tests/golden/types-union-singleton/source/jibb
1646+/* src-477 %jibb /tests/golden/types-union-print-distinct/source/jibb
1647−/* tok-477 %txt /tests/golden/types-union-singleton/tokens/txt
1647+/* tok-477 %txt /tests/golden/types-union-print-distinct/tokens/txt
1648−/* tre-477 %txt /tests/golden/types-union-singleton/tree/txt
1648+/* tre-477 %txt /tests/golden/types-union-print-distinct/tree/txt
1649−/* typ-477 %txt /tests/golden/types-union-singleton/types/txt
1649+/* mod-477-1 %jibb /tests/golden/types-union-print-distinct/modules/ui/left/jibb
1650−/* src-478 %jibb /tests/golden/types-union-tag-atoms/source/jibb
1650+/* mod-477-2 %jibb /tests/golden/types-union-print-distinct/modules/ui/right/jibb
1651−/* tok-478 %txt /tests/golden/types-union-tag-atoms/tokens/txt
1651+/* mod-477-3 %jibb /tests/golden/types-union-print-distinct/modules/ui/twin/jibb
1652−/* tre-478 %txt /tests/golden/types-union-tag-atoms/tree/txt
1652+/* typ-477 %txt /tests/golden/types-union-print-distinct/types/txt
1653−/* typ-478 %txt /tests/golden/types-union-tag-atoms/types/txt
1653+/* mtre-477 %txt /tests/golden/types-union-print-distinct/module-trees/txt
1654−/* src-479 %jibb /tests/golden/types-union-tags/source/jibb
1654+/* src-478 %jibb /tests/golden/types-union-print-escape/source/jibb
1655−/* tok-479 %txt /tests/golden/types-union-tags/tokens/txt
1655+/* tok-478 %txt /tests/golden/types-union-print-escape/tokens/txt
1656−/* tre-479 %txt /tests/golden/types-union-tags/tree/txt
1656+/* tre-478 %txt /tests/golden/types-union-print-escape/tree/txt
1657−/* typ-479 %txt /tests/golden/types-union-tags/types/txt
1657+/* typ-478 %txt /tests/golden/types-union-print-escape/types/txt
1658−/* src-480 %jibb /tests/golden/types-union-unresolved/source/jibb
1658+/* src-479 %jibb /tests/golden/types-union-print-local/source/jibb
1659−/* tok-480 %txt /tests/golden/types-union-unresolved/tokens/txt
1659+/* tok-479 %txt /tests/golden/types-union-print-local/tokens/txt
1660−/* tre-480 %txt /tests/golden/types-union-unresolved/tree/txt
1660+/* tre-479 %txt /tests/golden/types-union-print-local/tree/txt
1661−/* typ-480 %txt /tests/golden/types-union-unresolved/types/txt
1661+/* typ-479 %txt /tests/golden/types-union-print-local/types/txt
1662−/* src-481 %jibb /tests/golden/types-union-unresolved-flow/source/jibb
1662+/* src-480 %jibb /tests/golden/types-union-print-nested/source/jibb
1663−/* tok-481 %txt /tests/golden/types-union-unresolved-flow/tokens/txt
1663+/* tok-480 %txt /tests/golden/types-union-print-nested/tokens/txt
1664−/* tre-481 %txt /tests/golden/types-union-unresolved-flow/tree/txt
1664+/* tre-480 %txt /tests/golden/types-union-print-nested/tree/txt
1665−/* typ-481 %txt /tests/golden/types-union-unresolved-flow/types/txt
1665+/* typ-480 %txt /tests/golden/types-union-print-nested/types/txt
1666+/* src-481 %jibb /tests/golden/types-union-print-same-origin/source/jibb
1667+/* tok-481 %txt /tests/golden/types-union-print-same-origin/tokens/txt
1668+/* tre-481 %txt /tests/golden/types-union-print-same-origin/tree/txt
1669+/* mod-481-1 %jibb /tests/golden/types-union-print-same-origin/modules/ui/shared/jibb
1670+/* typ-481 %txt /tests/golden/types-union-print-same-origin/types/txt
1671+/* mtre-481 %txt /tests/golden/types-union-print-same-origin/module-trees/txt
1672+/* src-482 %jibb /tests/golden/types-union-print-transitive/source/jibb
1673+/* tok-482 %txt /tests/golden/types-union-print-transitive/tokens/txt
1674+/* tre-482 %txt /tests/golden/types-union-print-transitive/tree/txt
1675+/* mod-482-1 %jibb /tests/golden/types-union-print-transitive/modules/ui/mid/jibb
1676+/* mod-482-2 %jibb /tests/golden/types-union-print-transitive/modules/ui/base/jibb
1677+/* typ-482 %txt /tests/golden/types-union-print-transitive/types/txt
1678+/* mtre-482 %txt /tests/golden/types-union-print-transitive/module-trees/txt
1679+/* src-483 %jibb /tests/golden/types-union-singleton/source/jibb
1680+/* tok-483 %txt /tests/golden/types-union-singleton/tokens/txt
1681+/* tre-483 %txt /tests/golden/types-union-singleton/tree/txt
1682+/* typ-483 %txt /tests/golden/types-union-singleton/types/txt
1683+/* src-484 %jibb /tests/golden/types-union-tag-atoms/source/jibb
1684+/* tok-484 %txt /tests/golden/types-union-tag-atoms/tokens/txt
1685+/* tre-484 %txt /tests/golden/types-union-tag-atoms/tree/txt
1686+/* typ-484 %txt /tests/golden/types-union-tag-atoms/types/txt
1687+/* src-485 %jibb /tests/golden/types-union-tags/source/jibb
1688+/* tok-485 %txt /tests/golden/types-union-tags/tokens/txt
1689+/* tre-485 %txt /tests/golden/types-union-tags/tree/txt
1690+/* typ-485 %txt /tests/golden/types-union-tags/types/txt
1691+/* src-486 %jibb /tests/golden/types-union-unresolved/source/jibb
1692+/* tok-486 %txt /tests/golden/types-union-unresolved/tokens/txt
1693+/* tre-486 %txt /tests/golden/types-union-unresolved/tree/txt
1694+/* typ-486 %txt /tests/golden/types-union-unresolved/types/txt
1695+/* src-487 %jibb /tests/golden/types-union-unresolved-flow/source/jibb
1696+/* tok-487 %txt /tests/golden/types-union-unresolved-flow/tokens/txt
1697+/* tre-487 %txt /tests/golden/types-union-unresolved-flow/tree/txt
1698+/* typ-487 %txt /tests/golden/types-union-unresolved-flow/types/txt
1666|%
1699|%
1667:: one arm per case
1700:: one arm per case
1668::
1701::
@@ -2496,138 +2529,150 @@
2496 (weld (check ~.types-generic-recursive-union src-414 `tok-414 `tre-414) (check-types ~.types-generic-recursive-union ~[%tests %golden ~.types-generic-recursive-union %source %jibb] src-414 `typ-414))
2529 (weld (check ~.types-generic-recursive-union src-414 `tok-414 `tre-414) (check-types ~.types-generic-recursive-union ~[%tests %golden ~.types-generic-recursive-union %source %jibb] src-414 `typ-414))
2497++ test-types-generic-repeated
2530++ test-types-generic-repeated
2498 (weld (check ~.types-generic-repeated src-415 `tok-415 `tre-415) (check-types ~.types-generic-repeated ~[%tests %golden ~.types-generic-repeated %source %jibb] src-415 `typ-415))
2531 (weld (check ~.types-generic-repeated src-415 `tok-415 `tre-415) (check-types ~.types-generic-repeated ~[%tests %golden ~.types-generic-repeated %source %jibb] src-415 `typ-415))
2532+++ test-types-generic-union-capitals
2533+ (weld (check ~.types-generic-union-capitals src-416 `tok-416 `tre-416) (check-types ~.types-generic-union-capitals ~[%tests %golden ~.types-generic-union-capitals %source %jibb] src-416 `typ-416))
2534+++ test-types-generic-union-errors
2535+ (weld (check ~.types-generic-union-errors src-417 `tok-417 `tre-417) (check-types ~.types-generic-union-errors ~[%tests %golden ~.types-generic-union-errors %source %jibb] src-417 `typ-417))
2536+++ test-types-generic-union-escaping
2537+ (weld (weld (check ~.types-generic-union-escaping src-418 `tok-418 `tre-418) (check-module-types ~.types-generic-union-escaping ~[%tests %golden ~.types-generic-union-escaping %source %jibb] src-418 `typ-418 ~ ~ ~[['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-418-1] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-418-2]])) (check-module-trees ~.types-generic-union-escaping `mtre-418 ~[['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-418-1] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-418-2]]))
2538+++ test-types-generic-union-import
2539+ (weld (weld (check ~.types-generic-union-import src-419 `tok-419 `tre-419) (check-module-types ~.types-generic-union-import ~[%tests %golden ~.types-generic-union-import %source %jibb] src-419 `typ-419 ~ ~ ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-419-1] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-419-2]])) (check-module-trees ~.types-generic-union-import `mtre-419 ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-419-1] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-419-2]]))
2540+++ test-types-generic-union-local
2541+ (weld (check ~.types-generic-union-local src-420 `tok-420 `tre-420) (check-types ~.types-generic-union-local ~[%tests %golden ~.types-generic-union-local %source %jibb] src-420 `typ-420))
2542+++ test-types-generic-union-transitive
2543+ (weld (weld (check ~.types-generic-union-transitive src-421 `tok-421 `tre-421) (check-module-types ~.types-generic-union-transitive ~[%tests %golden ~.types-generic-union-transitive %source %jibb] src-421 `typ-421 ~ ~ ~[['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-421-1] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-421-2]])) (check-module-trees ~.types-generic-union-transitive `mtre-421 ~[['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-421-1] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-421-2]]))
2499++ test-types-import-mark
2544++ test-types-import-mark
2500− (weld (check ~.types-import-mark src-416 `tok-416 `tre-416) (check-mark-types ~.types-import-mark ~[%tests %golden ~.types-import-mark %source %jibb] src-416 `typ-416 ~[[%fixture %title imp-416-1]] ~[[%label mark-416-1]]))
2545+ (weld (check ~.types-import-mark src-422 `tok-422 `tre-422) (check-mark-types ~.types-import-mark ~[%tests %golden ~.types-import-mark %source %jibb] src-422 `typ-422 ~[[%fixture %title imp-422-1]] ~[[%label mark-422-1]]))
2501++ test-types-import-mark-record
2546++ test-types-import-mark-record
2502− (weld (check ~.types-import-mark-record src-417 `tok-417 `tre-417) (check-mark-types ~.types-import-mark-record ~[%tests %golden ~.types-import-mark-record %source %jibb] src-417 `typ-417 ~ ~[[%note mark-417-1] [%choice mark-417-2]]))
2547+ (weld (check ~.types-import-mark-record src-423 `tok-423 `tre-423) (check-mark-types ~.types-import-mark-record ~[%tests %golden ~.types-import-mark-record %source %jibb] src-423 `typ-423 ~ ~[[%note mark-423-1] [%choice mark-423-2]]))
2503++ test-types-import-missing-mold
2548++ test-types-import-missing-mold
2504− (weld (check ~.types-import-missing-mold src-418 `tok-418 `tre-418) (check-import-types ~.types-import-missing-mold ~[%tests %golden ~.types-import-missing-mold %source %jibb] src-418 `typ-418 ~[[%fixture %missing imp-418-1]]))
2549+ (weld (check ~.types-import-missing-mold src-424 `tok-424 `tre-424) (check-import-types ~.types-import-missing-mold ~[%tests %golden ~.types-import-missing-mold %source %jibb] src-424 `typ-424 ~[[%fixture %missing imp-424-1]]))
2505++ test-types-import-sur
2550++ test-types-import-sur
2506− (weld (check ~.types-import-sur src-419 `tok-419 `tre-419) (check-import-types ~.types-import-sur ~[%tests %golden ~.types-import-sur %source %jibb] src-419 `typ-419 ~[[%fixture %title imp-419-1] [%fixture %pair imp-419-2]]))
2551+ (weld (check ~.types-import-sur src-425 `tok-425 `tre-425) (check-import-types ~.types-import-sur ~[%tests %golden ~.types-import-sur %source %jibb] src-425 `typ-425 ~[[%fixture %title imp-425-1] [%fixture %pair imp-425-2]]))
2507++ test-types-import-sur-record-graph
2552++ test-types-import-sur-record-graph
2508− (weld (weld (check ~.types-import-sur-record-graph src-420 `tok-420 `tre-420) (check-module-types ~.types-import-sur-record-graph ~[%tests %golden ~.types-import-sur-record-graph %source %jibb] src-420 `typ-420 ~[[%fixture %entry imp-420-1]] ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-420-1]])) (check-module-trees ~.types-import-sur-record-graph `mtre-420 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-420-1]]))
2553+ (weld (weld (check ~.types-import-sur-record-graph src-426 `tok-426 `tre-426) (check-module-types ~.types-import-sur-record-graph ~[%tests %golden ~.types-import-sur-record-graph %source %jibb] src-426 `typ-426 ~[[%fixture %entry imp-426-1]] ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-426-1]])) (check-module-trees ~.types-import-sur-record-graph `mtre-426 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-426-1]]))
2509++ test-types-module-fixtures
2554++ test-types-module-fixtures
2510− (weld (weld (check-at ~.types-module-fixtures ~[~.ui ~.blog ~.index ~.jibb] src-421 `tok-421 `tre-421) (check-module-types ~.types-module-fixtures ~[~.ui ~.blog ~.index ~.jibb] src-421 `typ-421 ~ ~ ~[['/ui/api/blog.jibb' ~[~.ui ~.api ~.blog ~.jibb] mod-421-1] ['/ui/components/card.jibb' ~[~.ui ~.components ~.card ~.jibb] mod-421-2]])) (check-module-trees ~.types-module-fixtures `mtre-421 ~[['/ui/api/blog.jibb' ~[~.ui ~.api ~.blog ~.jibb] mod-421-1] ['/ui/components/card.jibb' ~[~.ui ~.components ~.card ~.jibb] mod-421-2]]))
2555+ (weld (weld (check-at ~.types-module-fixtures ~[~.ui ~.blog ~.index ~.jibb] src-427 `tok-427 `tre-427) (check-module-types ~.types-module-fixtures ~[~.ui ~.blog ~.index ~.jibb] src-427 `typ-427 ~ ~ ~[['/ui/api/blog.jibb' ~[~.ui ~.api ~.blog ~.jibb] mod-427-1] ['/ui/components/card.jibb' ~[~.ui ~.components ~.card ~.jibb] mod-427-2]])) (check-module-trees ~.types-module-fixtures `mtre-427 ~[['/ui/api/blog.jibb' ~[~.ui ~.api ~.blog ~.jibb] mod-427-1] ['/ui/components/card.jibb' ~[~.ui ~.components ~.card ~.jibb] mod-427-2]]))
2511++ test-types-module-mixed
2556++ test-types-module-mixed
2512− (weld (weld (check ~.types-module-mixed src-422 `tok-422 `tre-422) (check-module-types ~.types-module-mixed ~[%tests %golden ~.types-module-mixed %source %jibb] src-422 `typ-422 ~[[%fixture %title imp-422-1]] ~[[%label mark-422-1]] ~[['/ui/helper.jibb' ~[~.ui ~.helper ~.jibb] mod-422-1]])) (check-module-trees ~.types-module-mixed `mtre-422 ~[['/ui/helper.jibb' ~[~.ui ~.helper ~.jibb] mod-422-1]]))
2557+ (weld (weld (check ~.types-module-mixed src-428 `tok-428 `tre-428) (check-module-types ~.types-module-mixed ~[%tests %golden ~.types-module-mixed %source %jibb] src-428 `typ-428 ~[[%fixture %title imp-428-1]] ~[[%label mark-428-1]] ~[['/ui/helper.jibb' ~[~.ui ~.helper ~.jibb] mod-428-1]])) (check-module-trees ~.types-module-mixed `mtre-428 ~[['/ui/helper.jibb' ~[~.ui ~.helper ~.jibb] mod-428-1]]))
2513++ test-types-partial-apply
2558++ test-types-partial-apply
2514− (weld (check ~.types-partial-apply src-423 `tok-423 `tre-423) (check-types ~.types-partial-apply ~[%tests %golden ~.types-partial-apply %source %jibb] src-423 `typ-423))
2559+ (weld (check ~.types-partial-apply src-429 `tok-429 `tre-429) (check-types ~.types-partial-apply ~[%tests %golden ~.types-partial-apply %source %jibb] src-429 `typ-429))
2515++ test-types-partial-atom-alias
2560++ test-types-partial-atom-alias
2516− (weld (check ~.types-partial-atom-alias src-424 `tok-424 `tre-424) (check-types ~.types-partial-atom-alias ~[%tests %golden ~.types-partial-atom-alias %source %jibb] src-424 `typ-424))
2561+ (weld (check ~.types-partial-atom-alias src-430 `tok-430 `tre-430) (check-types ~.types-partial-atom-alias ~[%tests %golden ~.types-partial-atom-alias %source %jibb] src-430 `typ-430))
2517++ test-types-partial-atom-constraint
2562++ test-types-partial-atom-constraint
2518− (weld (check ~.types-partial-atom-constraint src-425 `tok-425 `tre-425) (check-types ~.types-partial-atom-constraint ~[%tests %golden ~.types-partial-atom-constraint %source %jibb] src-425 `typ-425))
2563+ (weld (check ~.types-partial-atom-constraint src-431 `tok-431 `tre-431) (check-types ~.types-partial-atom-constraint ~[%tests %golden ~.types-partial-atom-constraint %source %jibb] src-431 `typ-431))
2519++ test-types-partial-atom-widening
2564++ test-types-partial-atom-widening
2520− (weld (check ~.types-partial-atom-widening src-426 `tok-426 `tre-426) (check-types ~.types-partial-atom-widening ~[%tests %golden ~.types-partial-atom-widening %source %jibb] src-426 `typ-426))
2565+ (weld (check ~.types-partial-atom-widening src-432 `tok-432 `tre-432) (check-types ~.types-partial-atom-widening ~[%tests %golden ~.types-partial-atom-widening %source %jibb] src-432 `typ-432))
2521++ test-types-partial-aura
2566++ test-types-partial-aura
2522− (weld (check ~.types-partial-aura src-427 `tok-427 `tre-427) (check-types ~.types-partial-aura ~[%tests %golden ~.types-partial-aura %source %jibb] src-427 `typ-427))
2567+ (weld (check ~.types-partial-aura src-433 `tok-433 `tre-433) (check-types ~.types-partial-aura ~[%tests %golden ~.types-partial-aura %source %jibb] src-433 `typ-433))
2523++ test-types-partial-aura-family
2568++ test-types-partial-aura-family
2524− (weld (check ~.types-partial-aura-family src-428 `tok-428 `tre-428) (check-types ~.types-partial-aura-family ~[%tests %golden ~.types-partial-aura-family %source %jibb] src-428 `typ-428))
2569+ (weld (check ~.types-partial-aura-family src-434 `tok-434 `tre-434) (check-types ~.types-partial-aura-family ~[%tests %golden ~.types-partial-aura-family %source %jibb] src-434 `typ-434))
2525++ test-types-partial-aura-generalization
2570++ test-types-partial-aura-generalization
2526− (weld (check ~.types-partial-aura-generalization src-429 `tok-429 `tre-429) (check-types ~.types-partial-aura-generalization ~[%tests %golden ~.types-partial-aura-generalization %source %jibb] src-429 `typ-429))
2571+ (weld (check ~.types-partial-aura-generalization src-435 `tok-435 `tre-435) (check-types ~.types-partial-aura-generalization ~[%tests %golden ~.types-partial-aura-generalization %source %jibb] src-435 `typ-435))
2527++ test-types-partial-bare-atom
2572++ test-types-partial-bare-atom
2528− (weld (check ~.types-partial-bare-atom src-430 `tok-430 `tre-430) (check-types ~.types-partial-bare-atom ~[%tests %golden ~.types-partial-bare-atom %source %jibb] src-430 `typ-430))
2573+ (weld (check ~.types-partial-bare-atom src-436 `tok-436 `tre-436) (check-types ~.types-partial-bare-atom ~[%tests %golden ~.types-partial-bare-atom %source %jibb] src-436 `typ-436))
2529++ test-types-partial-branch-widening
2574++ test-types-partial-branch-widening
2530− (weld (check ~.types-partial-branch-widening src-431 `tok-431 `tre-431) (check-types ~.types-partial-branch-widening ~[%tests %golden ~.types-partial-branch-widening %source %jibb] src-431 `typ-431))
2575+ (weld (check ~.types-partial-branch-widening src-437 `tok-437 `tre-437) (check-types ~.types-partial-branch-widening ~[%tests %golden ~.types-partial-branch-widening %source %jibb] src-437 `typ-437))
2531++ test-types-partial-conflicting-sites
2576++ test-types-partial-conflicting-sites
2532− (weld (check ~.types-partial-conflicting-sites src-432 `tok-432 `tre-432) (check-types ~.types-partial-conflicting-sites ~[%tests %golden ~.types-partial-conflicting-sites %source %jibb] src-432 `typ-432))
2577+ (weld (check ~.types-partial-conflicting-sites src-438 `tok-438 `tre-438) (check-types ~.types-partial-conflicting-sites ~[%tests %golden ~.types-partial-conflicting-sites %source %jibb] src-438 `typ-438))
2533++ test-types-partial-decimal-default
2578++ test-types-partial-decimal-default
2534− (weld (check ~.types-partial-decimal-default src-433 `tok-433 `tre-433) (check-types ~.types-partial-decimal-default ~[%tests %golden ~.types-partial-decimal-default %source %jibb] src-433 `typ-433))
2579+ (weld (check ~.types-partial-decimal-default src-439 `tok-439 `tre-439) (check-types ~.types-partial-decimal-default ~[%tests %golden ~.types-partial-decimal-default %source %jibb] src-439 `typ-439))
2535++ test-types-partial-dependency-chain
2580++ test-types-partial-dependency-chain
2536− (weld (check ~.types-partial-dependency-chain src-434 `tok-434 `tre-434) (check-types ~.types-partial-dependency-chain ~[%tests %golden ~.types-partial-dependency-chain %source %jibb] src-434 `typ-434))
2581+ (weld (check ~.types-partial-dependency-chain src-440 `tok-440 `tre-440) (check-types ~.types-partial-dependency-chain ~[%tests %golden ~.types-partial-dependency-chain %source %jibb] src-440 `typ-440))
2537++ test-types-partial-explicit-capital
2582++ test-types-partial-explicit-capital
2538− (weld (check ~.types-partial-explicit-capital src-435 `tok-435 `tre-435) (check-types ~.types-partial-explicit-capital ~[%tests %golden ~.types-partial-explicit-capital %source %jibb] src-435 `typ-435))
2583+ (weld (check ~.types-partial-explicit-capital src-441 `tok-441 `tre-441) (check-types ~.types-partial-explicit-capital ~[%tests %golden ~.types-partial-explicit-capital %source %jibb] src-441 `typ-441))
2539++ test-types-partial-forward
2584++ test-types-partial-forward
2540− (weld (check ~.types-partial-forward src-436 `tok-436 `tre-436) (check-types ~.types-partial-forward ~[%tests %golden ~.types-partial-forward %source %jibb] src-436 `typ-436))
2585+ (weld (check ~.types-partial-forward src-442 `tok-442 `tre-442) (check-types ~.types-partial-forward ~[%tests %golden ~.types-partial-forward %source %jibb] src-442 `typ-442))
2541++ test-types-partial-generalization
2586++ test-types-partial-generalization
2542− (weld (check ~.types-partial-generalization src-437 `tok-437 `tre-437) (check-types ~.types-partial-generalization ~[%tests %golden ~.types-partial-generalization %source %jibb] src-437 `typ-437))
2587+ (weld (check ~.types-partial-generalization src-443 `tok-443 `tre-443) (check-types ~.types-partial-generalization ~[%tests %golden ~.types-partial-generalization %source %jibb] src-443 `typ-443))
2543++ test-types-partial-identity
2588++ test-types-partial-identity
2544− (weld (check ~.types-partial-identity src-438 `tok-438 `tre-438) (check-types ~.types-partial-identity ~[%tests %golden ~.types-partial-identity %source %jibb] src-438 `typ-438))
2589+ (weld (check ~.types-partial-identity src-444 `tok-444 `tre-444) (check-types ~.types-partial-identity ~[%tests %golden ~.types-partial-identity %source %jibb] src-444 `typ-444))
2545++ test-types-partial-independent-atoms
2590++ test-types-partial-independent-atoms
2546− (weld (check ~.types-partial-independent-atoms src-439 `tok-439 `tre-439) (check-types ~.types-partial-independent-atoms ~[%tests %golden ~.types-partial-independent-atoms %source %jibb] src-439 `typ-439))
2591+ (weld (check ~.types-partial-independent-atoms src-445 `tok-445 `tre-445) (check-types ~.types-partial-independent-atoms ~[%tests %golden ~.types-partial-independent-atoms %source %jibb] src-445 `typ-445))
2547++ test-types-partial-local-molds
2592++ test-types-partial-local-molds
2548− (weld (check ~.types-partial-local-molds src-440 `tok-440 `tre-440) (check-types ~.types-partial-local-molds ~[%tests %golden ~.types-partial-local-molds %source %jibb] src-440 `typ-440))
2593+ (weld (check ~.types-partial-local-molds src-446 `tok-446 `tre-446) (check-types ~.types-partial-local-molds ~[%tests %golden ~.types-partial-local-molds %source %jibb] src-446 `typ-446))
2549++ test-types-partial-locals
2594++ test-types-partial-locals
2550− (weld (check ~.types-partial-locals src-441 `tok-441 `tre-441) (check-types ~.types-partial-locals ~[%tests %golden ~.types-partial-locals %source %jibb] src-441 `typ-441))
2595+ (weld (check ~.types-partial-locals src-447 `tok-447 `tre-447) (check-types ~.types-partial-locals ~[%tests %golden ~.types-partial-locals %source %jibb] src-447 `typ-447))
2551++ test-types-partial-many-atom-constraints
2596++ test-types-partial-many-atom-constraints
2552− (weld (check ~.types-partial-many-atom-constraints src-442 `tok-442 `tre-442) (check-types ~.types-partial-many-atom-constraints ~[%tests %golden ~.types-partial-many-atom-constraints %source %jibb] src-442 `typ-442))
2597+ (weld (check ~.types-partial-many-atom-constraints src-448 `tok-448 `tre-448) (check-types ~.types-partial-many-atom-constraints ~[%tests %golden ~.types-partial-many-atom-constraints %source %jibb] src-448 `typ-448))
2553++ test-types-partial-mold-bare-aura
2598++ test-types-partial-mold-bare-aura
2554− (weld (check ~.types-partial-mold-bare-aura src-443 `tok-443 `tre-443) (check-types ~.types-partial-mold-bare-aura ~[%tests %golden ~.types-partial-mold-bare-aura %source %jibb] src-443 `typ-443))
2599+ (weld (check ~.types-partial-mold-bare-aura src-449 `tok-449 `tre-449) (check-types ~.types-partial-mold-bare-aura ~[%tests %golden ~.types-partial-mold-bare-aura %source %jibb] src-449 `typ-449))
2555++ test-types-partial-mold-composite
2600++ test-types-partial-mold-composite
2556− (weld (check ~.types-partial-mold-composite src-444 `tok-444 `tre-444) (check-types ~.types-partial-mold-composite ~[%tests %golden ~.types-partial-mold-composite %source %jibb] src-444 `typ-444))
2601+ (weld (check ~.types-partial-mold-composite src-450 `tok-450 `tre-450) (check-types ~.types-partial-mold-composite ~[%tests %golden ~.types-partial-mold-composite %source %jibb] src-450 `typ-450))
2557++ test-types-partial-mold-forward
2602++ test-types-partial-mold-forward
2558− (weld (check ~.types-partial-mold-forward src-445 `tok-445 `tre-445) (check-types ~.types-partial-mold-forward ~[%tests %golden ~.types-partial-mold-forward %source %jibb] src-445 `typ-445))
2603+ (weld (check ~.types-partial-mold-forward src-451 `tok-451 `tre-451) (check-types ~.types-partial-mold-forward ~[%tests %golden ~.types-partial-mold-forward %source %jibb] src-451 `typ-451))
2559++ test-types-partial-mold-recursive
2604++ test-types-partial-mold-recursive
2560− (weld (check ~.types-partial-mold-recursive src-446 `tok-446 `tre-446) (check-types ~.types-partial-mold-recursive ~[%tests %golden ~.types-partial-mold-recursive %source %jibb] src-446 `typ-446))
2605+ (weld (check ~.types-partial-mold-recursive src-452 `tok-452 `tre-452) (check-types ~.types-partial-mold-recursive ~[%tests %golden ~.types-partial-mold-recursive %source %jibb] src-452 `typ-452))
2561++ test-types-partial-occurs
2606++ test-types-partial-occurs
2562− (weld (check ~.types-partial-occurs src-447 `tok-447 `tre-447) (check-types ~.types-partial-occurs ~[%tests %golden ~.types-partial-occurs %source %jibb] src-447 `typ-447))
2607+ (weld (check ~.types-partial-occurs src-453 `tok-453 `tre-453) (check-types ~.types-partial-occurs ~[%tests %golden ~.types-partial-occurs %source %jibb] src-453 `typ-453))
2563++ test-types-partial-projection
2608++ test-types-partial-projection
2564− (weld (check ~.types-partial-projection src-448 `tok-448 `tre-448) (check-types ~.types-partial-projection ~[%tests %golden ~.types-partial-projection %source %jibb] src-448 `typ-448))
2609+ (weld (check ~.types-partial-projection src-454 `tok-454 `tre-454) (check-types ~.types-partial-projection ~[%tests %golden ~.types-partial-projection %source %jibb] src-454 `typ-454))
2565++ test-types-partial-shadow-global
2610++ test-types-partial-shadow-global
2566− (weld (check ~.types-partial-shadow-global src-449 `tok-449 `tre-449) (check-types ~.types-partial-shadow-global ~[%tests %golden ~.types-partial-shadow-global %source %jibb] src-449 `typ-449))
2611+ (weld (check ~.types-partial-shadow-global src-455 `tok-455 `tre-455) (check-types ~.types-partial-shadow-global ~[%tests %golden ~.types-partial-shadow-global %source %jibb] src-455 `typ-455))
2567++ test-types-partial-shared-tvar
2612++ test-types-partial-shared-tvar
2568− (weld (check ~.types-partial-shared-tvar src-450 `tok-450 `tre-450) (check-types ~.types-partial-shared-tvar ~[%tests %golden ~.types-partial-shared-tvar %source %jibb] src-450 `typ-450))
2613+ (weld (check ~.types-partial-shared-tvar src-456 `tok-456 `tre-456) (check-types ~.types-partial-shared-tvar ~[%tests %golden ~.types-partial-shared-tvar %source %jibb] src-456 `typ-456))
2569++ test-types-partial-union-cases
2614++ test-types-partial-union-cases
2570− (weld (check ~.types-partial-union-cases src-451 `tok-451 `tre-451) (check-types ~.types-partial-union-cases ~[%tests %golden ~.types-partial-union-cases %source %jibb] src-451 `typ-451))
2615+ (weld (check ~.types-partial-union-cases src-457 `tok-457 `tre-457) (check-types ~.types-partial-union-cases ~[%tests %golden ~.types-partial-union-cases %source %jibb] src-457 `typ-457))
2571++ test-types-partial-union-edges
2616++ test-types-partial-union-edges
2572− (weld (check ~.types-partial-union-edges src-452 `tok-452 `tre-452) (check-types ~.types-partial-union-edges ~[%tests %golden ~.types-partial-union-edges %source %jibb] src-452 `typ-452))
2617+ (weld (check ~.types-partial-union-edges src-458 `tok-458 `tre-458) (check-types ~.types-partial-union-edges ~[%tests %golden ~.types-partial-union-edges %source %jibb] src-458 `typ-458))
2573++ test-types-partial-unresolved-tag
2618++ test-types-partial-unresolved-tag
2574− (weld (check ~.types-partial-unresolved-tag src-453 `tok-453 `tre-453) (check-types ~.types-partial-unresolved-tag ~[%tests %golden ~.types-partial-unresolved-tag %source %jibb] src-453 `typ-453))
2619+ (weld (check ~.types-partial-unresolved-tag src-459 `tok-459 `tre-459) (check-types ~.types-partial-unresolved-tag ~[%tests %golden ~.types-partial-unresolved-tag %source %jibb] src-459 `typ-459))
2575++ test-types-record-bound-variable
2620++ test-types-record-bound-variable
2576− (weld (check ~.types-record-bound-variable src-454 `tok-454 `tre-454) (check-types ~.types-record-bound-variable ~[%tests %golden ~.types-record-bound-variable %source %jibb] src-454 `typ-454))
2621+ (weld (check ~.types-record-bound-variable src-460 `tok-460 `tre-460) (check-types ~.types-record-bound-variable ~[%tests %golden ~.types-record-bound-variable %source %jibb] src-460 `typ-460))
2577++ test-types-record-faces
2622++ test-types-record-faces
2578− (weld (check ~.types-record-faces src-455 `tok-455 `tre-455) (check-types ~.types-record-faces ~[%tests %golden ~.types-record-faces %source %jibb] src-455 `typ-455))
2623+ (weld (check ~.types-record-faces src-461 `tok-461 `tre-461) (check-types ~.types-record-faces ~[%tests %golden ~.types-record-faces %source %jibb] src-461 `typ-461))
2579++ test-types-record-import
2624++ test-types-record-import
2580− (weld (weld (check ~.types-record-import src-456 `tok-456 `tre-456) (check-module-types ~.types-record-import ~[%tests %golden ~.types-record-import %source %jibb] src-456 `typ-456 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-456-1]])) (check-module-trees ~.types-record-import `mtre-456 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-456-1]]))
2625+ (weld (weld (check ~.types-record-import src-462 `tok-462 `tre-462) (check-module-types ~.types-record-import ~[%tests %golden ~.types-record-import %source %jibb] src-462 `typ-462 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-462-1]])) (check-module-trees ~.types-record-import `mtre-462 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-462-1]]))
2581++ test-types-record-local-scheme
2626++ test-types-record-local-scheme
2582− (weld (check ~.types-record-local-scheme src-457 `tok-457 `tre-457) (check-types ~.types-record-local-scheme ~[%tests %golden ~.types-record-local-scheme %source %jibb] src-457 `typ-457))
2627+ (weld (check ~.types-record-local-scheme src-463 `tok-463 `tre-463) (check-types ~.types-record-local-scheme ~[%tests %golden ~.types-record-local-scheme %source %jibb] src-463 `typ-463))
2583++ test-types-record-nested
2628++ test-types-record-nested
2584− (weld (check ~.types-record-nested src-458 `tok-458 `tre-458) (check-types ~.types-record-nested ~[%tests %golden ~.types-record-nested %source %jibb] src-458 `typ-458))
2629+ (weld (check ~.types-record-nested src-464 `tok-464 `tre-464) (check-types ~.types-record-nested ~[%tests %golden ~.types-record-nested %source %jibb] src-464 `typ-464))
2585++ test-types-record-to-tuple
2630++ test-types-record-to-tuple
2586− (weld (check ~.types-record-to-tuple src-459 `tok-459 `tre-459) (check-types ~.types-record-to-tuple ~[%tests %golden ~.types-record-to-tuple %source %jibb] src-459 `typ-459))
2631+ (weld (check ~.types-record-to-tuple src-465 `tok-465 `tre-465) (check-types ~.types-record-to-tuple ~[%tests %golden ~.types-record-to-tuple %source %jibb] src-465 `typ-465))
2587++ test-types-union-alias
2632++ test-types-union-alias
2588− (weld (check ~.types-union-alias src-460 `tok-460 `tre-460) (check-types ~.types-union-alias ~[%tests %golden ~.types-union-alias %source %jibb] src-460 `typ-460))
2633+ (weld (check ~.types-union-alias src-466 `tok-466 `tre-466) (check-types ~.types-union-alias ~[%tests %golden ~.types-union-alias %source %jibb] src-466 `typ-466))
2589++ test-types-union-branch-context
2634++ test-types-union-branch-context
2590− (weld (check ~.types-union-branch-context src-461 `tok-461 `tre-461) (check-types ~.types-union-branch-context ~[%tests %golden ~.types-union-branch-context %source %jibb] src-461 `typ-461))
2635+ (weld (check ~.types-union-branch-context src-467 `tok-467 `tre-467) (check-types ~.types-union-branch-context ~[%tests %golden ~.types-union-branch-context %source %jibb] src-467 `typ-467))
2591++ test-types-union-branch-pending
2636++ test-types-union-branch-pending
2592− (weld (check ~.types-union-branch-pending src-462 `tok-462 `tre-462) (check-types ~.types-union-branch-pending ~[%tests %golden ~.types-union-branch-pending %source %jibb] src-462 `typ-462))
2637+ (weld (check ~.types-union-branch-pending src-468 `tok-468 `tre-468) (check-types ~.types-union-branch-pending ~[%tests %golden ~.types-union-branch-pending %source %jibb] src-468 `typ-468))
2593++ test-types-union-constructor-shape
2638++ test-types-union-constructor-shape
2594− (weld (check ~.types-union-constructor-shape src-463 `tok-463 `tre-463) (check-types ~.types-union-constructor-shape ~[%tests %golden ~.types-union-constructor-shape %source %jibb] src-463 `typ-463))
2639+ (weld (check ~.types-union-constructor-shape src-469 `tok-469 `tre-469) (check-types ~.types-union-constructor-shape ~[%tests %golden ~.types-union-constructor-shape %source %jibb] src-469 `typ-469))
2595++ test-types-union-context-flow
2640++ test-types-union-context-flow
2596− (weld (check ~.types-union-context-flow src-464 `tok-464 `tre-464) (check-types ~.types-union-context-flow ~[%tests %golden ~.types-union-context-flow %source %jibb] src-464 `typ-464))
2641+ (weld (check ~.types-union-context-flow src-470 `tok-470 `tre-470) (check-types ~.types-union-context-flow ~[%tests %golden ~.types-union-context-flow %source %jibb] src-470 `typ-470))
2597++ test-types-union-import
2642++ test-types-union-import
2598− (weld (weld (check ~.types-union-import src-465 `tok-465 `tre-465) (check-module-types ~.types-union-import ~[%tests %golden ~.types-union-import %source %jibb] src-465 `typ-465 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-465-1]])) (check-module-trees ~.types-union-import `mtre-465 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-465-1]]))
2643+ (weld (weld (check ~.types-union-import src-471 `tok-471 `tre-471) (check-module-types ~.types-union-import ~[%tests %golden ~.types-union-import %source %jibb] src-471 `typ-471 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-471-1]])) (check-module-trees ~.types-union-import `mtre-471 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-471-1]]))
2599++ test-types-union-local-pending
2644++ test-types-union-local-pending
2600− (weld (check ~.types-union-local-pending src-466 `tok-466 `tre-466) (check-types ~.types-union-local-pending ~[%tests %golden ~.types-union-local-pending %source %jibb] src-466 `typ-466))
2645+ (weld (check ~.types-union-local-pending src-472 `tok-472 `tre-472) (check-types ~.types-union-local-pending ~[%tests %golden ~.types-union-local-pending %source %jibb] src-472 `typ-472))
2601++ test-types-union-overlap
2646++ test-types-union-overlap
2602− (weld (check ~.types-union-overlap src-467 `tok-467 `tre-467) (check-types ~.types-union-overlap ~[%tests %golden ~.types-union-overlap %source %jibb] src-467 `typ-467))
2647+ (weld (check ~.types-union-overlap src-473 `tok-473 `tre-473) (check-types ~.types-union-overlap ~[%tests %golden ~.types-union-overlap %source %jibb] src-473 `typ-473))
2603++ test-types-union-overlap-nested
2648++ test-types-union-overlap-nested
2604− (weld (check ~.types-union-overlap-nested src-468 `tok-468 `tre-468) (check-types ~.types-union-overlap-nested ~[%tests %golden ~.types-union-overlap-nested %source %jibb] src-468 `typ-468))
2649+ (weld (check ~.types-union-overlap-nested src-474 `tok-474 `tre-474) (check-types ~.types-union-overlap-nested ~[%tests %golden ~.types-union-overlap-nested %source %jibb] src-474 `typ-474))
2605++ test-types-union-phantom-generic
2650++ test-types-union-phantom-generic
2606− (weld (check ~.types-union-phantom-generic src-469 `tok-469 `tre-469) (check-types ~.types-union-phantom-generic ~[%tests %golden ~.types-union-phantom-generic %source %jibb] src-469 `typ-469))
2651+ (weld (check ~.types-union-phantom-generic src-475 `tok-475 `tre-475) (check-types ~.types-union-phantom-generic ~[%tests %golden ~.types-union-phantom-generic %source %jibb] src-475 `typ-475))
2607++ test-types-union-print-cross-namespace
2652++ test-types-union-print-cross-namespace
2608− (weld (weld (check ~.types-union-print-cross-namespace src-470 `tok-470 `tre-470) (check-module-types ~.types-union-print-cross-namespace ~[%tests %golden ~.types-union-print-cross-namespace %source %jibb] src-470 `typ-470 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-470-1]])) (check-module-trees ~.types-union-print-cross-namespace `mtre-470 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-470-1]]))
2653+ (weld (weld (check ~.types-union-print-cross-namespace src-476 `tok-476 `tre-476) (check-module-types ~.types-union-print-cross-namespace ~[%tests %golden ~.types-union-print-cross-namespace %source %jibb] src-476 `typ-476 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-476-1]])) (check-module-trees ~.types-union-print-cross-namespace `mtre-476 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-476-1]]))
2609++ test-types-union-print-distinct
2654++ test-types-union-print-distinct
2610− (weld (weld (check ~.types-union-print-distinct src-471 `tok-471 `tre-471) (check-module-types ~.types-union-print-distinct ~[%tests %golden ~.types-union-print-distinct %source %jibb] src-471 `typ-471 ~ ~ ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-471-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-471-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-471-3]])) (check-module-trees ~.types-union-print-distinct `mtre-471 ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-471-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-471-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-471-3]]))
2655+ (weld (weld (check ~.types-union-print-distinct src-477 `tok-477 `tre-477) (check-module-types ~.types-union-print-distinct ~[%tests %golden ~.types-union-print-distinct %source %jibb] src-477 `typ-477 ~ ~ ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-477-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-477-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-477-3]])) (check-module-trees ~.types-union-print-distinct `mtre-477 ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-477-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-477-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-477-3]]))
2611++ test-types-union-print-escape
2656++ test-types-union-print-escape
2612− (weld (check ~.types-union-print-escape src-472 `tok-472 `tre-472) (check-types ~.types-union-print-escape ~[%tests %golden ~.types-union-print-escape %source %jibb] src-472 `typ-472))
2657+ (weld (check ~.types-union-print-escape src-478 `tok-478 `tre-478) (check-types ~.types-union-print-escape ~[%tests %golden ~.types-union-print-escape %source %jibb] src-478 `typ-478))
2613++ test-types-union-print-local
2658++ test-types-union-print-local
2614− (weld (check ~.types-union-print-local src-473 `tok-473 `tre-473) (check-types ~.types-union-print-local ~[%tests %golden ~.types-union-print-local %source %jibb] src-473 `typ-473))
2659+ (weld (check ~.types-union-print-local src-479 `tok-479 `tre-479) (check-types ~.types-union-print-local ~[%tests %golden ~.types-union-print-local %source %jibb] src-479 `typ-479))
2615++ test-types-union-print-nested
2660++ test-types-union-print-nested
2616− (weld (check ~.types-union-print-nested src-474 `tok-474 `tre-474) (check-types ~.types-union-print-nested ~[%tests %golden ~.types-union-print-nested %source %jibb] src-474 `typ-474))
2661+ (weld (check ~.types-union-print-nested src-480 `tok-480 `tre-480) (check-types ~.types-union-print-nested ~[%tests %golden ~.types-union-print-nested %source %jibb] src-480 `typ-480))
2617++ test-types-union-print-same-origin
2662++ test-types-union-print-same-origin
2618− (weld (weld (check ~.types-union-print-same-origin src-475 `tok-475 `tre-475) (check-module-types ~.types-union-print-same-origin ~[%tests %golden ~.types-union-print-same-origin %source %jibb] src-475 `typ-475 ~ ~ ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-475-1]])) (check-module-trees ~.types-union-print-same-origin `mtre-475 ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-475-1]]))
2663+ (weld (weld (check ~.types-union-print-same-origin src-481 `tok-481 `tre-481) (check-module-types ~.types-union-print-same-origin ~[%tests %golden ~.types-union-print-same-origin %source %jibb] src-481 `typ-481 ~ ~ ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-481-1]])) (check-module-trees ~.types-union-print-same-origin `mtre-481 ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-481-1]]))
2619++ test-types-union-print-transitive
2664++ test-types-union-print-transitive
2620− (weld (weld (check ~.types-union-print-transitive src-476 `tok-476 `tre-476) (check-module-types ~.types-union-print-transitive ~[%tests %golden ~.types-union-print-transitive %source %jibb] src-476 `typ-476 ~ ~ ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-476-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-476-2]])) (check-module-trees ~.types-union-print-transitive `mtre-476 ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-476-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-476-2]]))
2665+ (weld (weld (check ~.types-union-print-transitive src-482 `tok-482 `tre-482) (check-module-types ~.types-union-print-transitive ~[%tests %golden ~.types-union-print-transitive %source %jibb] src-482 `typ-482 ~ ~ ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-482-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-482-2]])) (check-module-trees ~.types-union-print-transitive `mtre-482 ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-482-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-482-2]]))
2621++ test-types-union-singleton
2666++ test-types-union-singleton
2622− (weld (check ~.types-union-singleton src-477 `tok-477 `tre-477) (check-types ~.types-union-singleton ~[%tests %golden ~.types-union-singleton %source %jibb] src-477 `typ-477))
2667+ (weld (check ~.types-union-singleton src-483 `tok-483 `tre-483) (check-types ~.types-union-singleton ~[%tests %golden ~.types-union-singleton %source %jibb] src-483 `typ-483))
2623++ test-types-union-tag-atoms
2668++ test-types-union-tag-atoms
2624− (weld (check ~.types-union-tag-atoms src-478 `tok-478 `tre-478) (check-types ~.types-union-tag-atoms ~[%tests %golden ~.types-union-tag-atoms %source %jibb] src-478 `typ-478))
2669+ (weld (check ~.types-union-tag-atoms src-484 `tok-484 `tre-484) (check-types ~.types-union-tag-atoms ~[%tests %golden ~.types-union-tag-atoms %source %jibb] src-484 `typ-484))
2625++ test-types-union-tags
2670++ test-types-union-tags
2626− (weld (check ~.types-union-tags src-479 `tok-479 `tre-479) (check-types ~.types-union-tags ~[%tests %golden ~.types-union-tags %source %jibb] src-479 `typ-479))
2671+ (weld (check ~.types-union-tags src-485 `tok-485 `tre-485) (check-types ~.types-union-tags ~[%tests %golden ~.types-union-tags %source %jibb] src-485 `typ-485))
2627++ test-types-union-unresolved
2672++ test-types-union-unresolved
2628− (weld (check ~.types-union-unresolved src-480 `tok-480 `tre-480) (check-types ~.types-union-unresolved ~[%tests %golden ~.types-union-unresolved %source %jibb] src-480 `typ-480))
2673+ (weld (check ~.types-union-unresolved src-486 `tok-486 `tre-486) (check-types ~.types-union-unresolved ~[%tests %golden ~.types-union-unresolved %source %jibb] src-486 `typ-486))
2629++ test-types-union-unresolved-flow
2674++ test-types-union-unresolved-flow
2630− (weld (check ~.types-union-unresolved-flow src-481 `tok-481 `tre-481) (check-types ~.types-union-unresolved-flow ~[%tests %golden ~.types-union-unresolved-flow %source %jibb] src-481 `typ-481))
2675+ (weld (check ~.types-union-unresolved-flow src-487 `tok-487 `tre-487) (check-types ~.types-union-unresolved-flow ~[%tests %golden ~.types-union-unresolved-flow %source %jibb] src-487 `typ-487))
2631::
2676::
2632:: +check: run golden:jibb on a case and compare both outputs
2677:: +check: run golden:jibb on a case and compare both outputs
2633::
2678::
tools/importer-test+1−1
@@ -34,4 +34,4 @@ if result.stdout != expected:
34 result.stdout.decode().splitlines(keepends=True),
34 result.stdout.decode().splitlines(keepends=True),
35 fromfile='expected tree.txt', tofile='actual types'))
35 fromfile='expected tree.txt', tofile='actual types'))
36 sys.exit(1)
36 sys.exit(1)
37−print('importer golden: 140 projections passed')
37+print('importer golden: 141 projections passed')