on master help sign in
Infer supported library import graphs
529736aiko
README.md+1−1
@@ -16,7 +16,7 @@ Milestone 1 of the doc's eight, the parser and the `%jibb` mark, is done; milest
16
16
17## Golden tests
17## Golden tests
18
18
19−Each case, `tests/golden/<case>/`, holds `source.jibb`, `about.txt` (where it comes from, what it tests, the expected outcome), and the expected outputs: `tokens.txt` from the layout pass and `tree.txt` from the parser. A file holds the output plus one trailing newline. A case may also have a `path.txt` specifying its logical `/ui/.../*.jibb` path. An `expect-types:` line in `about.txt` opts it into the provisional `golden-types` checker output in `types.txt`; `--update` creates it. A case can select Hoon molds in `imports.txt` and provide each module in `sur/<module>.txt`, or select marks in `marks.txt` and provide their source in `mar/<name>.txt`. `modules.txt` selects Jibb source fixtures, currently parsed but not typechecked; their trees go in `module-trees.txt`. See [docs/development.md](docs/development.md).
19+Each case, `tests/golden/<case>/`, holds `source.jibb`, `about.txt` (where it comes from, what it tests, the expected outcome), and the expected outputs: `tokens.txt` from the layout pass and `tree.txt` from the parser. A file holds the output plus one trailing newline. A case may also have a `path.txt` specifying its logical `/ui/.../*.jibb` path. An `expect-types:` line in `about.txt` opts it into the provisional `golden-types` checker output in `types.txt`; `--update` creates it. A case can select Hoon molds in `imports.txt` and provide each module in `sur/<module>.txt`, or select marks in `marks.txt` and provide their source in `mar/<name>.txt`. `modules.txt` selects Jibb source fixtures; their trees go in `module-trees.txt`, and the partial checker can resolve a subset of library imports. See [docs/development.md](docs/development.md).
20
20
21Run them without a ship. This needs `urbit` on PATH and Python 3.
21Run them without a ship. This needs `urbit` on PATH and Python 3.
22
22
docs/compiler.md+2−2
@@ -58,11 +58,11 @@ The core is split into chapters, `+| %name`, in this order:
58
58
59The inference fragment supports fixed auras, unrestricted `@`, one-way widening into it and toward aura-family ancestors, generic variables and gates, unfaced cells, 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. Recursive local groups, and recursive, generic, union or faced local molds 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, its imports, faces, general patterns, deferred constraints, recursive or generic 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 `@`; 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.
59The inference fragment supports fixed auras, unrestricted `@`, one-way widening into it and toward aura-family ancestors, generic variables and gates, unfaced cells, 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. Recursive local groups, and recursive, generic, union or faced local molds 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, its imports, faces, general patterns, deferred constraints, recursive or generic 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 `@`; 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−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. Nested `$^`, other nested ordered maps, general source-level disjointness and complete integration with the checker remain unfinished. `+golden-types-imports` can consume fixed-aura atoms and unfaced cells 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.
61+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. Nested `$^`, including `$^` in collection arguments, is rejected until its source branches can be checked; other nested ordered maps, general source-level disjointness and complete integration with the checker remain unfinished. `+golden-types-imports` can consume fixed-aura atoms and unfaced cells 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.
62
62
63Callers 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.
63Callers 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.
64
64
65−`+golden-types-with-modules` accepts case-local Jibb module sources alongside `/sur` and mark results. It identifies whether each declared `/=` has a supplied source, but does not resolve or typecheck the imported module yet.
65+`+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, exporting supported closed value schemes and simple 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.
66
66
67And the design notes:
67And the design notes:
68
68
docs/development.md+5−3
@@ -62,6 +62,7 @@ git clone https://github.com/urbit/tools /root/src/tools
62| `tools/importer-test` | Compares the partial Hoon importer's diagnostic trees and errors with `tests/importer/tree.txt` under `urbit eval` |
62| `tools/importer-test` | Compares the partial Hoon importer's diagnostic trees and errors with `tests/importer/tree.txt` under `urbit eval` |
63| `tools/type-import-test` | Composes the Hoon importer with the partial checker and compares `tests/type-import/expected.txt` under eval |
63| `tools/type-import-test` | Composes the Hoon importer with the partial checker and compares `tests/type-import/expected.txt` under eval |
64| `tools/type-mark-test` | Checks the partial checker’s mark import boundary against `tests/type-mark/expected.txt` under eval |
64| `tools/type-mark-test` | Checks the partial checker’s mark import boundary against `tests/type-mark/expected.txt` under eval |
65+| `tools/type-module-scope-test` | Checks the partial module checker’s prelude boundary against `tests/type-module-scope/expected.txt` under eval |
65| `tools/clay-fixtures` | Syncs `my-app`, builds its example `/sur` files and marks through Clay, checks selected mold and mark projections and the partial checker, and records Ford and mark subject shapes on the fake ship |
66| `tools/clay-fixtures` | Syncs `my-app`, builds its example `/sur` files and marks through Clay, checks selected mold and mark projections and the partial checker, and records Ford and mark subject shapes on the fake ship |
66| `tools/hoon` | Evaluates Hoon with the library in scope, as `tools/hoon '(golden /a/b/jibb (crip "++ main view"))'`; `--cord name=file` binds a file's text, `-f` reads the expression from a file |
67| `tools/hoon` | Evaluates Hoon with the library in scope, as `tools/hoon '(golden /a/b/jibb (crip "++ main view"))'`; `--cord name=file` binds a file's text, `-f` reads the expression from a file |
67| `tools/doc-blocks` | Checks the doc's `jibb` blocks against the `doc-*` golden cases: `tools/doc-blocks docs/spec` |
68| `tools/doc-blocks` | Checks the doc's `jibb` blocks against the `doc-*` golden cases: `tools/doc-blocks docs/spec` |
@@ -78,8 +79,9 @@ tools/golden # all cases pass
78tools/importer-test # Hoon importer fixture projections match
79tools/importer-test # Hoon importer fixture projections match
79tools/type-import-test # importer/checker bridge golden report matches
80tools/type-import-test # importer/checker bridge golden report matches
80tools/type-mark-test # mark/checker bridge golden report matches
81tools/type-mark-test # mark/checker bridge golden report matches
82+tools/type-module-scope-test # module/prelude scope golden report matches
81tools/hoon check-spans-test # prints <<>>
83tools/hoon check-spans-test # prints <<>>
82−tools/testdata/selftest # 21 checks, 0 failed
84+tools/testdata/selftest # 22 checks, 0 failed
83tools/doc-blocks docs/spec # every jibb block has its case
85tools/doc-blocks docs/spec # every jibb block has its case
84tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
86tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
85tools/ship test # the cases pass as -test arms on the ship
87tools/ship test # the cases pass as -test arms on the ship
@@ -88,7 +90,7 @@ tools/ship check-commit # when the mark or the desks changed
88tools/clay-fixtures # when the my-app Hoon fixtures or importer changed
90tools/clay-fixtures # when the my-app Hoon fixtures or importer changed
89```
91```
90
92
91−`tools/ship test` regenerates `tests/lib/jibb.hoon` and syncs the `jibb-dev` desk before it runs, so commit the regenerated file. A run with `--stub`, `--lib`, or a custom `--golden` isolates its generated golden tests from the repository's other test programs; run the default command afterward to restore and test those programs. It also runs the independent `tests/lib/jibb-import.hoon` test against the same importer fixtures and expected diagnostic projection as `tools/importer-test`. The projection is an internal tree, not the Jibb type printer. `tests/lib/jibb-bridge.hoon` also runs the importer/checker bridge fixture on the ship; `tools/type-import-test` runs the same report under eval. The mark bridge has its own `tests/lib/jibb-mark-bridge.hoon` ship test and `tools/type-mark-test` eval test; both compare the same fixture report.
93+`tools/ship test` regenerates `tests/lib/jibb.hoon` and syncs the `jibb-dev` desk before it runs, so commit the regenerated file. A run with `--stub`, `--lib`, or a custom `--golden` isolates its generated golden tests from the repository's other test programs; run the default command afterward to restore and test those programs. It also runs the independent `tests/lib/jibb-import.hoon` test against the same importer fixtures and expected diagnostic projection as `tools/importer-test`. The projection is an internal tree, not the Jibb type printer. `tests/lib/jibb-bridge.hoon` also runs the importer/checker bridge fixture on the ship; `tools/type-import-test` runs the same report under eval. The mark bridge has its own `tests/lib/jibb-mark-bridge.hoon` ship test and `tools/type-mark-test` eval test; both compare the same fixture report. `tests/lib/jibb-module-scope.hoon` and `tools/type-module-scope-test` compare the prelude scope report on the ship and under eval.
92
94
93## Golden cases
95## Golden cases
94
96
@@ -100,7 +102,7 @@ A case is a folder `tests/golden/<name>/` holding:
100- optionally, `path.txt`, the logical `/ui/.../*.jibb` path to pass to the compiler; the source remains `source.jibb`.
102- optionally, `path.txt`, the logical `/ui/.../*.jibb` path to pass to the compiler; the source remains `source.jibb`.
101- optionally, an `expect-types:` line in `about.txt` opts the case into `+golden-types`; `types.txt` holds its output plus one newline and `--update` creates it. A `types.txt` also opts in when the line is absent. This interface is provisional while the checker is under construction.
103- optionally, an `expect-types:` line in `about.txt` opts the case into `+golden-types`; `types.txt` holds its output plus one newline and `--update` creates it. A `types.txt` also opts in when the line is absent. This interface is provisional while the checker is under construction.
102- optionally, `imports.txt` selects Hoon `/sur` molds, one `module mold` pair per line. Each module's source goes in `sur/<module>.txt` and is compiled against zuse by both runners. `marks.txt` selects marks, one name per line, with source in `mar/<name>.txt`; both kinds may be supplied together. The reader results go to the partial checker, and a type output is required. Both runners reconstruct fixture text from `%txt` lines and identify the fixture if its compilation crashes; a crash fails the case without discarding its successful parse output. These fixtures currently handle only sources without Ford imports.
104- optionally, `imports.txt` selects Hoon `/sur` molds, one `module mold` pair per line. Each module's source goes in `sur/<module>.txt` and is compiled against zuse by both runners. `marks.txt` selects marks, one name per line, with source in `mar/<name>.txt`; both kinds may be supplied together. The reader results go to the partial checker, and a type output is required. Both runners reconstruct fixture text from `%txt` lines and identify the fixture if its compilation crashes; a crash fails the case without discarding its successful parse output. These fixtures currently handle only sources without Ford imports.
103−- optionally, `modules.txt` lists logical `/ui/.../*.jibb` paths, one per line. The corresponding sources live below the case's `modules/ui/` directory. Both runners parse each source at its logical path and compare the combined `module-trees.txt`; `--update` writes that output. A case with type output also supplies these sources to the partial checker, which reports Jibb module imports as unsupported; it does not resolve or typecheck them yet.
105+- optionally, `modules.txt` lists logical `/ui/.../*.jibb` paths, one per line. The corresponding sources live below the case's `modules/ui/` directory. Both runners parse each source at its logical path and compare the combined `module-trees.txt`; `--update` writes that output. A case with type output also supplies these sources and the vendored prelude source to the partial module checker, so it can reserve prelude names. The file opts in even when it lists no sources; use a comment such as `# no module fixtures` for an empty bundle, since zero-byte `%txt` fixtures do not sync reliably on the ship. Blank lines and comment lines are ignored. The checker is partial; its output says what it did and did not check.
104
106
105A zero-byte mark fixture currently fails ship synchronization validation after commit. Use a newline-only fixture to test an empty Hoon source on the ship.
107A zero-byte mark fixture currently fails ship synchronization validation after commit. Use a newline-only fixture to test an empty Hoon source on the ship.
106
108
docs/prelude-inventory.md+2
@@ -43,6 +43,8 @@ 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`, `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.
47+
46## 2c
48## 2c
47
49
48`bex`, `can`, `cat`, `cut`, `end`, `fil`, `hew`, `lsh`, `met`, `rap`, `rep`, `rev`, `rig`, `rip`, `rsh`, `run`, `rut`, `sew`, `swp`, `xeb`, `fe`.
50`bex`, `can`, `cat`, `cut`, `end`, `fil`, `hew`, `lsh`, `met`, `rap`, `rep`, `rev`, `rig`, `rip`, `rsh`, `run`, `rut`, `sew`, `swp`, `xeb`, `fe`.
docs/status.md+9−7
@@ -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 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, and direct `$^` unions whose cases can be proved disjoint. Ambiguous recursive origins fail closed; nested `$^`, other nested ordered maps, general union disjointness and complete import integration remain unfinished. Jibb module sources can be supplied to the partial checker, which does not yet resolve them. 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, and simple acyclic local mold aliases. Unfixed decimal literals default to `@ud` in gate-free inferred types; recursive local groups, more complex local molds, 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 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, and direct `$^` unions whose cases can be proved disjoint. Ambiguous recursive origins fail closed; nested `$^`, other 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, 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, and simple acyclic local mold aliases. Unfixed decimal literals default to `@ud` in gate-free inferred types; recursive local groups, more complex local molds, 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.
23
23
24## Milestone 1: parser and mark
24## Milestone 1: parser and mark
25
25
@@ -37,9 +37,9 @@ What the plan asks for, and where it is:
37
37
38Besides the plan's list:
38Besides the plan's list:
39
39
40−- 417 golden cases: 201 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+- 435 golden cases: 219 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 417-case corpus passed under `urbit eval` in 22.2 s. The fake ship passed all 421 tests, including the importer, importer/checker and mark/checker bridges, and unification checks, with 19.5 s for sync and 16.6 s for tests. The importer golden compares 81 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 435-case corpus passed under `urbit eval` in 25.7 s. The fake ship passed all 440 tests, including the importer, importer/checker and mark/checker bridges, module scope and unification checks, with 20.3 s for sync and 27.3 s for tests. The importer golden compares 90 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` (21 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).
45
45
@@ -63,23 +63,25 @@ Besides the plan's list:
63| bd37989 | 2026-10-30 | Read mark samples and test partial mark imports; reject unproven nested `$^`; preserve atom constraints through aliases |
63| bd37989 | 2026-10-30 | Read mark samples and test partial mark imports; reject unproven nested `$^`; preserve atom constraints through aliases |
64| 2d5deb2 | 2026-10-30 | Default gate-free decimal types, validate named Hoon mold lookup, and isolate fixture failures |
64| 2d5deb2 | 2026-10-30 | Default gate-free decimal types, validate named Hoon mold lookup, and isolate fixture failures |
65| 1b7dbae | 2026-10-30 | Infer acyclic local definitions and parse case-local Jibb module fixtures |
65| 1b7dbae | 2026-10-30 | Infer acyclic local definitions and parse case-local Jibb module fixtures |
66−| This change | 2026-10-30 | Preserve recursive import origins, infer simple local molds, and supply Jibb module sources to the partial checker |
66+| 8b9c9ac | 2026-10-30 | Preserve recursive import origins, infer simple local molds, and supply Jibb module sources to the partial checker |
67+| This change | 2026-10-30 | Infer supported library import graphs and guard nested Hoon `$^` in collections |
67
68
68## Checking it
69## Checking it
69
70
70On a machine set up as [development.md](development.md) says:
71On a machine set up as [development.md](development.md) says:
71
72
72```
73```
73−tools/golden # 417 cases under urbit eval
74+tools/golden # 435 cases under urbit eval
74tools/importer-test # the Hoon importer fixture projection
75tools/importer-test # the Hoon importer fixture projection
75tools/type-import-test # the importer/checker bridge fixture
76tools/type-import-test # the importer/checker bridge fixture
76tools/type-mark-test # the mark/checker bridge fixture
77tools/type-mark-test # the mark/checker bridge fixture
78+tools/type-module-scope-test # module and prelude scope fixture
77tools/hoon check-spans-test # prints <<>> when the span checker works
79tools/hoon check-spans-test # prints <<>> when the span checker works
78tools/testdata/selftest # the tools themselves
80tools/testdata/selftest # the tools themselves
79tools/doc-blocks docs/spec # the doc's examples are golden cases
81tools/doc-blocks docs/spec # the doc's examples are golden cases
80tools/ship start
82tools/ship start
81tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
83tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
82−tools/ship test # the same 417 cases as -test arms on the ship
84+tools/ship test # the same 435 cases as -test arms on the ship
83tools/testdata/ship-selftest
85tools/testdata/ship-selftest
84tools/ship check-commit # |commit stores .jibb files
86tools/ship check-commit # |commit stores .jibb files
85tools/clay-fixtures # example /sur files and marks build through Clay
87tools/clay-fixtures # example /sur files and marks build through Clay
jibb-dev/lib/jibb-import.hoon+21
@@ -372,6 +372,16 @@
372:: checked for disjointness. The tested axis follows the field path;
372:: checked for disjointness. The tested axis follows the field path;
373:: tracking that path distinguishes a nested $^ from an ordinary $@.
373:: tracking that path distinguishes a nested $^ from an ordinary $@.
374:: Other Hoon code can look the same, so some valid molds may be rejected.
374:: Other Hoon code can look the same, so some valid molds may be rejected.
375+:: Collection argument syntax retains $^ as %bckt, before Hoon
376+:: reduces the resulting type and can collapse overlapping cases. Until
377+:: argument-level disjointness is checked, reject those source forms.
378+++ has-spec-cell-union
379+ |= h=*
380+ ^- ?
381+ ?@ h |
382+ ?: ?=([%bckt ^ ^] h) &
383+ |($(h -.h) $(h +.h))
384+::
375++ has-cell-union
385++ has-cell-union
376 |= h=hoon
386 |= h=hoon
377 ^- ?
387 ^- ?
@@ -643,6 +653,8 @@
643 [%fork (sort cases |=(pair=[imported imported] (dor -.pair +.pair)))]
653 [%fork (sort cases |=(pair=[imported imported] (dor -.pair +.pair)))]
644 [%hint *] $(typ q.typ)
654 [%hint *] $(typ q.typ)
645 [%hold *]
655 [%hold *]
656+ ?: &(?=([%tsls [%note * *] *] q.typ) (has-spec-cell-union q.typ))
657+ [%bad 'a Hoon $^ union needs a source-level disjointness check']
646 =/ named=(unit term) (match-signature q.typ sig)
658 =/ named=(unit term) (match-signature q.typ sig)
647 ?^ named
659 ?^ named
648 =/ name u.named
660 =/ name u.named
@@ -1010,6 +1022,15 @@
1010 (crip "gate: {(show-result (sample %gate-test))}")
1022 (crip "gate: {(show-result (sample %gate-test))}")
1011 (crip "vase: {(show-result vase)}")
1023 (crip "vase: {(show-result vase)}")
1012 (crip "failed-branch: {(show-result (read-mold %external %bad bad-branch-fixture))}")
1024 (crip "failed-branch: {(show-result (read-mold %external %bad bad-branch-fixture))}")
1025+ (crip "list-bckt-field: {(show-result (sample %list-bckt-field))}")
1026+ (crip "list-noun-overlap: {(show-result (sample %list-noun-overlap))}")
1027+ (crip "list-null-overlap: {(show-result (sample %list-null-overlap))}")
1028+ (crip "list-nested-atom-cell: {(show-result (sample %list-nested-atom-cell))}")
1029+ (crip "list-nested-valid-cell: {(show-result (sample %list-nested-valid-cell))}")
1030+ (crip "list-nested-invalid-cell: {(show-result (sample %list-nested-invalid-cell))}")
1031+ (crip "map-nested-invalid-cell: {(show-result (sample %map-nested-invalid-cell))}")
1032+ (crip "set-direct-invalid-cell: {(show-result (sample %set-direct-invalid-cell))}")
1033+ (crip "map-key-invalid-cell: {(show-result (sample %map-key-invalid-cell))}")
1013 (crip "nested-atom-cell: {(show-result (sample %nested-atom-cell))}")
1034 (crip "nested-atom-cell: {(show-result (sample %nested-atom-cell))}")
1014 (crip "nested-valid-cell: {(show-result (sample %nested-valid-cell))}")
1035 (crip "nested-valid-cell: {(show-result (sample %nested-valid-cell))}")
1015 (crip "nested-invalid-cell: {(show-result (sample %nested-invalid-cell))}")
1036 (crip "nested-invalid-cell: {(show-result (sample %nested-invalid-cell))}")
jibb-dev/lib/jibb.hoon+177−31
@@ -4859,13 +4859,16 @@
4859::
4859::
4860+$ ischeme [typ=itype vars=(list @ud)]
4860+$ ischeme [typ=itype vars=(list @ud)]
4861+$ ienv (list [name=term scheme=ischeme])
4861+$ ienv (list [name=term scheme=ischeme])
4862++$ imold-types (list [name=term typ=itype])
4863++$ ifile [values=ienv molds=imold-types]
4864++$ ijimports (list [face=term interface=ifile])
4862+$ icaps (list [name=@t id=@ud])
4865+$ icaps (list [name=@t id=@ud])
4863+$ imolds (list [name=term body=shape])
4866+$ imolds (list [name=term body=shape])
4864:: A caller supplies the exact noun returned by +read-mold:jibb-import.
4867:: A caller supplies the exact noun returned by +read-mold:jibb-import.
4865:: This core has no Ford dependencies; unrecognized payloads fail closed.
4868:: This core has no Ford dependencies; unrecognized payloads fail closed.
4866+$ iexternals (list [module=term name=term result=*])
4869+$ iexternals (list [module=term name=term result=*])
4867+$ imark-externals (list [mark=term result=*])
4870+$ imark-externals (list [mark=term result=*])
4868−+$ istate [next=@ud sub=isub caps=icaps binders=(list @ud) molds=imolds globals=(list term) externals=iexternals surs=(list term) mark-externals=imark-externals marks=(list term) active=(list term) in-mold=?]
4871++$ istate [next=@ud sub=isub caps=icaps binders=(list @ud) molds=imolds globals=(list term) externals=iexternals surs=(list term) mark-externals=imark-externals marks=(list term) jimports=ijimports reserved-molds=(list term) active=(list term) in-mold=?]
4869+$ idiag [msg=tape sites=(list [at=span note=tape])]
4872+$ idiag [msg=tape sites=(list [at=span note=tape])]
4870+$ iresult (each [typ=itype state=istate] idiag)
4873+$ iresult (each [typ=itype state=istate] idiag)
4871+$ isample-result (each [typ=itype env=ienv state=istate] tape)
4874+$ isample-result (each [typ=itype env=ienv state=istate] tape)
@@ -5104,6 +5107,22 @@
5104 ?. ?=(%& -.result) ~
5107 ?. ?=(%& -.result) ~
5105 (import-to-itype +.result)
5108 (import-to-itype +.result)
5106::
5109::
5110+++ find-jibb-interface
5111+ |= [face=term imports=ijimports]
5112+ ^- (unit ifile)
5113+ ?~ imports ~
5114+ ?: =(face face.i.imports) `interface.i.imports
5115+ $(imports t.imports)
5116+::
5117+++ find-jibb-mold
5118+ |= [name=term iface=ifile]
5119+ ^- (unit itype)
5120+ =/ ms=imold-types molds.iface
5121+ |-
5122+ ?~ ms ~
5123+ ?: =(name name.i.ms) `typ.i.ms
5124+ $(ms t.ms)
5125+::
5107++ infer-simple-shape
5126++ infer-simple-shape
5108 |= [sh=shape state=istate]
5127 |= [sh=shape state=istate]
5109 ^- (unit [typ=itype state=istate])
5128 ^- (unit [typ=itype state=istate])
@@ -5124,6 +5143,11 @@
5124 =/ n=term i.names.sh
5143 =/ n=term i.names.sh
5125 ?^ t.names.sh
5144 ?^ t.names.sh
5126 ?^ t.t.names.sh ~
5145 ?^ t.t.names.sh ~
5146+ =/ iface=(unit ifile) (find-jibb-interface i.t.names.sh jimports.state)
5147+ ?^ iface
5148+ =/ found=(unit itype) (find-jibb-mold n u.iface)
5149+ ?~ found ~
5150+ `[u.found state]
5127 =/ found=(unit itype)
5151 =/ found=(unit itype)
5128 (find-imported-mold i.t.names.sh n externals.state surs.state)
5152 (find-imported-mold i.t.names.sh n externals.state surs.state)
5129 ?~ found ~
5153 ?~ found ~
@@ -5239,6 +5263,7 @@
5239 ?. (unique-value-name n names) |
5263 ?. (unique-value-name n names) |
5240 ?: (lien molds.state |=(m=[name=term body=shape] =(n name.m))) |
5264 ?: (lien molds.state |=(m=[name=term body=shape] =(n name.m))) |
5241 ?: (lien marks.state |=(m=term =(n m))) |
5265 ?: (lien marks.state |=(m=term =(n m))) |
5266+ ?: (lien reserved-molds.state |=(m=term =(n m))) |
5242 ?: (lien surs.state |=(m=term =(n m))) |
5267 ?: (lien surs.state |=(m=term =(n m))) |
5243 $(locals t.locals)
5268 $(locals t.locals)
5244::
5269::
@@ -5297,7 +5322,14 @@
5297 [%& [%atom %t] state]
5322 [%& [%atom %t] state]
5298 %wing
5323 %wing
5299 ?~ names.e [%| ["empty wing" ~]]
5324 ?~ names.e [%| ["empty wing" ~]]
5325+ ?^ t.names.e
5300− ?^ t.names.e [%| ["field access is not supported by partial inference" ~]]
5326+ ?^ t.t.names.e [%| ["field access is not supported by partial inference" ~]]
5327+ =/ iface=(unit ifile) (find-jibb-interface i.t.names.e jimports.state)
5328+ ?~ iface [%| ["field access is not supported by partial inference" ~]]
5329+ =/ member=(unit ischeme) (ienv-lookup i.names.e values.u.iface)
5330+ ?~ member [%| ["module member is not available to partial inference" ~]]
5331+ =/ instance=[typ=itype state=istate] (instantiate-scheme u.member state)
5332+ [%& typ.instance state.instance]
5301 =/ scheme=(unit ischeme) (ienv-lookup i.names.e env)
5333 =/ scheme=(unit ischeme) (ienv-lookup i.names.e env)
5302 ?~ scheme [%| ["name is not available to partial inference" ~]]
5334 ?~ scheme [%| ["name is not available to partial inference" ~]]
5303 =/ instance=[typ=itype state=istate] (instantiate-scheme u.scheme state)
5335 =/ instance=[typ=itype state=istate] (instantiate-scheme u.scheme state)
@@ -5598,14 +5630,14 @@
5598 |
5630 |
5599::
5631::
5600++ add-supported-defs
5632++ add-supported-defs
5601− |= [ds=(list def) env=ienv molds=imolds globals=(list term) externals=iexternals surs=(list term) mark-externals=imark-externals marks=(list term)]
5633+ |= [ds=(list def) env=ienv molds=imolds globals=(list term) externals=iexternals surs=(list term) mark-externals=imark-externals marks=(list term) jimports=ijimports reserved-molds=(list term)]
5602 ^- ienv
5634 ^- ienv
5603 ?~ ds env
5635 ?~ ds env
5604 =/ d=def i.ds
5636 =/ d=def i.ds
5605 ?: ?=(%mold -.d) $(ds t.ds)
5637 ?: ?=(%mold -.d) $(ds t.ds)
5606 ?. (unique-value-name name.d globals) $(ds t.ds)
5638 ?. (unique-value-name name.d globals) $(ds t.ds)
5607 ?^ (ienv-lookup name.d env) $(ds t.ds)
5639 ?^ (ienv-lookup name.d env) $(ds t.ds)
5608− =/ result=iresult (infer-fragment val.d env [0 ~ ~ ~ molds globals externals surs mark-externals marks ~ |])
5640+ =/ result=iresult (infer-fragment val.d env [0 ~ ~ ~ molds globals externals surs mark-externals marks jimports reserved-molds ~ |])
5609 ?: ?=(%| -.result) $(ds t.ds)
5641 ?: ?=(%| -.result) $(ds t.ds)
5610 ?: (constrained-capitals caps.state.p.result sub.state.p.result) $(ds t.ds)
5642 ?: (constrained-capitals caps.state.p.result sub.state.p.result) $(ds t.ds)
5611 =/ typ=itype (default-decimals (itype-normalize typ.p.result sub.state.p.result))
5643 =/ typ=itype (default-decimals (itype-normalize typ.p.result sub.state.p.result))
@@ -5615,11 +5647,11 @@
5615 $(ds t.ds, env [[name.d [typ vars]] env])
5647 $(ds t.ds, env [[name.d [typ vars]] env])
5616::
5648::
5617++ resolve-supported-defs
5649++ resolve-supported-defs
5618− |= [ds=(list def) molds=imolds globals=(list term) externals=iexternals surs=(list term) mark-externals=imark-externals marks=(list term)]
5650+ |= [ds=(list def) molds=imolds globals=(list term) externals=iexternals surs=(list term) mark-externals=imark-externals marks=(list term) jimports=ijimports reserved-molds=(list term)]
5619 ^- ienv
5651 ^- ienv
5620 =/ env=ienv ~
5652 =/ env=ienv ~
5621 |-
5653 |-
5622− =/ next=ienv (add-supported-defs ds env molds globals externals surs mark-externals marks)
5654+ =/ next=ienv (add-supported-defs ds env molds globals externals surs mark-externals marks jimports reserved-molds)
5623 ?: =(next env) env
5655 ?: =(next env) env
5624 $(env next)
5656 $(env next)
5625::
5657::
@@ -5807,33 +5839,141 @@
5807 ^- @t
5839 ^- @t
5808 (golden-types-with-marks file src externals ~)
5840 (golden-types-with-marks file src externals ~)
5809::
5841::
5810−:: +golden-types-with-modules: record supplied Jibb sources separately.
5842+:: A supplied module is addressed by its logical /ui/.../name/jibb path.
5811−:: Module imports are not resolved yet; neither supplied nor missing
5843+:: Interfaces are closed inference schemes, never raw source shapes.
5812−:: source makes the partial report a checked module.
5844+:: Recursive modules, APIs, derived gates and unsupported definitions do
5845+:: not yield an interface. The reachable graph is checked before the root.
5846+::
5847++$ jsource [at=path source=@t]
5848++$ jbundle (list jsource)
5849++$ jfile-result (each ifile @t)
5850++$ jimports-result (each ijimports @t)
5851+::
5852+++ import-binding-names
5853+ |= imports=(list import)
5854+ ^- (list term)
5855+ ?~ imports ~
5856+ =/ n=term
5857+ ?- -.i.imports
5858+ %jibb face.i.imports
5859+ %sur name.i.imports
5860+ %mark mark.i.imports
5861+ ==
5862+ [n $(imports t.imports)]
5863+::
5864+++ module-scope-valid
5865+ |= [mod=module prelude-values=(list term) prelude-molds=(list term)]
5866+ ^- ?
5867+ =/ imported=(list term) (import-binding-names imports.mod)
5868+ =/ vals=(list term) (global-value-names defs.mod)
5869+ =/ molds=imolds (collect-simple-molds defs.mod)
5870+ =/ mold-names=(list term) (turn molds |=(m=[name=term body=shape] name.m))
5871+ ?. %+ levy imported
5872+ |= n=term
5873+ &((unique-value-name n imported) !(lien vals |=(v=term =(n v))) !(lien mold-names |=(m=term =(n m))) !(lien prelude-values |=(v=term =(n v))) !(lien prelude-molds |=(m=term =(n m))))
5874+ |
5875+ ?. (levy vals |=(n=term &((unique-value-name n vals) !(lien prelude-values |=(v=term =(n v)))))) |
5876+ (levy mold-names |=(n=term &((unique-value-name n mold-names) !(lien prelude-molds |=(m=term =(n m))))))
5877+::
5878+++ module-mold-types
5879+ |= [molds=imolds state=istate]
5880+ ^- (each imold-types @t)
5881+ ?~ molds [%& ~]
5882+ =/ m=[name=term body=shape] i.molds
5883+ =/ t=(unit [typ=itype state=istate])
5884+ (infer-simple-shape body.m state(active [name.m active.state], in-mold &))
5885+ ?~ t [%| 'module mold needs unsupported inference']
5886+ ?: ?=(^ (itype-vars typ.u.t)) [%| 'module mold has unsupported variables']
5887+ =/ rest=(each imold-types @t) $(molds t.molds)
5888+ ?: ?=(%| -.rest) rest
5889+ [%& [[name.m typ.u.t] p.rest]]
5890+::
5891+++ module-values-complete
5892+ |= [ds=(list def) env=ienv]
5893+ ^- ?
5894+ ?~ ds &
5895+ ?: ?=(%mold -.i.ds) $(ds t.ds)
5896+ ?~ (ienv-lookup name.i.ds env) |
5897+ $(ds t.ds)
5898+::
5899+++ resolve-jibb-imports
5900+ |= [imports=(list import) externals=iexternals mark-externals=imark-externals modules=jbundle active=(list path) prelude-values=(list term) prelude-molds=(list term)]
5901+ ^- jimports-result
5902+ ?~ imports [%& ~]
5903+ ?. ?=(%jibb -.i.imports) $(imports t.imports)
5904+ =/ at=path (weld path.i.imports `path`~[%jibb])
5905+ ?: (lien active |=(p=path =(p at)))
5906+ [%| (crip "import cycle at {(spud at)}")]
5907+ =/ found=jbundle (skim modules |=(m=jsource =(at at.m)))
5908+ ?~ found [%| (crip "module source missing: {(spud at)}")]
5909+ ?^ t.found [%| (crip "duplicate module sources: {(spud at)}")]
5910+ =/ iface=jfile-result (infer-jibb-file at source.i.found externals mark-externals modules [at active] prelude-values prelude-molds)
5911+ ?: ?=(%| -.iface) [%| p.iface]
5912+ =/ rest=jimports-result $(imports t.imports)
5913+ ?: ?=(%| -.rest) rest
5914+ [%& [[face.i.imports p.iface] p.rest]]
5915+::
5916+++ infer-jibb-file
5917+ |= [at=path src=@t externals=iexternals mark-externals=imark-externals modules=jbundle active=(list path) prelude-values=(list term) prelude-molds=(list term)]
5918+ ^- jfile-result
5919+ ?: ?=([%ui %api *] at) [%| (crip "API module needs unsupported inference: {(spud at)}")]
5920+ =/ parsed (parse at src)
5921+ ?: ?=(%| -.parsed) [%| (crip "module source does not parse: {(spud at)}")]
5922+ =/ mod=module p.parsed
5923+ ?. (module-scope-valid mod prelude-values prelude-molds) [%| (crip "module has conflicting names: {(spud at)}")]
5924+ =/ vals=(list term) (global-value-names defs.mod)
5925+ ?: (lien vals |=(n=term =(n %main)))
5926+ [%| (crip "module kind needs unsupported inference: {(spud at)}")]
5927+ =/ js=jimports-result (resolve-jibb-imports imports.mod externals mark-externals modules active prelude-values prelude-molds)
5928+ ?: ?=(%| -.js) [%| p.js]
5929+ =/ molds=imolds (collect-simple-molds defs.mod)
5930+ =/ globals=(list term) (weld prelude-values (weld (import-binding-names imports.mod) vals))
5931+ =/ surs=(list term) (collect-sur-imports imports.mod)
5932+ =/ marks=(list term) (collect-mark-imports imports.mod)
5933+ =/ reserved=(list term) (weld prelude-molds (turn p.js |=(j=[face=term interface=ifile] face.j)))
5934+ =/ state=istate [0 ~ ~ ~ molds globals externals surs mark-externals marks p.js reserved ~ |]
5935+ =/ mts=(each imold-types @t) (module-mold-types molds state)
5936+ ?: ?=(%| -.mts) [%| (crip "{(trip p.mts)}: {(spud at)}")]
5937+ =/ env=ienv (resolve-supported-defs defs.mod molds globals externals surs mark-externals marks p.js reserved)
5938+ ?. (module-values-complete defs.mod env)
5939+ [%| (crip "module definitions need unsupported inference: {(spud at)}")]
5940+ [%& [env p.mts]]
5941+::
5942+:: +golden-types-with-modules fails closed for imports without prelude
5943+:: scope. +golden-types-with-prelude resolves supported library graphs;
5944+:: its report remains partial and unreachable sources are not examined.
5813::
5945::
5814++ golden-types-with-modules
5946++ golden-types-with-modules
5815− |= [file=path src=@t externals=iexternals mark-externals=imark-externals modules=(list [at=path source=@t])]
5947+ |= [file=path src=@t externals=iexternals mark-externals=imark-externals modules=jbundle]
5816 ^- @t
5948 ^- @t
5817 =/ parsed (parse file src)
5949 =/ parsed (parse file src)
5818 ?: ?=(%| -.parsed) (show-error src p.parsed)
5950 ?: ?=(%| -.parsed) (show-error src p.parsed)
5951+ ?: (lien imports.p.parsed |=(i=import ?=(%jibb -.i)))
5952+ 'partial inference; module not checked\0aprelude source missing; module import inference unsupported'
5819− =/ report=@t (golden-types-with-marks file src externals mark-externals)
5953+ (golden-types-with-marks file src externals mark-externals)
5820− =/ imports=(list import) imports.p.parsed
5954+::
5821− =/ lines=(list @t) ~
5955+:: The caller supplies the actual prelude source. Its current names are
5822− |-
5956+:: reserved, but its incomplete inventory and types are not checked here.
5823− ?~ imports
5957+::
5824− ?~ lines report
5958+++ golden-types-with-prelude
5825− (of-wain:format [report (flop lines)])
5959+ |= [file=path src=@t externals=iexternals mark-externals=imark-externals modules=jbundle prelude-source=@t]
5826− ?. ?=(%jibb -.i.imports) $(imports t.imports)
5960+ ^- @t
5827− =/ at=path (weld path.i.imports `path`~[%jibb])
5961+ =/ parsed (parse file src)
5828− =/ found=(list [at=path source=@t])
5962+ ?: ?=(%| -.parsed) (show-error src p.parsed)
5829− (skim modules |=(m=[at=path source=@t] =(at at.m)))
5963+ ?: =(0 prelude-source) 'partial inference; module not checked\0aprelude source missing; module import inference unsupported'
5830− =/ status=tape
5964+ =/ prelude (parse /lib/jibb/prelude/jibb prelude-source)
5831− ?~ found "source missing"
5965+ ?: ?=(%| -.prelude) 'partial inference; module not checked\0aprelude source does not parse; module import inference unsupported'
5832− ?^ t.found "duplicate sources"
5966+ =/ prelude-values=(list term) (global-value-names defs.p.prelude)
5833− "source supplied"
5967+ =/ prelude-molds=(list term)
5834− =/ line=@t
5968+ (turn (collect-simple-molds defs.p.prelude) |=(m=[name=term body=shape] name.m))
5835− (crip "/= {(trip face.i.imports)} {(spud path.i.imports)}: {status}; module import is not supported by partial inference")
5969+ ?. (module-scope-valid p.parsed prelude-values prelude-molds)
5836− $(imports t.imports, lines [line lines])
5970+ 'partial inference; module not checked\0amodule has conflicting names'
5971+ =/ js=jimports-result
5972+ (resolve-jibb-imports imports.p.parsed externals mark-externals modules ~[file] prelude-values prelude-molds)
5973+ ?: ?=(%| -.js) (of-wain:format ~['partial inference; module not checked' p.js])
5974+ =/ scope-values=(list term)
5975+ (weld prelude-values (weld (collect-sur-imports imports.p.parsed) (collect-mark-imports imports.p.parsed)))
5976+ (golden-types-in-context file src externals mark-externals p.js scope-values prelude-molds)
5837::
5977::
5838:: +golden-types-with-marks: supply declared mark types separately from /sur
5978:: +golden-types-with-marks: supply declared mark types separately from /sur
5839:: entries, as [mark result] with the result from +read-mark:jibb-import.
5979:: entries, as [mark result] with the result from +read-mark:jibb-import.
@@ -5842,14 +5982,20 @@
5842++ golden-types-with-marks
5982++ golden-types-with-marks
5843 |= [file=path src=@t externals=iexternals mark-externals=imark-externals]
5983 |= [file=path src=@t externals=iexternals mark-externals=imark-externals]
5844 ^- @t
5984 ^- @t
5985+ (golden-types-in-context file src externals mark-externals ~ ~ ~)
5986+::
5987+++ golden-types-in-context
5988+ |= [file=path src=@t externals=iexternals mark-externals=imark-externals jimports=ijimports prelude-values=(list term) reserved-molds=(list term)]
5989+ ^- @t
5990+ =. reserved-molds (weld reserved-molds (turn jimports |=(j=[face=term interface=ifile] face.j)))
5845 =/ parsed (parse file src)
5991 =/ parsed (parse file src)
5846 ?: ?=(%| -.parsed) (show-error src p.parsed)
5992 ?: ?=(%| -.parsed) (show-error src p.parsed)
5847 =/ ds=(list def) defs.p.parsed
5993 =/ ds=(list def) defs.p.parsed
5848 =/ molds=imolds (collect-simple-molds ds)
5994 =/ molds=imolds (collect-simple-molds ds)
5849− =/ globals=(list term) (global-value-names ds)
5995+ =/ globals=(list term) (weld prelude-values (weld (turn jimports |=(j=[face=term interface=ifile] face.j)) (global-value-names ds)))
5850 =/ surs=(list term) (collect-sur-imports imports.p.parsed)
5996 =/ surs=(list term) (collect-sur-imports imports.p.parsed)
5851 =/ marks=(list term) (collect-mark-imports imports.p.parsed)
5997 =/ marks=(list term) (collect-mark-imports imports.p.parsed)
5852− =/ env=ienv (resolve-supported-defs ds molds globals externals surs mark-externals marks)
5998+ =/ env=ienv (resolve-supported-defs ds molds globals externals surs mark-externals marks jimports reserved-molds)
5853 =/ lines=(list @t) ~
5999 =/ lines=(list @t) ~
5854 |-
6000 |-
5855 ?~ ds (of-wain:format ['partial inference; module not checked' (flop lines)])
6001 ?~ ds (of-wain:format ['partial inference; module not checked' (flop lines)])
@@ -5858,7 +6004,7 @@
5858 $(ds t.ds, lines [(show-partial-mold file src d molds) lines])
6004 $(ds t.ds, lines [(show-partial-mold file src d molds) lines])
5859 ?. (unique-value-name name.d globals)
6005 ?. (unique-value-name name.d globals)
5860 $(ds t.ds, lines [(crip "++ {(trip name.d)}: name already in scope") lines])
6006 $(ds t.ds, lines [(crip "++ {(trip name.d)}: name already in scope") lines])
5861− =/ result=iresult (infer-fragment val.d env [0 ~ ~ ~ molds globals externals surs mark-externals marks ~ |])
6007+ =/ result=iresult (infer-fragment val.d env [0 ~ ~ ~ molds globals externals surs mark-externals marks jimports reserved-molds ~ |])
5862 ?: ?=(%| -.result)
6008 ?: ?=(%| -.result)
5863 $(ds t.ds, lines [(show-inference-diagnostic file src name.d p.result) lines])
6009 $(ds t.ds, lines [(show-inference-diagnostic file src name.d p.result) lines])
5864 ?: (constrained-capitals caps.state.p.result sub.state.p.result)
6010 ?: (constrained-capitals caps.state.p.result sub.state.p.result)
jibb-dev/lib/jibb/prelude.jibb+14
@@ -195,3 +195,17 @@
195 ?- (predicate item)
195 ?- (predicate item)
196 %.y (skip rest predicate)
196 %.y (skip rest predicate)
197 %.n [item (skip rest predicate)]
197 %.n [item (skip rest predicate)]
198+
199+++ roll |= args=[(list A) B $-([A B] B)]
200+ ?- args
201+ [xs start combine]
202+ ?- xs
203+ ~ start
204+ [item rest] (roll rest (combine item start) combine)
205+
206+++ reel |= args=[(list A) B $-([A B] B)]
207+ ?- args
208+ [xs start combine]
209+ ?- xs
210+ ~ start
211+ [item rest] (combine item (reel rest start combine))
tests/golden/module-import-atom-scheme/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Modules: "No name may shadow one already in scope, imports and the prelude included"; type variables are generalized per `++`.
2+tests: An exported atom-constrained gate re-exported by an intermediate module is instantiated independently for @p and @t and rejects a cell.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/module-import-atom-scheme/module-trees.txtnew file+13
@@ -0,0 +1,13 @@
1+/ui/mid.jibb
2+(module
3+ (jibb 1:1 base /ui/base)
4+ (value 2:1 alias (wing 2:10 keep.base)))
5+/ui/base.jibb
6+(module
7+ (value 1:1 keep
8+ (gate 1:9
9+ (bind 1:12 x)
10+ (body 2:3
11+ (trace 2:3
12+ (cast 2:6 (aura 2:9 @) (wing 2:11 x))
13+ (body 3:5 (wing 3:5 x)))))))
tests/golden/module-import-atom-scheme/modules.txtnew file+2
@@ -0,0 +1,2 @@
1+/ui/mid.jibb
2+/ui/base.jibb
tests/golden/module-import-atom-scheme/modules/ui/base.jibbnew file+3
@@ -0,0 +1,3 @@
1+++ keep |= x
2+ ~& ^- @ x
3+ x
tests/golden/module-import-atom-scheme/modules/ui/mid.jibbnew file+2
@@ -0,0 +1,2 @@
1+/= base /ui/base
2+++ alias keep.base
tests/golden/module-import-atom-scheme/source.jibbnew file+4
@@ -0,0 +1,4 @@
1+/= mid /ui/mid
2+++ ship (alias.mid ~zod)
3+++ text-value (alias.mid "hello")
4+++ bad (alias.mid [~zod "hi"])
tests/golden/module-import-atom-scheme/tokens.txtnew file+31
@@ -0,0 +1,31 @@
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 ship
10+2:9 glyph (
11+2:10 tight wing alias.mid
12+2:20 lit ~zod
13+2:24 tight glyph )
14+3:1 NEWLINE
15+3:1 glyph ++
16+3:4 name text-value
17+3:15 glyph (
18+3:16 tight wing alias.mid
19+3:26 str "hello"
20+3:33 tight glyph )
21+4:1 NEWLINE
22+4:1 glyph ++
23+4:4 name bad
24+4:8 glyph (
25+4:9 tight wing alias.mid
26+4:19 glyph [
27+4:20 tight lit ~zod
28+4:25 str "hi"
29+4:29 tight glyph ]
30+4:30 tight glyph )
31+4:31 NEWLINE
tests/golden/module-import-atom-scheme/tree.txtnew file+13
@@ -0,0 +1,13 @@
1+(module
2+ (jibb 1:1 mid /ui/mid)
3+ (value 2:1 ship
4+ (group 2:9
5+ (call 2:10 (wing 2:10 alias.mid) (lit 2:20 ~zod))))
6+ (value 3:1 text-value
7+ (group 3:15
8+ (call 3:16 (wing 3:16 alias.mid) (str 3:26 "hello"))))
9+ (value 4:1 bad
10+ (group 4:8
11+ (call 4:9
12+ (wing 4:9 alias.mid)
13+ (tuple 4:19 (lit 4:20 ~zod) (str 4:25 "hi"))))))
tests/golden/module-import-atom-scheme/types.txtnew file+10
@@ -0,0 +1,10 @@
1+partial inference; module not checked
2+++ ship: @p
3+++ text-value: @t
4+++ bad: call's sample and argument types do not unify
5+/tests/golden/module-import-atom-scheme/source.jibb:4:9: called gate has type $-(A A) where A is an atom
6+++ bad (alias.mid [~zod "hi"])
7+ ^
8+/tests/golden/module-import-atom-scheme/source.jibb:4:19: argument has type [@p @t]
9+++ bad (alias.mid [~zod "hi"])
10+ ^
tests/golden/module-import-cycle/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Imports: `/=` imports a Jibb module; import cycles are errors.
2+tests: A cycle between supplied modules is reported without recursing forever.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/module-import-cycle/module-trees.txtnew file+16
@@ -0,0 +1,16 @@
1+/ui/a.jibb
2+(module
3+ (jibb 1:1 b /ui/b)
4+ (value 2:1 identity
5+ (gate-wide 2:13
6+ (bind 2:16 x)
7+ (group 2:18
8+ (call 2:19 (wing 2:19 identity.b) (wing 2:30 x))))))
9+/ui/b.jibb
10+(module
11+ (jibb 1:1 a /ui/a)
12+ (value 2:1 identity
13+ (gate-wide 2:13
14+ (bind 2:16 x)
15+ (group 2:18
16+ (call 2:19 (wing 2:19 identity.a) (wing 2:30 x))))))
tests/golden/module-import-cycle/modules.txtnew file+2
@@ -0,0 +1,2 @@
1+/ui/a.jibb
2+/ui/b.jibb
tests/golden/module-import-cycle/modules/ui/a.jibbnew file+2
@@ -0,0 +1,2 @@
1+/= b /ui/b
2+++ identity |=(x (identity.b x))
tests/golden/module-import-cycle/modules/ui/b.jibbnew file+2
@@ -0,0 +1,2 @@
1+/= a /ui/a
2+++ identity |=(x (identity.a x))
tests/golden/module-import-cycle/path.txtnew file+1
@@ -0,0 +1 @@
1+/ui/main.jibb
tests/golden/module-import-cycle/source.jibbnew file+2
@@ -0,0 +1,2 @@
1+/= a /ui/a
2+++ text (identity.a "hi")
tests/golden/module-import-cycle/tokens.txtnew file+14
@@ -0,0 +1,14 @@
1+1:1 glyph /=
2+1:5 name a
3+1:7 glyph /
4+1:8 tight knot ui
5+1:10 tight glyph /
6+1:11 tight knot a
7+2:1 NEWLINE
8+2:1 glyph ++
9+2:4 name text
10+2:9 glyph (
11+2:10 tight wing identity.a
12+2:21 str "hi"
13+2:25 tight glyph )
14+2:26 NEWLINE
tests/golden/module-import-cycle/tree.txtnew file+5
@@ -0,0 +1,5 @@
1+(module
2+ (jibb 1:1 a /ui/a)
3+ (value 2:1 text
4+ (group 2:9
5+ (call 2:10 (wing 2:10 identity.a) (str 2:21 "hi")))))
tests/golden/module-import-cycle/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+import cycle at /ui/a/jibb
tests/golden/module-import-empty/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Imports: `/=` imports a Jibb module; import cycles are errors.
2+tests: An explicit empty source bundle reports the missing imported module.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/module-import-empty/modules.txtnew file+1
@@ -0,0 +1 @@
1+# no module fixtures
tests/golden/module-import-empty/source.jibbnew file+2
@@ -0,0 +1,2 @@
1+/= lib /ui/lib
2+++ x (identity.lib "hi")
tests/golden/module-import-empty/tokens.txtnew file+14
@@ -0,0 +1,14 @@
1+1:1 glyph /=
2+1:5 name lib
3+1:9 glyph /
4+1:10 tight knot ui
5+1:12 tight glyph /
6+1:13 tight knot lib
7+2:1 NEWLINE
8+2:1 glyph ++
9+2:4 name x
10+2:6 glyph (
11+2:7 tight wing identity.lib
12+2:20 str "hi"
13+2:24 tight glyph )
14+2:25 NEWLINE
tests/golden/module-import-empty/tree.txtnew file+5
@@ -0,0 +1,5 @@
1+(module
2+ (jibb 1:1 lib /ui/lib)
3+ (value 2:1 x
4+ (group 2:6
5+ (call 2:7 (wing 2:7 identity.lib) (str 2:20 "hi")))))
tests/golden/module-import-empty/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+module source missing: /ui/lib/jibb
tests/golden/module-import-face-shadow/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Modules: "No name may shadow one already in scope, imports and the prelude included"; type variables are generalized per `++`.
2+tests: A body-local mold cannot shadow an imported module face.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/module-import-face-shadow/module-trees.txtnew file+4
@@ -0,0 +1,4 @@
1+/ui/lib.jibb
2+(module
3+ (value 1:1 identity
4+ (gate-wide 1:13 (bind 1:16 x) (wing 1:18 x))))
tests/golden/module-import-face-shadow/modules.txtnew file+1
@@ -0,0 +1 @@
1+/ui/lib.jibb
tests/golden/module-import-face-shadow/modules/ui/lib.jibbnew file+1
@@ -0,0 +1 @@
1+++ identity |=(x x)
tests/golden/module-import-face-shadow/source.jibbnew file+4
@@ -0,0 +1,4 @@
1+/= lib /ui/lib
2+++ f |= x
3+ +$ lib @t
4+ x
tests/golden/module-import-face-shadow/tokens.txtnew file+19
@@ -0,0 +1,19 @@
1+1:1 glyph /=
2+1:5 name lib
3+1:9 glyph /
4+1:10 tight knot ui
5+1:12 tight glyph /
6+1:13 tight knot lib
7+2:1 NEWLINE
8+2:1 glyph ++
9+2:4 name f
10+2:6 glyph |=
11+2:9 name x
12+3:3 INDENT
13+3:3 glyph +$
14+3:6 name lib
15+3:10 aura @t
16+4:3 NEWLINE
17+4:3 name x
18+4:4 DEDENT
19+4:4 NEWLINE
tests/golden/module-import-face-shadow/tree.txtnew file+8
@@ -0,0 +1,8 @@
1+(module
2+ (jibb 1:1 lib /ui/lib)
3+ (value 2:1 f
4+ (gate 2:6
5+ (bind 2:9 x)
6+ (body 3:3
7+ (mold 3:3 lib (aura 3:10 @t))
8+ (wing 4:3 x)))))
tests/golden/module-import-face-shadow/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+++ f: local molds shadow a name
tests/golden/module-import-identity/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Imports: `/=` imports a Jibb module; import cycles are errors.
2+tests: An imported identity is instantiated independently for a cord and a ship.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/module-import-identity/module-trees.txtnew file+4
@@ -0,0 +1,4 @@
1+/ui/lib.jibb
2+(module
3+ (value 1:1 identity
4+ (gate-wide 1:13 (bind 1:16 x) (wing 1:18 x))))
tests/golden/module-import-identity/modules.txtnew file+1
@@ -0,0 +1 @@
1+/ui/lib.jibb
tests/golden/module-import-identity/modules/ui/lib.jibbnew file+1
@@ -0,0 +1 @@
1+++ identity |=(x x)
tests/golden/module-import-identity/source.jibbnew file+3
@@ -0,0 +1,3 @@
1+/= lib /ui/lib
2+++ text (identity.lib "hi")
3+++ ship (identity.lib ~zod)
tests/golden/module-import-identity/tokens.txtnew file+21
@@ -0,0 +1,21 @@
1+1:1 glyph /=
2+1:5 name lib
3+1:9 glyph /
4+1:10 tight knot ui
5+1:12 tight glyph /
6+1:13 tight knot lib
7+2:1 NEWLINE
8+2:1 glyph ++
9+2:4 name text
10+2:9 glyph (
11+2:10 tight wing identity.lib
12+2:23 str "hi"
13+2:27 tight glyph )
14+3:1 NEWLINE
15+3:1 glyph ++
16+3:4 name ship
17+3:9 glyph (
18+3:10 tight wing identity.lib
19+3:23 lit ~zod
20+3:27 tight glyph )
21+3:28 NEWLINE
tests/golden/module-import-identity/tree.txtnew file+8
@@ -0,0 +1,8 @@
1+(module
2+ (jibb 1:1 lib /ui/lib)
3+ (value 2:1 text
4+ (group 2:9
5+ (call 2:10 (wing 2:10 identity.lib) (str 2:23 "hi"))))
6+ (value 3:1 ship
7+ (group 3:9
8+ (call 3:10 (wing 3:10 identity.lib) (lit 3:23 ~zod)))))
tests/golden/module-import-identity/types.txtnew file+3
@@ -0,0 +1,3 @@
1+partial inference; module not checked
2+++ text: @t
3+++ ship: @p
tests/golden/module-import-invalid/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Imports: `/=` imports a Jibb module; import cycles are errors.
2+tests: A malformed imported module is reported at its logical path.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/module-import-invalid/module-trees.txtnew file+4
@@ -0,0 +1,4 @@
1+/ui/lib.jibb
2+/ui/lib.jibb:1:10: expected a mold, on its line or a deeper one, found the end of the file
3++$ broken
4+ ^
tests/golden/module-import-invalid/modules.txtnew file+1
@@ -0,0 +1 @@
1+/ui/lib.jibb
tests/golden/module-import-invalid/modules/ui/lib.jibbnew file+1
@@ -0,0 +1 @@
1++$ broken
tests/golden/module-import-invalid/source.jibbnew file+2
@@ -0,0 +1,2 @@
1+/= lib /ui/lib
2+++ x (identity.lib "hi")
tests/golden/module-import-invalid/tokens.txtnew file+14
@@ -0,0 +1,14 @@
1+1:1 glyph /=
2+1:5 name lib
3+1:9 glyph /
4+1:10 tight knot ui
5+1:12 tight glyph /
6+1:13 tight knot lib
7+2:1 NEWLINE
8+2:1 glyph ++
9+2:4 name x
10+2:6 glyph (
11+2:7 tight wing identity.lib
12+2:20 str "hi"
13+2:24 tight glyph )
14+2:25 NEWLINE
tests/golden/module-import-invalid/tree.txtnew file+5
@@ -0,0 +1,5 @@
1+(module
2+ (jibb 1:1 lib /ui/lib)
3+ (value 2:1 x
4+ (group 2:6
5+ (call 2:7 (wing 2:7 identity.lib) (str 2:20 "hi")))))
tests/golden/module-import-invalid/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+module source does not parse: /ui/lib/jibb
tests/golden/module-import-missing-member/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Imports: `/=` imports a Jibb module; import cycles are errors.
2+tests: A missing member of a supplied module is reported.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/module-import-missing-member/module-trees.txtnew file+4
@@ -0,0 +1,4 @@
1+/ui/lib.jibb
2+(module
3+ (value 1:1 identity
4+ (gate-wide 1:13 (bind 1:16 x) (wing 1:18 x))))
tests/golden/module-import-missing-member/modules.txtnew file+1
@@ -0,0 +1 @@
1+/ui/lib.jibb
tests/golden/module-import-missing-member/modules/ui/lib.jibbnew file+1
@@ -0,0 +1 @@
1+++ identity |=(x x)
tests/golden/module-import-missing-member/source.jibbnew file+2
@@ -0,0 +1,2 @@
1+/= lib /ui/lib
2+++ x (absent.lib "hi")
tests/golden/module-import-missing-member/tokens.txtnew file+14
@@ -0,0 +1,14 @@
1+1:1 glyph /=
2+1:5 name lib
3+1:9 glyph /
4+1:10 tight knot ui
5+1:12 tight glyph /
6+1:13 tight knot lib
7+2:1 NEWLINE
8+2:1 glyph ++
9+2:4 name x
10+2:6 glyph (
11+2:7 tight wing absent.lib
12+2:18 str "hi"
13+2:22 tight glyph )
14+2:23 NEWLINE
tests/golden/module-import-missing-member/tree.txtnew file+5
@@ -0,0 +1,5 @@
1+(module
2+ (jibb 1:1 lib /ui/lib)
3+ (value 2:1 x
4+ (group 2:6
5+ (call 2:7 (wing 2:7 absent.lib) (str 2:18 "hi")))))
tests/golden/module-import-missing-member/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+++ x: module member is not available to partial inference
tests/golden/module-import-mold/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Imports: `/=` imports a Jibb module; import cycles are errors.
2+tests: A simple named mold exported by an imported module is used in a sample.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/module-import-mold/module-trees.txtnew file+3
@@ -0,0 +1,3 @@
1+/ui/lib.jibb
2+(module
3+ (mold 1:1 title (aura 1:10 @t)))
tests/golden/module-import-mold/modules.txtnew file+1
@@ -0,0 +1 @@
1+/ui/lib.jibb
tests/golden/module-import-mold/modules/ui/lib.jibbnew file+1
@@ -0,0 +1 @@
1++$ title @t
tests/golden/module-import-mold/source.jibbnew file+2
@@ -0,0 +1,2 @@
1+/= lib /ui/lib
2+++ identity |= x=title.lib x
tests/golden/module-import-mold/tokens.txtnew file+15
@@ -0,0 +1,15 @@
1+1:1 glyph /=
2+1:5 name lib
3+1:9 glyph /
4+1:10 tight knot ui
5+1:12 tight glyph /
6+1:13 tight knot lib
7+2:1 NEWLINE
8+2:1 glyph ++
9+2:4 name identity
10+2:13 glyph |=
11+2:16 name x
12+2:17 tight glyph =
13+2:18 tight wing title.lib
14+2:28 name x
15+2:29 NEWLINE
tests/golden/module-import-mold/tree.txtnew file+6
@@ -0,0 +1,6 @@
1+(module
2+ (jibb 1:1 lib /ui/lib)
3+ (value 2:1 identity
4+ (gate 2:13
5+ (face 2:16 x (ref 2:18 title.lib))
6+ (wing 2:28 x))))
tests/golden/module-import-mold/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+++ identity: $-(@t @t)
tests/golden/module-import-prelude-cross-namespace/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Modules: "No name may shadow one already in scope, imports and the prelude included"; molds and values have separate namespaces.
2+tests: A value may share the prelude mold `list` name because the namespaces are separate.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/module-import-prelude-cross-namespace/modules.txtnew file+1
@@ -0,0 +1 @@
1+# no module fixtures
tests/golden/module-import-prelude-cross-namespace/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ list |=(x x)
tests/golden/module-import-prelude-cross-namespace/tokens.txtnew file+7
@@ -0,0 +1,7 @@
1+1:1 glyph ++
2+1:4 name list
3+1:9 glyph |=(
4+1:12 tight name x
5+1:14 name x
6+1:15 tight glyph )
7+1:16 NEWLINE
tests/golden/module-import-prelude-cross-namespace/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+(module
2+ (value 1:1 list
3+ (gate-wide 1:9 (bind 1:12 x) (wing 1:14 x))))
tests/golden/module-import-prelude-cross-namespace/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+++ list: $-(A A)
tests/golden/module-import-prelude-mold-shadow/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Modules: "No name may shadow one already in scope, imports and the prelude included"; molds and values have separate namespaces.
2+tests: A root mold cannot shadow the prelude mold `list`, even with no imports.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/module-import-prelude-mold-shadow/modules.txtnew file+1
@@ -0,0 +1 @@
1+# no modules
tests/golden/module-import-prelude-mold-shadow/source.jibbnew file+2
@@ -0,0 +1,2 @@
1++$ list @t
2+++ x 1
tests/golden/module-import-prelude-mold-shadow/tokens.txtnew file+8
@@ -0,0 +1,8 @@
1+1:1 glyph +$
2+1:4 name list
3+1:9 aura @t
4+2:1 NEWLINE
5+2:1 glyph ++
6+2:4 name x
7+2:6 lit 1
8+2:7 NEWLINE
tests/golden/module-import-prelude-mold-shadow/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+(module
2+ (mold 1:1 list (aura 1:9 @t))
3+ (value 2:1 x (lit 2:6 1)))
tests/golden/module-import-prelude-mold-shadow/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+module has conflicting names
tests/golden/module-import-prelude-sample-shadow/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Modules: "No name may shadow one already in scope, imports and the prelude included"; molds and values have separate namespaces.
2+tests: A gate sample cannot shadow the prelude value `same`.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/module-import-prelude-sample-shadow/module-trees.txtnew file+4
@@ -0,0 +1,4 @@
1+/ui/lib.jibb
2+(module
3+ (value 1:1 identity
4+ (gate-wide 1:13 (bind 1:16 x) (wing 1:18 x))))
tests/golden/module-import-prelude-sample-shadow/modules.txtnew file+1
@@ -0,0 +1 @@
1+/ui/lib.jibb
tests/golden/module-import-prelude-sample-shadow/modules/ui/lib.jibbnew file+1
@@ -0,0 +1 @@
1+++ identity |=(x x)
tests/golden/module-import-prelude-sample-shadow/source.jibbnew file+2
@@ -0,0 +1,2 @@
1+/= lib /ui/lib
2+++ f |=(same same)
tests/golden/module-import-prelude-sample-shadow/tokens.txtnew file+14
@@ -0,0 +1,14 @@
1+1:1 glyph /=
2+1:5 name lib
3+1:9 glyph /
4+1:10 tight knot ui
5+1:12 tight glyph /
6+1:13 tight knot lib
7+2:1 NEWLINE
8+2:1 glyph ++
9+2:4 name f
10+2:6 glyph |=(
11+2:9 tight name same
12+2:14 name same
13+2:18 tight glyph )
14+2:19 NEWLINE
tests/golden/module-import-prelude-sample-shadow/tree.txtnew file+4
@@ -0,0 +1,4 @@
1+(module
2+ (jibb 1:1 lib /ui/lib)
3+ (value 2:1 f
4+ (gate-wide 2:6 (bind 2:9 same) (wing 2:14 same))))
tests/golden/module-import-prelude-sample-shadow/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+++ f: sample shadows a name
tests/golden/module-import-prelude-value-shadow/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Modules: "No name may shadow one already in scope, imports and the prelude included"; molds and values have separate namespaces.
2+tests: An imported value cannot shadow the prelude value `same`.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/module-import-prelude-value-shadow/module-trees.txtnew file+4
@@ -0,0 +1,4 @@
1+/ui/lib.jibb
2+(module
3+ (value 1:1 same
4+ (gate-wide 1:9 (bind 1:12 x) (wing 1:14 x))))
tests/golden/module-import-prelude-value-shadow/modules.txtnew file+1
@@ -0,0 +1 @@
1+/ui/lib.jibb
tests/golden/module-import-prelude-value-shadow/modules/ui/lib.jibbnew file+1
@@ -0,0 +1 @@
1+++ same |=(x x)
tests/golden/module-import-prelude-value-shadow/source.jibbnew file+2
@@ -0,0 +1,2 @@
1+/= lib /ui/lib
2+++ x 1
tests/golden/module-import-prelude-value-shadow/tokens.txtnew file+11
@@ -0,0 +1,11 @@
1+1:1 glyph /=
2+1:5 name lib
3+1:9 glyph /
4+1:10 tight knot ui
5+1:12 tight glyph /
6+1:13 tight knot lib
7+2:1 NEWLINE
8+2:1 glyph ++
9+2:4 name x
10+2:6 lit 1
11+2:7 NEWLINE
tests/golden/module-import-prelude-value-shadow/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+(module
2+ (jibb 1:1 lib /ui/lib)
3+ (value 2:1 x (lit 2:6 1)))
tests/golden/module-import-prelude-value-shadow/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+module has conflicting names: /ui/lib/jibb
tests/golden/module-import-root-cycle/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Imports: `/=` imports a Jibb module; import cycles are errors.
2+tests: A cycle back to the root uses its explicit logical path.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/module-import-root-cycle/module-trees.txtnew file+8
@@ -0,0 +1,8 @@
1+/ui/a.jibb
2+(module
3+ (jibb 1:1 main /ui/main)
4+ (value 2:1 identity
5+ (gate-wide 2:13
6+ (bind 2:16 x)
7+ (group 2:18
8+ (call 2:19 (wing 2:19 identity.main) (wing 2:33 x))))))
tests/golden/module-import-root-cycle/modules.txtnew file+1
@@ -0,0 +1 @@
1+/ui/a.jibb
tests/golden/module-import-root-cycle/modules/ui/a.jibbnew file+2
@@ -0,0 +1,2 @@
1+/= main /ui/main
2+++ identity |=(x (identity.main x))
tests/golden/module-import-root-cycle/path.txtnew file+1
@@ -0,0 +1 @@
1+/ui/main.jibb
tests/golden/module-import-root-cycle/source.jibbnew file+2
@@ -0,0 +1,2 @@
1+/= a /ui/a
2+++ identity |=(x (identity.a x))
tests/golden/module-import-root-cycle/tokens.txtnew file+17
@@ -0,0 +1,17 @@
1+1:1 glyph /=
2+1:5 name a
3+1:7 glyph /
4+1:8 tight knot ui
5+1:10 tight glyph /
6+1:11 tight knot a
7+2:1 NEWLINE
8+2:1 glyph ++
9+2:4 name identity
10+2:13 glyph |=(
11+2:16 tight name x
12+2:18 glyph (
13+2:19 tight wing identity.a
14+2:30 name x
15+2:31 tight glyph )
16+2:32 tight glyph )
17+2:33 NEWLINE
tests/golden/module-import-root-cycle/tree.txtnew file+7
@@ -0,0 +1,7 @@
1+(module
2+ (jibb 1:1 a /ui/a)
3+ (value 2:1 identity
4+ (gate-wide 2:13
5+ (bind 2:16 x)
6+ (group 2:18
7+ (call 2:19 (wing 2:19 identity.a) (wing 2:30 x))))))
tests/golden/module-import-root-cycle/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+import cycle at /ui/main/jibb
tests/golden/module-import-root-import-shadow/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Modules: "No name may shadow one already in scope, imports and the prelude included".
2+tests: Samples in the root module cannot shadow names declared by `/-` or `/%`; an explicit empty Jibb module bundle opts into module-aware checking.
3+expect: parses
4+expect-types: partial inference reports each shadowing sample
tests/golden/module-import-root-import-shadow/imports.txtnew file+1
@@ -0,0 +1 @@
1+fixture title
tests/golden/module-import-root-import-shadow/mar/label.txtnew file+5
@@ -0,0 +1,5 @@
1+|_ a=@t
2+++ grab |% ++ noun @t --
3+++ grow |% ++ noun a --
4+++ grad %noun
5+--
tests/golden/module-import-root-import-shadow/marks.txtnew file+1
@@ -0,0 +1 @@
1+label
tests/golden/module-import-root-import-shadow/modules.txtnew file+1
@@ -0,0 +1 @@
1+# no module fixtures
tests/golden/module-import-root-import-shadow/source.jibbnew file+4
@@ -0,0 +1,4 @@
1+/- fixture
2+/% %label
3+++ shadow-sur |=(fixture fixture)
4+++ shadow-mark |=(label label)
tests/golden/module-import-root-import-shadow/sur/fixture.txtnew file+3
@@ -0,0 +1,3 @@
1+|%
2++$ title @t
3+--
tests/golden/module-import-root-import-shadow/tokens.txtnew file+20
@@ -0,0 +1,20 @@
1+1:1 glyph /-
2+1:5 name fixture
3+2:1 NEWLINE
4+2:1 glyph /%
5+2:5 lit %label
6+3:1 NEWLINE
7+3:1 glyph ++
8+3:4 name shadow-sur
9+3:15 glyph |=(
10+3:18 tight name fixture
11+3:26 name fixture
12+3:33 tight glyph )
13+4:1 NEWLINE
14+4:1 glyph ++
15+4:4 name shadow-mark
16+4:16 glyph |=(
17+4:19 tight name label
18+4:25 name label
19+4:30 tight glyph )
20+4:31 NEWLINE
tests/golden/module-import-root-import-shadow/tree.txtnew file+7
@@ -0,0 +1,7 @@
1+(module
2+ (sur 1:1 fixture)
3+ (mark 2:1 %label)
4+ (value 3:1 shadow-sur
5+ (gate-wide 3:15 (bind 3:18 fixture) (wing 3:26 fixture)))
6+ (value 4:1 shadow-mark
7+ (gate-wide 4:16 (bind 4:19 label) (wing 4:25 label))))
tests/golden/module-import-root-import-shadow/types.txtnew file+3
@@ -0,0 +1,3 @@
1+partial inference; module not checked
2+++ shadow-sur: sample shadows a name
3+++ shadow-mark: sample shadows a name
tests/golden/module-import-separate-namespaces/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Modules: "No name may shadow one already in scope, imports and the prelude included"; molds and values have separate namespaces.
2+tests: A mold and a value may share a name because their namespaces are separate.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/module-import-separate-namespaces/module-trees.txtnew file+5
@@ -0,0 +1,5 @@
1+/ui/lib.jibb
2+(module
3+ (mold 1:1 thing (aura 1:10 @t))
4+ (value 2:1 thing
5+ (gate-wide 2:10 (bind 2:13 x) (wing 2:15 x))))
tests/golden/module-import-separate-namespaces/modules.txtnew file+1
@@ -0,0 +1 @@
1+/ui/lib.jibb
tests/golden/module-import-separate-namespaces/modules/ui/lib.jibbnew file+2
@@ -0,0 +1,2 @@
1++$ thing @t
2+++ thing |=(x x)
tests/golden/module-import-separate-namespaces/source.jibbnew file+3
@@ -0,0 +1,3 @@
1+/= lib /ui/lib
2+++ f |= x=thing.lib x
3+++ y (thing.lib "hi")
tests/golden/module-import-separate-namespaces/tokens.txtnew file+22
@@ -0,0 +1,22 @@
1+1:1 glyph /=
2+1:5 name lib
3+1:9 glyph /
4+1:10 tight knot ui
5+1:12 tight glyph /
6+1:13 tight knot lib
7+2:1 NEWLINE
8+2:1 glyph ++
9+2:4 name f
10+2:6 glyph |=
11+2:9 name x
12+2:10 tight glyph =
13+2:11 tight wing thing.lib
14+2:21 name x
15+3:1 NEWLINE
16+3:1 glyph ++
17+3:4 name y
18+3:6 glyph (
19+3:7 tight wing thing.lib
20+3:17 str "hi"
21+3:21 tight glyph )
22+3:22 NEWLINE
tests/golden/module-import-separate-namespaces/tree.txtnew file+9
@@ -0,0 +1,9 @@
1+(module
2+ (jibb 1:1 lib /ui/lib)
3+ (value 2:1 f
4+ (gate 2:6
5+ (face 2:9 x (ref 2:11 thing.lib))
6+ (wing 2:21 x)))
7+ (value 3:1 y
8+ (group 3:6
9+ (call 3:7 (wing 3:7 thing.lib) (str 3:17 "hi")))))
tests/golden/module-import-separate-namespaces/types.txtnew file+3
@@ -0,0 +1,3 @@
1+partial inference; module not checked
2+++ f: $-(@t @t)
3+++ y: @t
tests/golden/module-import-sur-scope/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Imports: `/=` imports a Jibb module; import cycles are errors.
2+tests: A module may not see the root module’s Hoon import without declaring it.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/module-import-sur-scope/imports.txtnew file+1
@@ -0,0 +1 @@
1+fixture title
tests/golden/module-import-sur-scope/module-trees.txtnew file+6
@@ -0,0 +1,6 @@
1+/ui/lib.jibb
2+(module
3+ (value 1:1 identity
4+ (gate 1:13
5+ (face 1:16 x (ref 1:18 title.fixture))
6+ (wing 1:32 x))))
tests/golden/module-import-sur-scope/modules.txtnew file+1
@@ -0,0 +1 @@
1+/ui/lib.jibb
tests/golden/module-import-sur-scope/modules/ui/lib.jibbnew file+1
@@ -0,0 +1 @@
1+++ identity |= x=title.fixture x
tests/golden/module-import-sur-scope/source.jibbnew file+4
@@ -0,0 +1,4 @@
1+/- fixture
2+/= lib /ui/lib
3+++ root |= x=title.fixture x
4+++ imported (identity.lib "hi")
tests/golden/module-import-sur-scope/sur/fixture.txtnew file+3
@@ -0,0 +1,3 @@
1+|%
2++$ title @t
3+--
tests/golden/module-import-sur-scope/tokens.txtnew file+25
@@ -0,0 +1,25 @@
1+1:1 glyph /-
2+1:5 name fixture
3+2:1 NEWLINE
4+2:1 glyph /=
5+2:5 name lib
6+2:9 glyph /
7+2:10 tight knot ui
8+2:12 tight glyph /
9+2:13 tight knot lib
10+3:1 NEWLINE
11+3:1 glyph ++
12+3:4 name root
13+3:9 glyph |=
14+3:12 name x
15+3:13 tight glyph =
16+3:14 tight wing title.fixture
17+3:28 name x
18+4:1 NEWLINE
19+4:1 glyph ++
20+4:4 name imported
21+4:13 glyph (
22+4:14 tight wing identity.lib
23+4:27 str "hi"
24+4:31 tight glyph )
25+4:32 NEWLINE
tests/golden/module-import-sur-scope/tree.txtnew file+10
@@ -0,0 +1,10 @@
1+(module
2+ (sur 1:1 fixture)
3+ (jibb 2:1 lib /ui/lib)
4+ (value 3:1 root
5+ (gate 3:9
6+ (face 3:12 x (ref 3:14 title.fixture))
7+ (wing 3:28 x)))
8+ (value 4:1 imported
9+ (group 4:13
10+ (call 4:14 (wing 4:14 identity.lib) (str 4:27 "hi")))))
tests/golden/module-import-sur-scope/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+module definitions need unsupported inference: /ui/lib/jibb
tests/golden/module-import-transitive/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Imports: `/=` imports a Jibb module; import cycles are errors.
2+tests: Imported modules use a transitive, explicitly supplied A-to-B-to-C dependency chain.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/module-import-transitive/module-trees.txtnew file+20
@@ -0,0 +1,20 @@
1+/ui/a.jibb
2+(module
3+ (jibb 1:1 b /ui/b)
4+ (value 2:1 identity
5+ (gate-wide 2:13
6+ (bind 2:16 x)
7+ (group 2:18
8+ (call 2:19 (wing 2:19 identity.b) (wing 2:30 x))))))
9+/ui/b.jibb
10+(module
11+ (jibb 1:1 c /ui/c)
12+ (value 2:1 identity
13+ (gate-wide 2:13
14+ (bind 2:16 x)
15+ (group 2:18
16+ (call 2:19 (wing 2:19 identity.c) (wing 2:30 x))))))
17+/ui/c.jibb
18+(module
19+ (value 1:1 identity
20+ (gate-wide 1:13 (bind 1:16 x) (wing 1:18 x))))
tests/golden/module-import-transitive/modules.txtnew file+3
@@ -0,0 +1,3 @@
1+/ui/a.jibb
2+/ui/b.jibb
3+/ui/c.jibb
tests/golden/module-import-transitive/modules/ui/a.jibbnew file+2
@@ -0,0 +1,2 @@
1+/= b /ui/b
2+++ identity |=(x (identity.b x))
tests/golden/module-import-transitive/modules/ui/b.jibbnew file+2
@@ -0,0 +1,2 @@
1+/= c /ui/c
2+++ identity |=(x (identity.c x))
tests/golden/module-import-transitive/modules/ui/c.jibbnew file+1
@@ -0,0 +1 @@
1+++ identity |=(x x)
tests/golden/module-import-transitive/path.txtnew file+1
@@ -0,0 +1 @@
1+/ui/main.jibb
tests/golden/module-import-transitive/source.jibbnew file+2
@@ -0,0 +1,2 @@
1+/= a /ui/a
2+++ text (identity.a "hi")
tests/golden/module-import-transitive/tokens.txtnew file+14
@@ -0,0 +1,14 @@
1+1:1 glyph /=
2+1:5 name a
3+1:7 glyph /
4+1:8 tight knot ui
5+1:10 tight glyph /
6+1:11 tight knot a
7+2:1 NEWLINE
8+2:1 glyph ++
9+2:4 name text
10+2:9 glyph (
11+2:10 tight wing identity.a
12+2:21 str "hi"
13+2:25 tight glyph )
14+2:26 NEWLINE
tests/golden/module-import-transitive/tree.txtnew file+5
@@ -0,0 +1,5 @@
1+(module
2+ (jibb 1:1 a /ui/a)
3+ (value 2:1 text
4+ (group 2:9
5+ (call 2:10 (wing 2:10 identity.a) (str 2:21 "hi")))))
tests/golden/module-import-transitive/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+++ text: @t
tests/golden/module-import-unused-invalid/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Imports: `/=` imports a Jibb module; import cycles are errors.
2+tests: An unused malformed fixture is parsed in module-trees but must not invalidate import inference.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/module-import-unused-invalid/module-trees.txtnew file+8
@@ -0,0 +1,8 @@
1+/ui/good.jibb
2+(module
3+ (value 1:1 identity
4+ (gate-wide 1:13 (bind 1:16 x) (wing 1:18 x))))
5+/ui/unused.jibb
6+/ui/unused.jibb:1:10: expected a mold, on its line or a deeper one, found the end of the file
7++$ broken
8+ ^
tests/golden/module-import-unused-invalid/modules.txtnew file+2
@@ -0,0 +1,2 @@
1+/ui/good.jibb
2+/ui/unused.jibb
tests/golden/module-import-unused-invalid/modules/ui/good.jibbnew file+1
@@ -0,0 +1 @@
1+++ identity |=(x x)
tests/golden/module-import-unused-invalid/modules/ui/unused.jibbnew file+1
@@ -0,0 +1 @@
1++$ broken
tests/golden/module-import-unused-invalid/source.jibbnew file+2
@@ -0,0 +1,2 @@
1+/= good /ui/good
2+++ text (identity.good "hi")
tests/golden/module-import-unused-invalid/tokens.txtnew file+14
@@ -0,0 +1,14 @@
1+1:1 glyph /=
2+1:5 name good
3+1:10 glyph /
4+1:11 tight knot ui
5+1:13 tight glyph /
6+1:14 tight knot good
7+2:1 NEWLINE
8+2:1 glyph ++
9+2:4 name text
10+2:9 glyph (
11+2:10 tight wing identity.good
12+2:24 str "hi"
13+2:28 tight glyph )
14+2:29 NEWLINE
tests/golden/module-import-unused-invalid/tree.txtnew file+5
@@ -0,0 +1,5 @@
1+(module
2+ (jibb 1:1 good /ui/good)
3+ (value 2:1 text
4+ (group 2:9
5+ (call 2:10 (wing 2:10 identity.good) (str 2:24 "hi")))))
tests/golden/module-import-unused-invalid/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+++ text: @t
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`, `both` and `clef`, and 2b includes `skim` and `skip`.
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`, `both` and `clef`, and 2b includes `skim`, `skip`, `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, two ways to combine units, and the complementary list filters. Both 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, two ways to combine units, complementary list filters, 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+14
@@ -195,3 +195,17 @@
195 ?- (predicate item)
195 ?- (predicate item)
196 %.y (skip rest predicate)
196 %.y (skip rest predicate)
197 %.n [item (skip rest predicate)]
197 %.n [item (skip rest predicate)]
198+
199+++ roll |= args=[(list A) B $-([A B] B)]
200+ ?- args
201+ [xs start combine]
202+ ?- xs
203+ ~ start
204+ [item rest] (roll rest (combine item start) combine)
205+
206+++ reel |= args=[(list A) B $-([A B] B)]
207+ ?- args
208+ [xs start combine]
209+ ?- xs
210+ ~ start
211+ [item rest] (combine item (reel rest start combine))
tests/golden/prelude-unit-list-transforms/tokens.txt+115−7
@@ -1200,10 +1200,118 @@
1200197:34 name predicate
1200197:34 name predicate
1201197:43 tight glyph )
1201197:43 tight glyph )
1202197:44 tight glyph ]
1202197:44 tight glyph ]
1203−197:45 DEDENT
1203+199:1 DEDENT
1204−197:45 DEDENT
1204+199:1 DEDENT
1205−197:45 DEDENT
1205+199:1 DEDENT
1206−197:45 DEDENT
1206+199:1 DEDENT
1207−197:45 DEDENT
1207+199:1 DEDENT
1208−197:45 DEDENT
1208+199:1 DEDENT
1209+199:1 NEWLINE
1210+199:1 glyph ++
1211+199:4 name roll
1212+199:9 glyph |=
1213+199:12 name args
1214+199:16 tight glyph =
1215+199:17 tight glyph [
1216+199:18 tight glyph (
1217+199:19 tight name list
1218+199:24 tvar A
1219+199:25 tight glyph )
1220+199:27 tvar B
1221+199:29 glyph $-(
1222+199:32 tight glyph [
1223+199:33 tight tvar A
1224+199:35 tvar B
1225+199:36 tight glyph ]
1226+199:38 tvar B
1227+199:39 tight glyph )
1228+199:40 tight glyph ]
1229+200:3 INDENT
1230+200:3 glyph ?-
1231+200:6 name args
1232+201:5 INDENT
1233+201:5 glyph [
1234+201:6 tight name xs
1235+201:9 name start
1236+201:15 name combine
1237+201:22 tight glyph ]
1238+202:7 INDENT
1239+202:7 glyph ?-
1240+202:10 name xs
1241+203:9 INDENT
1242+203:9 lit ~
1243+203:11 name start
1244+204:9 NEWLINE
1245+204:9 glyph [
1246+204:10 tight name item
1247+204:15 name rest
1248+204:19 tight glyph ]
1249+204:21 glyph (
1250+204:22 tight name roll
1251+204:27 name rest
1252+204:32 glyph (
1253+204:33 tight name combine
1254+204:41 name item
1255+204:46 name start
1256+204:51 tight glyph )
1257+204:53 name combine
1258+204:60 tight glyph )
1259+206:1 DEDENT
1260+206:1 DEDENT
1261+206:1 DEDENT
1262+206:1 DEDENT
1263+206:1 NEWLINE
1264+206:1 glyph ++
1265+206:4 name reel
1266+206:9 glyph |=
1267+206:12 name args
1268+206:16 tight glyph =
1269+206:17 tight glyph [
1270+206:18 tight glyph (
1271+206:19 tight name list
1272+206:24 tvar A
1273+206:25 tight glyph )
1274+206:27 tvar B
1275+206:29 glyph $-(
1276+206:32 tight glyph [
1277+206:33 tight tvar A
1278+206:35 tvar B
1279+206:36 tight glyph ]
1280+206:38 tvar B
1281+206:39 tight glyph )
1282+206:40 tight glyph ]
1283+207:3 INDENT
1284+207:3 glyph ?-
1285+207:6 name args
1286+208:5 INDENT
1287+208:5 glyph [
1288+208:6 tight name xs
1289+208:9 name start
1290+208:15 name combine
1291+208:22 tight glyph ]
1292+209:7 INDENT
1293+209:7 glyph ?-
1294+209:10 name xs
1295+210:9 INDENT
1296+210:9 lit ~
1297+210:11 name start
1298+211:9 NEWLINE
1299+211:9 glyph [
1300+211:10 tight name item
1301+211:15 name rest
1302+211:19 tight glyph ]
1303+211:21 glyph (
1304+211:22 tight name combine
1305+211:30 name item
1306+211:35 glyph (
1307+211:36 tight name reel
1308+211:41 name rest
1309+211:46 name start
1310+211:52 name combine
1311+211:59 tight glyph )
1312+211:60 tight glyph )
1313+211:61 DEDENT
1314+211:61 DEDENT
1315+211:61 DEDENT
1316+211:61 DEDENT
1209−197:45 NEWLINE
1317+211:61 NEWLINE
tests/golden/prelude-unit-list-transforms/tree.txt+54−1
@@ -504,4 +504,57 @@
504 (tuple 197:17
504 (tuple 197:17
505 (wing 197:18 item)
505 (wing 197:18 item)
506 (group 197:23
506 (group 197:23
507− (call 197:24 (wing 197:24 skip) (wing 197:29 rest) (wing 197:34 predicate))))))))))))))))
507+ (call 197:24 (wing 197:24 skip) (wing 197:29 rest) (wing 197:34 predicate)))))))))))))))
508+ (value 199:1 roll
509+ (gate 199:9
510+ (face 199:12 args
511+ (cell 199:17
512+ (apply 199:18 list (tvar 199:24 A))
513+ (tvar 199:27 B)
514+ (fn 199:29
515+ (cell 199:32 (tvar 199:33 A) (tvar 199:35 B))
516+ (tvar 199:38 B))))
517+ (body 200:3
518+ (branch 200:3
519+ (wing 200:6 args)
520+ (arm 201:5
521+ (cell 201:5 (bind 201:6 xs) (bind 201:9 start) (bind 201:15 combine))
522+ (body 202:7
523+ (branch 202:7
524+ (wing 202:10 xs)
525+ (arm 203:9 (lit 203:9 ~) (wing 203:11 start))
526+ (arm 204:9
527+ (cell 204:9 (bind 204:10 item) (bind 204:15 rest))
528+ (group 204:21
529+ (call 204:22
530+ (wing 204:22 roll)
531+ (wing 204:27 rest)
532+ (group 204:32
533+ (call 204:33 (wing 204:33 combine) (wing 204:41 item) (wing 204:46 start)))
534+ (wing 204:53 combine)))))))))))
535+ (value 206:1 reel
536+ (gate 206:9
537+ (face 206:12 args
538+ (cell 206:17
539+ (apply 206:18 list (tvar 206:24 A))
540+ (tvar 206:27 B)
541+ (fn 206:29
542+ (cell 206:32 (tvar 206:33 A) (tvar 206:35 B))
543+ (tvar 206:38 B))))
544+ (body 207:3
545+ (branch 207:3
546+ (wing 207:6 args)
547+ (arm 208:5
548+ (cell 208:5 (bind 208:6 xs) (bind 208:9 start) (bind 208:15 combine))
549+ (body 209:7
550+ (branch 209:7
551+ (wing 209:10 xs)
552+ (arm 210:9 (lit 210:9 ~) (wing 210:11 start))
553+ (arm 211:9
554+ (cell 211:9 (bind 211:10 item) (bind 211:15 rest))
555+ (group 211:21
556+ (call 211:22
557+ (wing 211:22 combine)
558+ (wing 211:30 item)
559+ (group 211:35
560+ (call 211:36 (wing 211:36 reel) (wing 211:41 rest) (wing 211:46 start) (wing 211:52 combine))))))))))))))
tests/golden/prelude-unit-list-transforms/types.txt+2
@@ -46,3 +46,5 @@ partial inference; module not checked
46++ clef: sample mold is not supported by partial inference
46++ clef: sample mold is not supported by partial inference
47++ skim: sample mold is not supported by partial inference
47++ skim: sample mold is not supported by partial inference
48++ skip: sample mold is not supported by partial inference
48++ skip: sample mold is not supported by partial inference
49+++ roll: sample mold is not supported by partial inference
50+++ reel: sample mold is not supported by partial inference
tests/golden/types-module-fixtures/about.txt+1−1
@@ -1,4 +1,4 @@
1source: Overview, worked example 2: the published page imports its API and card component with `/=`.
1source: Overview, worked example 2: the published page imports its API and card component with `/=`.
2−tests: The case carries two Jibb module sources at their logical paths; both runners parse and compare their trees and supply them to partial inference. Module import resolution and typing remain unsupported.
2+tests: The case carries two Jibb module sources at their logical paths; both runners parse and compare their trees and supply them to partial inference. The API module needs unsupported inference.
3expect: parses
3expect: parses
4expect-types: a partial report that does not claim module checking
4expect-types: a partial report that does not claim module checking
tests/golden/types-module-fixtures/types.txt+1−5
@@ -1,6 +1,2 @@
1partial inference; module not checked
1partial inference; module not checked
2−++ main: multiple arguments are not supported by partial inference
2+API module needs unsupported inference: /ui/api/blog/jibb
3−++ load: sample mold is not supported by partial inference
4−++ view: sample mold is not supported by partial inference
5−/= api /ui/api/blog: source supplied; module import is not supported by partial inference
6−/= card /ui/components/card: source supplied; module import is not supported by partial inference
tests/golden/types-module-mixed/about.txt+1−1
@@ -1,4 +1,4 @@
1source: Grammar, Imports: `/-` imports Hoon molds, `/%` imports a mark type and `/=` imports a Jibb module.
1source: Grammar, Imports: `/-` imports Hoon molds, `/%` imports a mark type and `/=` imports a Jibb module.
2−tests: The partial checker receives a Hoon mold, a mark and one Jibb module source together; it can infer the two supported Hoon types but reports Jibb module resolution unsupported for both the supplied source and the missing source.
2+tests: The partial checker receives a Hoon mold, a mark and a Jibb library module together; it infers the two supported Hoon types without claiming the module is fully checked.
3expect: parses
3expect: parses
4expect-types: a partial report; Jibb module import resolution is unsupported
4expect-types: a partial report; Jibb module import resolution is unsupported
tests/golden/types-module-mixed/source.jibb−1
@@ -1,6 +1,5 @@
1/- fixture
1/- fixture
2/% %label
2/% %label
3/= extra /ui/helper
3/= extra /ui/helper
4−/= missing /ui/missing
5++ label-id |= x=label x
4++ label-id |= x=label x
6++ title-id |= x=title.fixture x
5++ title-id |= x=title.fixture x
tests/golden/types-module-mixed/tokens.txt+11−18
@@ -11,26 +11,19 @@
113:14 tight glyph /
113:14 tight glyph /
123:15 tight knot helper
123:15 tight knot helper
134:1 NEWLINE
134:1 NEWLINE
14−4:1 glyph /=
14+4:1 glyph ++
15−4:5 name missing
15+4:4 name label-id
16−4:13 glyph /
16+4:13 glyph |=
17−4:14 tight knot ui
17+4:16 name x
18−4:16 tight glyph /
19−4:17 tight knot missing
18+4:17 tight glyph =
19+4:18 tight name label
20+4:24 name x
205:1 NEWLINE
215:1 NEWLINE
215:1 glyph ++
225:1 glyph ++
22−5:4 name label-id
23+5:4 name title-id
235:13 glyph |=
245:13 glyph |=
245:16 name x
255:16 name x
255:17 tight glyph =
265:17 tight glyph =
26−5:18 tight name label
27−5:24 name x
28−6:1 NEWLINE
29−6:1 glyph ++
30−6:4 name title-id
31−6:13 glyph |=
32−6:16 name x
33−6:17 tight glyph =
34−6:18 tight wing title.fixture
27+5:18 tight wing title.fixture
35−6:32 name x
28+5:32 name x
36−6:33 NEWLINE
29+5:33 NEWLINE
tests/golden/types-module-mixed/tree.txt+7−8
@@ -2,12 +2,11 @@
2 (sur 1:1 fixture)
2 (sur 1:1 fixture)
3 (mark 2:1 %label)
3 (mark 2:1 %label)
4 (jibb 3:1 extra /ui/helper)
4 (jibb 3:1 extra /ui/helper)
5− (jibb 4:1 missing /ui/missing)
5+ (value 4:1 label-id
6+ (gate 4:13
7+ (face 4:16 x (ref 4:18 label))
8+ (wing 4:24 x)))
6− (value 5:1 label-id
9+ (value 5:1 title-id
7 (gate 5:13
10 (gate 5:13
8− (face 5:16 x (ref 5:18 label))
11+ (face 5:16 x (ref 5:18 title.fixture))
9− (wing 5:24 x)))
10− (value 6:1 title-id
11− (gate 6:13
12− (face 6:16 x (ref 6:18 title.fixture))
13− (wing 6:32 x))))
12+ (wing 5:32 x))))
tests/golden/types-module-mixed/types.txt−2
@@ -1,5 +1,3 @@
1partial inference; module not checked
1partial inference; module not checked
2++ label-id: $-(@t @t)
2++ label-id: $-(@t @t)
3++ title-id: $-(@t @t)
3++ title-id: $-(@t @t)
4−/= extra /ui/helper: source supplied; module import is not supported by partial inference
5−/= missing /ui/missing: source missing; module import is not supported by partial inference
tests/importer/about.txt+2−1
@@ -3,7 +3,8 @@ recursion, and unsupported forms. `shadow.txt` checks local generator
3shadowing and missing provenance. `shadow-static.txt` checks that a local
3shadowing and missing provenance. `shadow-static.txt` checks that a local
4list shadow alongside a nested ordered map is rejected. Static sibling
4list shadow alongside a nested ordered map is rejected. Static sibling
5collections and dependent sibling molds are tested separately. Nested `$^`
5collections and dependent sibling molds are tested separately. Nested `$^`
6+cases and `$^` in collection arguments fail closed before Hoon can
6−cases fail closed, while nested `$@` cases remain supported. `ford.txt`
7+collapse overlapping branches; nested `$@` cases remain supported. `ford.txt`
7checks a synthetic imported subject and selected mold; other cases check
8checks a synthetic imported subject and selected mold; other cases check
8transitive imports, named mold lookup, missing names, shadowing, unprovenanced
9transitive imports, named mold lookup, missing names, shadowing, unprovenanced
9recursive holds, malformed
10recursive holds, malformed
tests/importer/small.txt+9
@@ -26,6 +26,15 @@
26+$ signed @sd
26+$ signed @sd
27+$ float @rd
27+$ float @rd
28+$ gate-test $-(@ud @ud)
28+$ gate-test $-(@ud @ud)
29++$ list-bckt-field (list [bckt=@ud value=@t])
30++$ list-noun-overlap (list $^(* @ud))
31++$ list-null-overlap (list $^(~ @ud))
32++$ list-nested-atom-cell (list [id=@ud value=$@(@ud [a=@ud b=@t])])
33++$ list-nested-valid-cell (list [id=@ud value=$^(@ud [a=@ud b=@t])])
34++$ list-nested-invalid-cell (list [id=@ud value=$^(@ud @ud)])
35++$ map-nested-invalid-cell (map @ud [id=@ud value=$^(@ud @ud)])
36++$ set-direct-invalid-cell (set $^(@ud @ud))
37++$ map-key-invalid-cell (map $^(@ud @ud) @t)
29+$ nested-atom-cell [left=$@(@ud [a=@ud b=@t]) right=$@(@t [c=@ud d=@t])]
38+$ nested-atom-cell [left=$@(@ud [a=@ud b=@t]) right=$@(@t [c=@ud d=@t])]
30+$ nested-valid-cell [id=@ud value=$^(@ud [a=@ud b=@t])]
39+$ nested-valid-cell [id=@ud value=$^(@ud [a=@ud b=@t])]
31+$ nested-invalid-cell [id=@ud value=$^(@ud @ud)]
40+$ nested-invalid-cell [id=@ud value=$^(@ud @ud)]
tests/importer/tree.txt+9
@@ -46,6 +46,15 @@ float: error: signed and float auras cannot be imported
46gate: error: cores and gates cannot be imported
46gate: error: cores and gates cannot be imported
47vase: error: vases cannot be imported
47vase: error: vases cannot be imported
48failed-branch: error: a Hoon $^ union needs a source-level disjointness check
48failed-branch: error: a Hoon $^ union needs a source-level disjointness check
49+list-bckt-field: (list [bckt=@ud value=@t])
50+list-noun-overlap: error: a Hoon $^ union needs a source-level disjointness check
51+list-null-overlap: error: a Hoon $^ union needs a source-level disjointness check
52+list-nested-atom-cell: (list [id=@ud value=(union [a=@ud b=@t] @ud)])
53+list-nested-valid-cell: error: a Hoon $^ union needs a source-level disjointness check
54+list-nested-invalid-cell: error: a Hoon $^ union needs a source-level disjointness check
55+map-nested-invalid-cell: error: a Hoon $^ union needs a source-level disjointness check
56+set-direct-invalid-cell: error: a Hoon $^ union needs a source-level disjointness check
57+map-key-invalid-cell: error: a Hoon $^ union needs a source-level disjointness check
49nested-atom-cell: [left=(union [a=@ud b=@t] @ud) right=(union [c=@ud d=@t] @t)]
58nested-atom-cell: [left=(union [a=@ud b=@t] @ud) right=(union [c=@ud d=@t] @t)]
50nested-valid-cell: error: a Hoon $^ union needs a source-level disjointness check
59nested-valid-cell: error: a Hoon $^ union needs a source-level disjointness check
51nested-invalid-cell: error: a Hoon $^ union needs a source-level disjointness check
60nested-invalid-cell: error: a Hoon $^ union needs a source-level disjointness check
tests/lib/jibb-module-scope.hoonnew file+24
@@ -0,0 +1,24 @@
1+:: Exercise supplied prelude scope and fail-closed module imports.
2+/+ jibb
3+/* expected %txt /tests/type-module-scope/expected/txt
4+|%
5+++ test-module-scope
6+ ^- tang
7+ ?~ expected ~[leaf+"module scope expected output is missing"]
8+ =/ got scope-output
9+ ?. =((to-wain:format (cat 3 got '\0a')) expected)
10+ ~[leaf+"module scope output differs from tests/type-module-scope/expected.txt"]
11+ ~
12+++ scope-output
13+ ^- @t
14+ =/ source=@t (crip "/= dep /ui/dep\0a++ identity |= x=value.dep x\0a++ atom mold.dep\0a")
15+ =/ dep=@t (crip "+$ value @t\0a++ mold ~zod\0a")
16+ =/ prelude=@t (crip "++ value |= x x\0a+$ mold @t\0a")
17+ =/ fixtures=(list [at=path source=@t]) ~[[~[%ui %dep %jibb] dep]]
18+ =/ okay (golden-types-with-prelude:jibb /ui/main/jibb source ~ ~ fixtures prelude)
19+ =/ empty (golden-types-with-prelude:jibb /ui/main/jibb source ~ ~ fixtures '')
20+ =/ bad (golden-types-with-prelude:jibb /ui/main/jibb source ~ ~ fixtures (crip "+$"))
21+ =/ conflict=@t (crip "/= value /ui/dep\0a++ identity |= x x\0a")
22+ =/ collision (golden-types-with-prelude:jibb /ui/main/jibb conflict ~ ~ fixtures prelude)
23+ (of-wain:format ~[okay empty bad collision])
24+--
tests/lib/jibb.hoon+378−233
@@ -20,6 +20,7 @@
20:: catch an expected file without its final newline.
20:: catch an expected file without its final newline.
21::
21::
22/+ jibb, jibb-import
22/+ jibb, jibb-import
23+/* prelude-source %jibb /lib/jibb/prelude/jibb
23/* src-1 %jibb /tests/golden/doc-core-02-update/source/jibb
24/* src-1 %jibb /tests/golden/doc-core-02-update/source/jibb
24/* tok-1 %txt /tests/golden/doc-core-02-update/tokens/txt
25/* tok-1 %txt /tests/golden/doc-core-02-update/tokens/txt
25/* tre-1 %txt /tests/golden/doc-core-02-update/tree/txt
26/* tre-1 %txt /tests/golden/doc-core-02-update/tree/txt
@@ -1141,194 +1142,302 @@
1141/* tre-373 %txt /tests/golden/module-fixture-eof/tree/txt
1142/* tre-373 %txt /tests/golden/module-fixture-eof/tree/txt
1142/* mod-373-1 %jibb /tests/golden/module-fixture-eof/modules/ui/incomplete/jibb
1143/* mod-373-1 %jibb /tests/golden/module-fixture-eof/modules/ui/incomplete/jibb
1143/* mtre-373 %txt /tests/golden/module-fixture-eof/module-trees/txt
1144/* mtre-373 %txt /tests/golden/module-fixture-eof/module-trees/txt
1144−/* src-374 %jibb /tests/golden/prelude-1c-structural/source/jibb
1145+/* src-374 %jibb /tests/golden/module-import-atom-scheme/source/jibb
1145−/* tok-374 %txt /tests/golden/prelude-1c-structural/tokens/txt
1146+/* tok-374 %txt /tests/golden/module-import-atom-scheme/tokens/txt
1146−/* tre-374 %txt /tests/golden/prelude-1c-structural/tree/txt
1147+/* tre-374 %txt /tests/golden/module-import-atom-scheme/tree/txt
1147−/* typ-374 %txt /tests/golden/prelude-1c-structural/types/txt
1148+/* mod-374-1 %jibb /tests/golden/module-import-atom-scheme/modules/ui/mid/jibb
1148−/* src-375 %jibb /tests/golden/prelude-3g-basic/source/jibb
1149+/* mod-374-2 %jibb /tests/golden/module-import-atom-scheme/modules/ui/base/jibb
1149−/* tok-375 %txt /tests/golden/prelude-3g-basic/tokens/txt
1150+/* typ-374 %txt /tests/golden/module-import-atom-scheme/types/txt
1150−/* tre-375 %txt /tests/golden/prelude-3g-basic/tree/txt
1151+/* mtre-374 %txt /tests/golden/module-import-atom-scheme/module-trees/txt
1151−/* typ-375 %txt /tests/golden/prelude-3g-basic/types/txt
1152+/* src-375 %jibb /tests/golden/module-import-cycle/source/jibb
1152−/* src-376 %jibb /tests/golden/prelude-3g-like/source/jibb
1153+/* tok-375 %txt /tests/golden/module-import-cycle/tokens/txt
1153−/* tok-376 %txt /tests/golden/prelude-3g-like/tokens/txt
1154+/* tre-375 %txt /tests/golden/module-import-cycle/tree/txt
1154−/* tre-376 %txt /tests/golden/prelude-3g-like/tree/txt
1155+/* mod-375-1 %jibb /tests/golden/module-import-cycle/modules/ui/a/jibb
1155−/* typ-376 %txt /tests/golden/prelude-3g-like/types/txt
1156+/* mod-375-2 %jibb /tests/golden/module-import-cycle/modules/ui/b/jibb
1156−/* src-377 %jibb /tests/golden/prelude-3g-structural/source/jibb
1157+/* typ-375 %txt /tests/golden/module-import-cycle/types/txt
1157−/* tok-377 %txt /tests/golden/prelude-3g-structural/tokens/txt
1158+/* mtre-375 %txt /tests/golden/module-import-cycle/module-trees/txt
1158−/* tre-377 %txt /tests/golden/prelude-3g-structural/tree/txt
1159+/* src-376 %jibb /tests/golden/module-import-empty/source/jibb
1159−/* typ-377 %txt /tests/golden/prelude-3g-structural/types/txt
1160+/* tok-376 %txt /tests/golden/module-import-empty/tokens/txt
1160−/* src-378 %jibb /tests/golden/prelude-core-functions/source/jibb
1161+/* tre-376 %txt /tests/golden/module-import-empty/tree/txt
1161−/* tok-378 %txt /tests/golden/prelude-core-functions/tokens/txt
1162+/* typ-376 %txt /tests/golden/module-import-empty/types/txt
1162−/* tre-378 %txt /tests/golden/prelude-core-functions/tree/txt
1163+/* src-377 %jibb /tests/golden/module-import-face-shadow/source/jibb
1163−/* typ-378 %txt /tests/golden/prelude-core-functions/types/txt
1164+/* tok-377 %txt /tests/golden/module-import-face-shadow/tokens/txt
1164−/* src-379 %jibb /tests/golden/prelude-list-helpers/source/jibb
1165+/* tre-377 %txt /tests/golden/module-import-face-shadow/tree/txt
1165−/* tok-379 %txt /tests/golden/prelude-list-helpers/tokens/txt
1166+/* mod-377-1 %jibb /tests/golden/module-import-face-shadow/modules/ui/lib/jibb
1166−/* tre-379 %txt /tests/golden/prelude-list-helpers/tree/txt
1167+/* typ-377 %txt /tests/golden/module-import-face-shadow/types/txt
1167−/* typ-379 %txt /tests/golden/prelude-list-helpers/types/txt
1168+/* mtre-377 %txt /tests/golden/module-import-face-shadow/module-trees/txt
1168−/* src-380 %jibb /tests/golden/prelude-list-unit/source/jibb
1169+/* src-378 %jibb /tests/golden/module-import-identity/source/jibb
1169−/* tok-380 %txt /tests/golden/prelude-list-unit/tokens/txt
1170+/* tok-378 %txt /tests/golden/module-import-identity/tokens/txt
1170−/* tre-380 %txt /tests/golden/prelude-list-unit/tree/txt
1171+/* tre-378 %txt /tests/golden/module-import-identity/tree/txt
1171−/* typ-380 %txt /tests/golden/prelude-list-unit/types/txt
1172+/* mod-378-1 %jibb /tests/golden/module-import-identity/modules/ui/lib/jibb
1172−/* src-381 %jibb /tests/golden/prelude-unit-list-transforms/source/jibb
1173+/* typ-378 %txt /tests/golden/module-import-identity/types/txt
1173−/* tok-381 %txt /tests/golden/prelude-unit-list-transforms/tokens/txt
1174+/* mtre-378 %txt /tests/golden/module-import-identity/module-trees/txt
1174−/* tre-381 %txt /tests/golden/prelude-unit-list-transforms/tree/txt
1175+/* src-379 %jibb /tests/golden/module-import-invalid/source/jibb
1175−/* typ-381 %txt /tests/golden/prelude-unit-list-transforms/types/txt
1176+/* tok-379 %txt /tests/golden/module-import-invalid/tokens/txt
1176−/* src-382 %jibb /tests/golden/types-import-mark/source/jibb
1177+/* tre-379 %txt /tests/golden/module-import-invalid/tree/txt
1177−/* tok-382 %txt /tests/golden/types-import-mark/tokens/txt
1178+/* mod-379-1 %jibb /tests/golden/module-import-invalid/modules/ui/lib/jibb
1178−/* tre-382 %txt /tests/golden/types-import-mark/tree/txt
1179+/* typ-379 %txt /tests/golden/module-import-invalid/types/txt
1179−/* typ-382 %txt /tests/golden/types-import-mark/types/txt
1180+/* mtre-379 %txt /tests/golden/module-import-invalid/module-trees/txt
1180−/* imp-382-1 %txt /tests/golden/types-import-mark/sur/fixture/txt
1181+/* src-380 %jibb /tests/golden/module-import-missing-member/source/jibb
1181−/* mark-382-1 %txt /tests/golden/types-import-mark/mar/label/txt
1182+/* tok-380 %txt /tests/golden/module-import-missing-member/tokens/txt
1182−/* src-383 %jibb /tests/golden/types-import-missing-mold/source/jibb
1183+/* tre-380 %txt /tests/golden/module-import-missing-member/tree/txt
1183−/* tok-383 %txt /tests/golden/types-import-missing-mold/tokens/txt
1184+/* mod-380-1 %jibb /tests/golden/module-import-missing-member/modules/ui/lib/jibb
1184−/* tre-383 %txt /tests/golden/types-import-missing-mold/tree/txt
1185+/* typ-380 %txt /tests/golden/module-import-missing-member/types/txt
1185−/* typ-383 %txt /tests/golden/types-import-missing-mold/types/txt
1186+/* mtre-380 %txt /tests/golden/module-import-missing-member/module-trees/txt
1186−/* imp-383-1 %txt /tests/golden/types-import-missing-mold/sur/fixture/txt
1187+/* src-381 %jibb /tests/golden/module-import-mold/source/jibb
1187−/* src-384 %jibb /tests/golden/types-import-sur/source/jibb
1188+/* tok-381 %txt /tests/golden/module-import-mold/tokens/txt
1188−/* tok-384 %txt /tests/golden/types-import-sur/tokens/txt
1189+/* tre-381 %txt /tests/golden/module-import-mold/tree/txt
1189−/* tre-384 %txt /tests/golden/types-import-sur/tree/txt
1190+/* mod-381-1 %jibb /tests/golden/module-import-mold/modules/ui/lib/jibb
1190−/* typ-384 %txt /tests/golden/types-import-sur/types/txt
1191+/* typ-381 %txt /tests/golden/module-import-mold/types/txt
1191−/* imp-384-1 %txt /tests/golden/types-import-sur/sur/fixture/txt
1192+/* mtre-381 %txt /tests/golden/module-import-mold/module-trees/txt
1192−/* imp-384-2 %txt /tests/golden/types-import-sur/sur/fixture/txt
1193+/* src-382 %jibb /tests/golden/module-import-prelude-cross-namespace/source/jibb
1193−/* src-385 %jibb /tests/golden/types-module-fixtures/source/jibb
1194+/* tok-382 %txt /tests/golden/module-import-prelude-cross-namespace/tokens/txt
1194−/* tok-385 %txt /tests/golden/types-module-fixtures/tokens/txt
1195+/* tre-382 %txt /tests/golden/module-import-prelude-cross-namespace/tree/txt
1195−/* tre-385 %txt /tests/golden/types-module-fixtures/tree/txt
1196+/* typ-382 %txt /tests/golden/module-import-prelude-cross-namespace/types/txt
1196−/* mod-385-1 %jibb /tests/golden/types-module-fixtures/modules/ui/api/blog/jibb
1197+/* src-383 %jibb /tests/golden/module-import-prelude-mold-shadow/source/jibb
1197−/* mod-385-2 %jibb /tests/golden/types-module-fixtures/modules/ui/components/card/jibb
1198+/* tok-383 %txt /tests/golden/module-import-prelude-mold-shadow/tokens/txt
1198−/* typ-385 %txt /tests/golden/types-module-fixtures/types/txt
1199+/* tre-383 %txt /tests/golden/module-import-prelude-mold-shadow/tree/txt
1199−/* mtre-385 %txt /tests/golden/types-module-fixtures/module-trees/txt
1200+/* typ-383 %txt /tests/golden/module-import-prelude-mold-shadow/types/txt
1200−/* src-386 %jibb /tests/golden/types-module-mixed/source/jibb
1201+/* src-384 %jibb /tests/golden/module-import-prelude-sample-shadow/source/jibb
1201−/* tok-386 %txt /tests/golden/types-module-mixed/tokens/txt
1202+/* tok-384 %txt /tests/golden/module-import-prelude-sample-shadow/tokens/txt
1202−/* tre-386 %txt /tests/golden/types-module-mixed/tree/txt
1203+/* tre-384 %txt /tests/golden/module-import-prelude-sample-shadow/tree/txt
1203−/* mod-386-1 %jibb /tests/golden/types-module-mixed/modules/ui/helper/jibb
1204+/* mod-384-1 %jibb /tests/golden/module-import-prelude-sample-shadow/modules/ui/lib/jibb
1204−/* typ-386 %txt /tests/golden/types-module-mixed/types/txt
1205+/* typ-384 %txt /tests/golden/module-import-prelude-sample-shadow/types/txt
1205−/* imp-386-1 %txt /tests/golden/types-module-mixed/sur/fixture/txt
1206+/* mtre-384 %txt /tests/golden/module-import-prelude-sample-shadow/module-trees/txt
1206−/* mark-386-1 %txt /tests/golden/types-module-mixed/mar/label/txt
1207+/* src-385 %jibb /tests/golden/module-import-prelude-value-shadow/source/jibb
1207−/* mtre-386 %txt /tests/golden/types-module-mixed/module-trees/txt
1208+/* tok-385 %txt /tests/golden/module-import-prelude-value-shadow/tokens/txt
1208−/* src-387 %jibb /tests/golden/types-partial-apply/source/jibb
1209+/* tre-385 %txt /tests/golden/module-import-prelude-value-shadow/tree/txt
1209−/* tok-387 %txt /tests/golden/types-partial-apply/tokens/txt
1210+/* mod-385-1 %jibb /tests/golden/module-import-prelude-value-shadow/modules/ui/lib/jibb
1210−/* tre-387 %txt /tests/golden/types-partial-apply/tree/txt
1211+/* typ-385 %txt /tests/golden/module-import-prelude-value-shadow/types/txt
1211−/* typ-387 %txt /tests/golden/types-partial-apply/types/txt
1212+/* mtre-385 %txt /tests/golden/module-import-prelude-value-shadow/module-trees/txt
1212−/* src-388 %jibb /tests/golden/types-partial-atom-alias/source/jibb
1213+/* src-386 %jibb /tests/golden/module-import-root-cycle/source/jibb
1213−/* tok-388 %txt /tests/golden/types-partial-atom-alias/tokens/txt
1214+/* tok-386 %txt /tests/golden/module-import-root-cycle/tokens/txt
1214−/* tre-388 %txt /tests/golden/types-partial-atom-alias/tree/txt
1215+/* tre-386 %txt /tests/golden/module-import-root-cycle/tree/txt
1215−/* typ-388 %txt /tests/golden/types-partial-atom-alias/types/txt
1216+/* mod-386-1 %jibb /tests/golden/module-import-root-cycle/modules/ui/a/jibb
1216−/* src-389 %jibb /tests/golden/types-partial-atom-constraint/source/jibb
1217+/* typ-386 %txt /tests/golden/module-import-root-cycle/types/txt
1217−/* tok-389 %txt /tests/golden/types-partial-atom-constraint/tokens/txt
1218+/* mtre-386 %txt /tests/golden/module-import-root-cycle/module-trees/txt
1218−/* tre-389 %txt /tests/golden/types-partial-atom-constraint/tree/txt
1219+/* src-387 %jibb /tests/golden/module-import-root-import-shadow/source/jibb
1219−/* typ-389 %txt /tests/golden/types-partial-atom-constraint/types/txt
1220+/* tok-387 %txt /tests/golden/module-import-root-import-shadow/tokens/txt
1220−/* src-390 %jibb /tests/golden/types-partial-atom-widening/source/jibb
1221+/* tre-387 %txt /tests/golden/module-import-root-import-shadow/tree/txt
1221−/* tok-390 %txt /tests/golden/types-partial-atom-widening/tokens/txt
1222+/* typ-387 %txt /tests/golden/module-import-root-import-shadow/types/txt
1222−/* tre-390 %txt /tests/golden/types-partial-atom-widening/tree/txt
1223+/* imp-387-1 %txt /tests/golden/module-import-root-import-shadow/sur/fixture/txt
1223−/* typ-390 %txt /tests/golden/types-partial-atom-widening/types/txt
1224+/* mark-387-1 %txt /tests/golden/module-import-root-import-shadow/mar/label/txt
1224−/* src-391 %jibb /tests/golden/types-partial-aura/source/jibb
1225+/* src-388 %jibb /tests/golden/module-import-separate-namespaces/source/jibb
1225−/* tok-391 %txt /tests/golden/types-partial-aura/tokens/txt
1226+/* tok-388 %txt /tests/golden/module-import-separate-namespaces/tokens/txt
1226−/* tre-391 %txt /tests/golden/types-partial-aura/tree/txt
1227+/* tre-388 %txt /tests/golden/module-import-separate-namespaces/tree/txt
1227−/* typ-391 %txt /tests/golden/types-partial-aura/types/txt
1228+/* mod-388-1 %jibb /tests/golden/module-import-separate-namespaces/modules/ui/lib/jibb
1228−/* src-392 %jibb /tests/golden/types-partial-aura-family/source/jibb
1229+/* typ-388 %txt /tests/golden/module-import-separate-namespaces/types/txt
1229−/* tok-392 %txt /tests/golden/types-partial-aura-family/tokens/txt
1230+/* mtre-388 %txt /tests/golden/module-import-separate-namespaces/module-trees/txt
1230−/* tre-392 %txt /tests/golden/types-partial-aura-family/tree/txt
1231+/* src-389 %jibb /tests/golden/module-import-sur-scope/source/jibb
1231−/* typ-392 %txt /tests/golden/types-partial-aura-family/types/txt
1232+/* tok-389 %txt /tests/golden/module-import-sur-scope/tokens/txt
1232−/* src-393 %jibb /tests/golden/types-partial-aura-generalization/source/jibb
1233+/* tre-389 %txt /tests/golden/module-import-sur-scope/tree/txt
1233−/* tok-393 %txt /tests/golden/types-partial-aura-generalization/tokens/txt
1234+/* mod-389-1 %jibb /tests/golden/module-import-sur-scope/modules/ui/lib/jibb
1234−/* tre-393 %txt /tests/golden/types-partial-aura-generalization/tree/txt
1235+/* typ-389 %txt /tests/golden/module-import-sur-scope/types/txt
1235−/* typ-393 %txt /tests/golden/types-partial-aura-generalization/types/txt
1236+/* imp-389-1 %txt /tests/golden/module-import-sur-scope/sur/fixture/txt
1236−/* src-394 %jibb /tests/golden/types-partial-bare-atom/source/jibb
1237+/* mtre-389 %txt /tests/golden/module-import-sur-scope/module-trees/txt
1237−/* tok-394 %txt /tests/golden/types-partial-bare-atom/tokens/txt
1238+/* src-390 %jibb /tests/golden/module-import-transitive/source/jibb
1238−/* tre-394 %txt /tests/golden/types-partial-bare-atom/tree/txt
1239+/* tok-390 %txt /tests/golden/module-import-transitive/tokens/txt
1239−/* typ-394 %txt /tests/golden/types-partial-bare-atom/types/txt
1240+/* tre-390 %txt /tests/golden/module-import-transitive/tree/txt
1240−/* src-395 %jibb /tests/golden/types-partial-branch-widening/source/jibb
1241+/* mod-390-1 %jibb /tests/golden/module-import-transitive/modules/ui/a/jibb
1241−/* tok-395 %txt /tests/golden/types-partial-branch-widening/tokens/txt
1242+/* mod-390-2 %jibb /tests/golden/module-import-transitive/modules/ui/b/jibb
1242−/* tre-395 %txt /tests/golden/types-partial-branch-widening/tree/txt
1243+/* mod-390-3 %jibb /tests/golden/module-import-transitive/modules/ui/c/jibb
1243−/* typ-395 %txt /tests/golden/types-partial-branch-widening/types/txt
1244+/* typ-390 %txt /tests/golden/module-import-transitive/types/txt
1244−/* src-396 %jibb /tests/golden/types-partial-conflicting-sites/source/jibb
1245+/* mtre-390 %txt /tests/golden/module-import-transitive/module-trees/txt
1245−/* tok-396 %txt /tests/golden/types-partial-conflicting-sites/tokens/txt
1246+/* src-391 %jibb /tests/golden/module-import-unused-invalid/source/jibb
1246−/* tre-396 %txt /tests/golden/types-partial-conflicting-sites/tree/txt
1247+/* tok-391 %txt /tests/golden/module-import-unused-invalid/tokens/txt
1247−/* typ-396 %txt /tests/golden/types-partial-conflicting-sites/types/txt
1248+/* tre-391 %txt /tests/golden/module-import-unused-invalid/tree/txt
1248−/* src-397 %jibb /tests/golden/types-partial-decimal-default/source/jibb
1249+/* mod-391-1 %jibb /tests/golden/module-import-unused-invalid/modules/ui/good/jibb
1249−/* tok-397 %txt /tests/golden/types-partial-decimal-default/tokens/txt
1250+/* mod-391-2 %jibb /tests/golden/module-import-unused-invalid/modules/ui/unused/jibb
1250−/* tre-397 %txt /tests/golden/types-partial-decimal-default/tree/txt
1251+/* typ-391 %txt /tests/golden/module-import-unused-invalid/types/txt
1251−/* typ-397 %txt /tests/golden/types-partial-decimal-default/types/txt
1252+/* mtre-391 %txt /tests/golden/module-import-unused-invalid/module-trees/txt
1252−/* src-398 %jibb /tests/golden/types-partial-dependency-chain/source/jibb
1253+/* src-392 %jibb /tests/golden/prelude-1c-structural/source/jibb
1253−/* tok-398 %txt /tests/golden/types-partial-dependency-chain/tokens/txt
1254+/* tok-392 %txt /tests/golden/prelude-1c-structural/tokens/txt
1254−/* tre-398 %txt /tests/golden/types-partial-dependency-chain/tree/txt
1255+/* tre-392 %txt /tests/golden/prelude-1c-structural/tree/txt
1255−/* typ-398 %txt /tests/golden/types-partial-dependency-chain/types/txt
1256+/* typ-392 %txt /tests/golden/prelude-1c-structural/types/txt
1256−/* src-399 %jibb /tests/golden/types-partial-explicit-capital/source/jibb
1257+/* src-393 %jibb /tests/golden/prelude-3g-basic/source/jibb
1257−/* tok-399 %txt /tests/golden/types-partial-explicit-capital/tokens/txt
1258+/* tok-393 %txt /tests/golden/prelude-3g-basic/tokens/txt
1258−/* tre-399 %txt /tests/golden/types-partial-explicit-capital/tree/txt
1259+/* tre-393 %txt /tests/golden/prelude-3g-basic/tree/txt
1259−/* typ-399 %txt /tests/golden/types-partial-explicit-capital/types/txt
1260+/* typ-393 %txt /tests/golden/prelude-3g-basic/types/txt
1260−/* src-400 %jibb /tests/golden/types-partial-forward/source/jibb
1261+/* src-394 %jibb /tests/golden/prelude-3g-like/source/jibb
1261−/* tok-400 %txt /tests/golden/types-partial-forward/tokens/txt
1262+/* tok-394 %txt /tests/golden/prelude-3g-like/tokens/txt
1262−/* tre-400 %txt /tests/golden/types-partial-forward/tree/txt
1263+/* tre-394 %txt /tests/golden/prelude-3g-like/tree/txt
1263−/* typ-400 %txt /tests/golden/types-partial-forward/types/txt
1264+/* typ-394 %txt /tests/golden/prelude-3g-like/types/txt
1264−/* src-401 %jibb /tests/golden/types-partial-generalization/source/jibb
1265+/* src-395 %jibb /tests/golden/prelude-3g-structural/source/jibb
1265−/* tok-401 %txt /tests/golden/types-partial-generalization/tokens/txt
1266+/* tok-395 %txt /tests/golden/prelude-3g-structural/tokens/txt
1266−/* tre-401 %txt /tests/golden/types-partial-generalization/tree/txt
1267+/* tre-395 %txt /tests/golden/prelude-3g-structural/tree/txt
1267−/* typ-401 %txt /tests/golden/types-partial-generalization/types/txt
1268+/* typ-395 %txt /tests/golden/prelude-3g-structural/types/txt
1268−/* src-402 %jibb /tests/golden/types-partial-identity/source/jibb
1269+/* src-396 %jibb /tests/golden/prelude-core-functions/source/jibb
1269−/* tok-402 %txt /tests/golden/types-partial-identity/tokens/txt
1270+/* tok-396 %txt /tests/golden/prelude-core-functions/tokens/txt
1270−/* tre-402 %txt /tests/golden/types-partial-identity/tree/txt
1271+/* tre-396 %txt /tests/golden/prelude-core-functions/tree/txt
1271−/* typ-402 %txt /tests/golden/types-partial-identity/types/txt
1272+/* typ-396 %txt /tests/golden/prelude-core-functions/types/txt
1272−/* src-403 %jibb /tests/golden/types-partial-independent-atoms/source/jibb
1273+/* src-397 %jibb /tests/golden/prelude-list-helpers/source/jibb
1273−/* tok-403 %txt /tests/golden/types-partial-independent-atoms/tokens/txt
1274+/* tok-397 %txt /tests/golden/prelude-list-helpers/tokens/txt
1274−/* tre-403 %txt /tests/golden/types-partial-independent-atoms/tree/txt
1275+/* tre-397 %txt /tests/golden/prelude-list-helpers/tree/txt
1275−/* typ-403 %txt /tests/golden/types-partial-independent-atoms/types/txt
1276+/* typ-397 %txt /tests/golden/prelude-list-helpers/types/txt
1276−/* src-404 %jibb /tests/golden/types-partial-local-molds/source/jibb
1277+/* src-398 %jibb /tests/golden/prelude-list-unit/source/jibb
1277−/* tok-404 %txt /tests/golden/types-partial-local-molds/tokens/txt
1278+/* tok-398 %txt /tests/golden/prelude-list-unit/tokens/txt
1278−/* tre-404 %txt /tests/golden/types-partial-local-molds/tree/txt
1279+/* tre-398 %txt /tests/golden/prelude-list-unit/tree/txt
1279−/* typ-404 %txt /tests/golden/types-partial-local-molds/types/txt
1280+/* typ-398 %txt /tests/golden/prelude-list-unit/types/txt
1280−/* src-405 %jibb /tests/golden/types-partial-locals/source/jibb
1281+/* src-399 %jibb /tests/golden/prelude-unit-list-transforms/source/jibb
1281−/* tok-405 %txt /tests/golden/types-partial-locals/tokens/txt
1282+/* tok-399 %txt /tests/golden/prelude-unit-list-transforms/tokens/txt
1282−/* tre-405 %txt /tests/golden/types-partial-locals/tree/txt
1283+/* tre-399 %txt /tests/golden/prelude-unit-list-transforms/tree/txt
1283−/* typ-405 %txt /tests/golden/types-partial-locals/types/txt
1284+/* typ-399 %txt /tests/golden/prelude-unit-list-transforms/types/txt
1284−/* src-406 %jibb /tests/golden/types-partial-many-atom-constraints/source/jibb
1285+/* src-400 %jibb /tests/golden/types-import-mark/source/jibb
1285−/* tok-406 %txt /tests/golden/types-partial-many-atom-constraints/tokens/txt
1286+/* tok-400 %txt /tests/golden/types-import-mark/tokens/txt
1286−/* tre-406 %txt /tests/golden/types-partial-many-atom-constraints/tree/txt
1287+/* tre-400 %txt /tests/golden/types-import-mark/tree/txt
1287−/* typ-406 %txt /tests/golden/types-partial-many-atom-constraints/types/txt
1288+/* typ-400 %txt /tests/golden/types-import-mark/types/txt
1288−/* src-407 %jibb /tests/golden/types-partial-mold-bare-aura/source/jibb
1289+/* imp-400-1 %txt /tests/golden/types-import-mark/sur/fixture/txt
1289−/* tok-407 %txt /tests/golden/types-partial-mold-bare-aura/tokens/txt
1290+/* mark-400-1 %txt /tests/golden/types-import-mark/mar/label/txt
1290−/* tre-407 %txt /tests/golden/types-partial-mold-bare-aura/tree/txt
1291+/* src-401 %jibb /tests/golden/types-import-missing-mold/source/jibb
1291−/* typ-407 %txt /tests/golden/types-partial-mold-bare-aura/types/txt
1292+/* tok-401 %txt /tests/golden/types-import-missing-mold/tokens/txt
1292−/* src-408 %jibb /tests/golden/types-partial-mold-composite/source/jibb
1293+/* tre-401 %txt /tests/golden/types-import-missing-mold/tree/txt
1293−/* tok-408 %txt /tests/golden/types-partial-mold-composite/tokens/txt
1294+/* typ-401 %txt /tests/golden/types-import-missing-mold/types/txt
1294−/* tre-408 %txt /tests/golden/types-partial-mold-composite/tree/txt
1295+/* imp-401-1 %txt /tests/golden/types-import-missing-mold/sur/fixture/txt
1295−/* typ-408 %txt /tests/golden/types-partial-mold-composite/types/txt
1296+/* src-402 %jibb /tests/golden/types-import-sur/source/jibb
1296−/* src-409 %jibb /tests/golden/types-partial-mold-forward/source/jibb
1297+/* tok-402 %txt /tests/golden/types-import-sur/tokens/txt
1297−/* tok-409 %txt /tests/golden/types-partial-mold-forward/tokens/txt
1298+/* tre-402 %txt /tests/golden/types-import-sur/tree/txt
1298−/* tre-409 %txt /tests/golden/types-partial-mold-forward/tree/txt
1299+/* typ-402 %txt /tests/golden/types-import-sur/types/txt
1299−/* typ-409 %txt /tests/golden/types-partial-mold-forward/types/txt
1300+/* imp-402-1 %txt /tests/golden/types-import-sur/sur/fixture/txt
1300−/* src-410 %jibb /tests/golden/types-partial-mold-recursive/source/jibb
1301+/* imp-402-2 %txt /tests/golden/types-import-sur/sur/fixture/txt
1301−/* tok-410 %txt /tests/golden/types-partial-mold-recursive/tokens/txt
1302+/* src-403 %jibb /tests/golden/types-module-fixtures/source/jibb
1302−/* tre-410 %txt /tests/golden/types-partial-mold-recursive/tree/txt
1303+/* tok-403 %txt /tests/golden/types-module-fixtures/tokens/txt
1303−/* typ-410 %txt /tests/golden/types-partial-mold-recursive/types/txt
1304+/* tre-403 %txt /tests/golden/types-module-fixtures/tree/txt
1304−/* src-411 %jibb /tests/golden/types-partial-occurs/source/jibb
1305+/* mod-403-1 %jibb /tests/golden/types-module-fixtures/modules/ui/api/blog/jibb
1305−/* tok-411 %txt /tests/golden/types-partial-occurs/tokens/txt
1306+/* mod-403-2 %jibb /tests/golden/types-module-fixtures/modules/ui/components/card/jibb
1306−/* tre-411 %txt /tests/golden/types-partial-occurs/tree/txt
1307+/* typ-403 %txt /tests/golden/types-module-fixtures/types/txt
1307−/* typ-411 %txt /tests/golden/types-partial-occurs/types/txt
1308+/* mtre-403 %txt /tests/golden/types-module-fixtures/module-trees/txt
1308−/* src-412 %jibb /tests/golden/types-partial-projection/source/jibb
1309+/* src-404 %jibb /tests/golden/types-module-mixed/source/jibb
1309−/* tok-412 %txt /tests/golden/types-partial-projection/tokens/txt
1310+/* tok-404 %txt /tests/golden/types-module-mixed/tokens/txt
1310−/* tre-412 %txt /tests/golden/types-partial-projection/tree/txt
1311+/* tre-404 %txt /tests/golden/types-module-mixed/tree/txt
1311−/* typ-412 %txt /tests/golden/types-partial-projection/types/txt
1312+/* mod-404-1 %jibb /tests/golden/types-module-mixed/modules/ui/helper/jibb
1312−/* src-413 %jibb /tests/golden/types-partial-shadow-global/source/jibb
1313+/* typ-404 %txt /tests/golden/types-module-mixed/types/txt
1313−/* tok-413 %txt /tests/golden/types-partial-shadow-global/tokens/txt
1314+/* imp-404-1 %txt /tests/golden/types-module-mixed/sur/fixture/txt
1314−/* tre-413 %txt /tests/golden/types-partial-shadow-global/tree/txt
1315+/* mark-404-1 %txt /tests/golden/types-module-mixed/mar/label/txt
1315−/* typ-413 %txt /tests/golden/types-partial-shadow-global/types/txt
1316+/* mtre-404 %txt /tests/golden/types-module-mixed/module-trees/txt
1316−/* src-414 %jibb /tests/golden/types-partial-shared-tvar/source/jibb
1317+/* src-405 %jibb /tests/golden/types-partial-apply/source/jibb
1317−/* tok-414 %txt /tests/golden/types-partial-shared-tvar/tokens/txt
1318+/* tok-405 %txt /tests/golden/types-partial-apply/tokens/txt
1318−/* tre-414 %txt /tests/golden/types-partial-shared-tvar/tree/txt
1319+/* tre-405 %txt /tests/golden/types-partial-apply/tree/txt
1319−/* typ-414 %txt /tests/golden/types-partial-shared-tvar/types/txt
1320+/* typ-405 %txt /tests/golden/types-partial-apply/types/txt
1320−/* src-415 %jibb /tests/golden/types-partial-union-cases/source/jibb
1321+/* src-406 %jibb /tests/golden/types-partial-atom-alias/source/jibb
1321−/* tok-415 %txt /tests/golden/types-partial-union-cases/tokens/txt
1322+/* tok-406 %txt /tests/golden/types-partial-atom-alias/tokens/txt
1322−/* tre-415 %txt /tests/golden/types-partial-union-cases/tree/txt
1323+/* tre-406 %txt /tests/golden/types-partial-atom-alias/tree/txt
1323−/* typ-415 %txt /tests/golden/types-partial-union-cases/types/txt
1324+/* typ-406 %txt /tests/golden/types-partial-atom-alias/types/txt
1324−/* src-416 %jibb /tests/golden/types-partial-union-edges/source/jibb
1325+/* src-407 %jibb /tests/golden/types-partial-atom-constraint/source/jibb
1325−/* tok-416 %txt /tests/golden/types-partial-union-edges/tokens/txt
1326+/* tok-407 %txt /tests/golden/types-partial-atom-constraint/tokens/txt
1326−/* tre-416 %txt /tests/golden/types-partial-union-edges/tree/txt
1327+/* tre-407 %txt /tests/golden/types-partial-atom-constraint/tree/txt
1327−/* typ-416 %txt /tests/golden/types-partial-union-edges/types/txt
1328+/* typ-407 %txt /tests/golden/types-partial-atom-constraint/types/txt
1328−/* src-417 %jibb /tests/golden/types-partial-unresolved-tag/source/jibb
1329+/* src-408 %jibb /tests/golden/types-partial-atom-widening/source/jibb
1329−/* tok-417 %txt /tests/golden/types-partial-unresolved-tag/tokens/txt
1330+/* tok-408 %txt /tests/golden/types-partial-atom-widening/tokens/txt
1330−/* tre-417 %txt /tests/golden/types-partial-unresolved-tag/tree/txt
1331+/* tre-408 %txt /tests/golden/types-partial-atom-widening/tree/txt
1331−/* typ-417 %txt /tests/golden/types-partial-unresolved-tag/types/txt
1332+/* typ-408 %txt /tests/golden/types-partial-atom-widening/types/txt
1333+/* src-409 %jibb /tests/golden/types-partial-aura/source/jibb
1334+/* tok-409 %txt /tests/golden/types-partial-aura/tokens/txt
1335+/* tre-409 %txt /tests/golden/types-partial-aura/tree/txt
1336+/* typ-409 %txt /tests/golden/types-partial-aura/types/txt
1337+/* src-410 %jibb /tests/golden/types-partial-aura-family/source/jibb
1338+/* tok-410 %txt /tests/golden/types-partial-aura-family/tokens/txt
1339+/* tre-410 %txt /tests/golden/types-partial-aura-family/tree/txt
1340+/* typ-410 %txt /tests/golden/types-partial-aura-family/types/txt
1341+/* src-411 %jibb /tests/golden/types-partial-aura-generalization/source/jibb
1342+/* tok-411 %txt /tests/golden/types-partial-aura-generalization/tokens/txt
1343+/* tre-411 %txt /tests/golden/types-partial-aura-generalization/tree/txt
1344+/* typ-411 %txt /tests/golden/types-partial-aura-generalization/types/txt
1345+/* src-412 %jibb /tests/golden/types-partial-bare-atom/source/jibb
1346+/* tok-412 %txt /tests/golden/types-partial-bare-atom/tokens/txt
1347+/* tre-412 %txt /tests/golden/types-partial-bare-atom/tree/txt
1348+/* typ-412 %txt /tests/golden/types-partial-bare-atom/types/txt
1349+/* src-413 %jibb /tests/golden/types-partial-branch-widening/source/jibb
1350+/* tok-413 %txt /tests/golden/types-partial-branch-widening/tokens/txt
1351+/* tre-413 %txt /tests/golden/types-partial-branch-widening/tree/txt
1352+/* typ-413 %txt /tests/golden/types-partial-branch-widening/types/txt
1353+/* src-414 %jibb /tests/golden/types-partial-conflicting-sites/source/jibb
1354+/* tok-414 %txt /tests/golden/types-partial-conflicting-sites/tokens/txt
1355+/* tre-414 %txt /tests/golden/types-partial-conflicting-sites/tree/txt
1356+/* typ-414 %txt /tests/golden/types-partial-conflicting-sites/types/txt
1357+/* src-415 %jibb /tests/golden/types-partial-decimal-default/source/jibb
1358+/* tok-415 %txt /tests/golden/types-partial-decimal-default/tokens/txt
1359+/* tre-415 %txt /tests/golden/types-partial-decimal-default/tree/txt
1360+/* typ-415 %txt /tests/golden/types-partial-decimal-default/types/txt
1361+/* src-416 %jibb /tests/golden/types-partial-dependency-chain/source/jibb
1362+/* tok-416 %txt /tests/golden/types-partial-dependency-chain/tokens/txt
1363+/* tre-416 %txt /tests/golden/types-partial-dependency-chain/tree/txt
1364+/* typ-416 %txt /tests/golden/types-partial-dependency-chain/types/txt
1365+/* src-417 %jibb /tests/golden/types-partial-explicit-capital/source/jibb
1366+/* tok-417 %txt /tests/golden/types-partial-explicit-capital/tokens/txt
1367+/* tre-417 %txt /tests/golden/types-partial-explicit-capital/tree/txt
1368+/* typ-417 %txt /tests/golden/types-partial-explicit-capital/types/txt
1369+/* src-418 %jibb /tests/golden/types-partial-forward/source/jibb
1370+/* tok-418 %txt /tests/golden/types-partial-forward/tokens/txt
1371+/* tre-418 %txt /tests/golden/types-partial-forward/tree/txt
1372+/* typ-418 %txt /tests/golden/types-partial-forward/types/txt
1373+/* src-419 %jibb /tests/golden/types-partial-generalization/source/jibb
1374+/* tok-419 %txt /tests/golden/types-partial-generalization/tokens/txt
1375+/* tre-419 %txt /tests/golden/types-partial-generalization/tree/txt
1376+/* typ-419 %txt /tests/golden/types-partial-generalization/types/txt
1377+/* src-420 %jibb /tests/golden/types-partial-identity/source/jibb
1378+/* tok-420 %txt /tests/golden/types-partial-identity/tokens/txt
1379+/* tre-420 %txt /tests/golden/types-partial-identity/tree/txt
1380+/* typ-420 %txt /tests/golden/types-partial-identity/types/txt
1381+/* src-421 %jibb /tests/golden/types-partial-independent-atoms/source/jibb
1382+/* tok-421 %txt /tests/golden/types-partial-independent-atoms/tokens/txt
1383+/* tre-421 %txt /tests/golden/types-partial-independent-atoms/tree/txt
1384+/* typ-421 %txt /tests/golden/types-partial-independent-atoms/types/txt
1385+/* src-422 %jibb /tests/golden/types-partial-local-molds/source/jibb
1386+/* tok-422 %txt /tests/golden/types-partial-local-molds/tokens/txt
1387+/* tre-422 %txt /tests/golden/types-partial-local-molds/tree/txt
1388+/* typ-422 %txt /tests/golden/types-partial-local-molds/types/txt
1389+/* src-423 %jibb /tests/golden/types-partial-locals/source/jibb
1390+/* tok-423 %txt /tests/golden/types-partial-locals/tokens/txt
1391+/* tre-423 %txt /tests/golden/types-partial-locals/tree/txt
1392+/* typ-423 %txt /tests/golden/types-partial-locals/types/txt
1393+/* src-424 %jibb /tests/golden/types-partial-many-atom-constraints/source/jibb
1394+/* tok-424 %txt /tests/golden/types-partial-many-atom-constraints/tokens/txt
1395+/* tre-424 %txt /tests/golden/types-partial-many-atom-constraints/tree/txt
1396+/* typ-424 %txt /tests/golden/types-partial-many-atom-constraints/types/txt
1397+/* src-425 %jibb /tests/golden/types-partial-mold-bare-aura/source/jibb
1398+/* tok-425 %txt /tests/golden/types-partial-mold-bare-aura/tokens/txt
1399+/* tre-425 %txt /tests/golden/types-partial-mold-bare-aura/tree/txt
1400+/* typ-425 %txt /tests/golden/types-partial-mold-bare-aura/types/txt
1401+/* src-426 %jibb /tests/golden/types-partial-mold-composite/source/jibb
1402+/* tok-426 %txt /tests/golden/types-partial-mold-composite/tokens/txt
1403+/* tre-426 %txt /tests/golden/types-partial-mold-composite/tree/txt
1404+/* typ-426 %txt /tests/golden/types-partial-mold-composite/types/txt
1405+/* src-427 %jibb /tests/golden/types-partial-mold-forward/source/jibb
1406+/* tok-427 %txt /tests/golden/types-partial-mold-forward/tokens/txt
1407+/* tre-427 %txt /tests/golden/types-partial-mold-forward/tree/txt
1408+/* typ-427 %txt /tests/golden/types-partial-mold-forward/types/txt
1409+/* src-428 %jibb /tests/golden/types-partial-mold-recursive/source/jibb
1410+/* tok-428 %txt /tests/golden/types-partial-mold-recursive/tokens/txt
1411+/* tre-428 %txt /tests/golden/types-partial-mold-recursive/tree/txt
1412+/* typ-428 %txt /tests/golden/types-partial-mold-recursive/types/txt
1413+/* src-429 %jibb /tests/golden/types-partial-occurs/source/jibb
1414+/* tok-429 %txt /tests/golden/types-partial-occurs/tokens/txt
1415+/* tre-429 %txt /tests/golden/types-partial-occurs/tree/txt
1416+/* typ-429 %txt /tests/golden/types-partial-occurs/types/txt
1417+/* src-430 %jibb /tests/golden/types-partial-projection/source/jibb
1418+/* tok-430 %txt /tests/golden/types-partial-projection/tokens/txt
1419+/* tre-430 %txt /tests/golden/types-partial-projection/tree/txt
1420+/* typ-430 %txt /tests/golden/types-partial-projection/types/txt
1421+/* src-431 %jibb /tests/golden/types-partial-shadow-global/source/jibb
1422+/* tok-431 %txt /tests/golden/types-partial-shadow-global/tokens/txt
1423+/* tre-431 %txt /tests/golden/types-partial-shadow-global/tree/txt
1424+/* typ-431 %txt /tests/golden/types-partial-shadow-global/types/txt
1425+/* src-432 %jibb /tests/golden/types-partial-shared-tvar/source/jibb
1426+/* tok-432 %txt /tests/golden/types-partial-shared-tvar/tokens/txt
1427+/* tre-432 %txt /tests/golden/types-partial-shared-tvar/tree/txt
1428+/* typ-432 %txt /tests/golden/types-partial-shared-tvar/types/txt
1429+/* src-433 %jibb /tests/golden/types-partial-union-cases/source/jibb
1430+/* tok-433 %txt /tests/golden/types-partial-union-cases/tokens/txt
1431+/* tre-433 %txt /tests/golden/types-partial-union-cases/tree/txt
1432+/* typ-433 %txt /tests/golden/types-partial-union-cases/types/txt
1433+/* src-434 %jibb /tests/golden/types-partial-union-edges/source/jibb
1434+/* tok-434 %txt /tests/golden/types-partial-union-edges/tokens/txt
1435+/* tre-434 %txt /tests/golden/types-partial-union-edges/tree/txt
1436+/* typ-434 %txt /tests/golden/types-partial-union-edges/types/txt
1437+/* src-435 %jibb /tests/golden/types-partial-unresolved-tag/source/jibb
1438+/* tok-435 %txt /tests/golden/types-partial-unresolved-tag/tokens/txt
1439+/* tre-435 %txt /tests/golden/types-partial-unresolved-tag/tree/txt
1440+/* typ-435 %txt /tests/golden/types-partial-unresolved-tag/types/txt
1332|%
1441|%
1333:: one arm per case
1442:: one arm per case
1334::
1443::
@@ -2078,94 +2187,130 @@
2078 (check ~.lex-tight-wing-ok-1 src-372 `tok-372 `tre-372)
2187 (check ~.lex-tight-wing-ok-1 src-372 `tok-372 `tre-372)
2079++ test-module-fixture-eof
2188++ test-module-fixture-eof
2080 (weld (check ~.module-fixture-eof src-373 `tok-373 `tre-373) (check-module-trees ~.module-fixture-eof `mtre-373 ~[['/ui/incomplete.jibb' ~[~.ui ~.incomplete ~.jibb] mod-373-1]]))
2189 (weld (check ~.module-fixture-eof src-373 `tok-373 `tre-373) (check-module-trees ~.module-fixture-eof `mtre-373 ~[['/ui/incomplete.jibb' ~[~.ui ~.incomplete ~.jibb] mod-373-1]]))
2190+++ test-module-import-atom-scheme
2191+ (weld (weld (check ~.module-import-atom-scheme src-374 `tok-374 `tre-374) (check-module-types ~.module-import-atom-scheme ~[%tests %golden ~.module-import-atom-scheme %source %jibb] src-374 `typ-374 ~ ~ ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-374-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-374-2]])) (check-module-trees ~.module-import-atom-scheme `mtre-374 ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-374-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-374-2]]))
2192+++ test-module-import-cycle
2193+ (weld (weld (check-at ~.module-import-cycle ~[~.ui ~.main ~.jibb] src-375 `tok-375 `tre-375) (check-module-types ~.module-import-cycle ~[~.ui ~.main ~.jibb] src-375 `typ-375 ~ ~ ~[['/ui/a.jibb' ~[~.ui ~.a ~.jibb] mod-375-1] ['/ui/b.jibb' ~[~.ui ~.b ~.jibb] mod-375-2]])) (check-module-trees ~.module-import-cycle `mtre-375 ~[['/ui/a.jibb' ~[~.ui ~.a ~.jibb] mod-375-1] ['/ui/b.jibb' ~[~.ui ~.b ~.jibb] mod-375-2]]))
2194+++ test-module-import-empty
2195+ (weld (check ~.module-import-empty src-376 `tok-376 `tre-376) (check-module-types ~.module-import-empty ~[%tests %golden ~.module-import-empty %source %jibb] src-376 `typ-376 ~ ~ ~))
2196+++ test-module-import-face-shadow
2197+ (weld (weld (check ~.module-import-face-shadow src-377 `tok-377 `tre-377) (check-module-types ~.module-import-face-shadow ~[%tests %golden ~.module-import-face-shadow %source %jibb] src-377 `typ-377 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-377-1]])) (check-module-trees ~.module-import-face-shadow `mtre-377 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-377-1]]))
2198+++ test-module-import-identity
2199+ (weld (weld (check ~.module-import-identity src-378 `tok-378 `tre-378) (check-module-types ~.module-import-identity ~[%tests %golden ~.module-import-identity %source %jibb] src-378 `typ-378 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-378-1]])) (check-module-trees ~.module-import-identity `mtre-378 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-378-1]]))
2200+++ test-module-import-invalid
2201+ (weld (weld (check ~.module-import-invalid src-379 `tok-379 `tre-379) (check-module-types ~.module-import-invalid ~[%tests %golden ~.module-import-invalid %source %jibb] src-379 `typ-379 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-379-1]])) (check-module-trees ~.module-import-invalid `mtre-379 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-379-1]]))
2202+++ test-module-import-missing-member
2203+ (weld (weld (check ~.module-import-missing-member src-380 `tok-380 `tre-380) (check-module-types ~.module-import-missing-member ~[%tests %golden ~.module-import-missing-member %source %jibb] src-380 `typ-380 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-380-1]])) (check-module-trees ~.module-import-missing-member `mtre-380 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-380-1]]))
2204+++ test-module-import-mold
2205+ (weld (weld (check ~.module-import-mold src-381 `tok-381 `tre-381) (check-module-types ~.module-import-mold ~[%tests %golden ~.module-import-mold %source %jibb] src-381 `typ-381 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-381-1]])) (check-module-trees ~.module-import-mold `mtre-381 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-381-1]]))
2206+++ test-module-import-prelude-cross-namespace
2207+ (weld (check ~.module-import-prelude-cross-namespace src-382 `tok-382 `tre-382) (check-module-types ~.module-import-prelude-cross-namespace ~[%tests %golden ~.module-import-prelude-cross-namespace %source %jibb] src-382 `typ-382 ~ ~ ~))
2208+++ test-module-import-prelude-mold-shadow
2209+ (weld (check ~.module-import-prelude-mold-shadow src-383 `tok-383 `tre-383) (check-module-types ~.module-import-prelude-mold-shadow ~[%tests %golden ~.module-import-prelude-mold-shadow %source %jibb] src-383 `typ-383 ~ ~ ~))
2210+++ test-module-import-prelude-sample-shadow
2211+ (weld (weld (check ~.module-import-prelude-sample-shadow src-384 `tok-384 `tre-384) (check-module-types ~.module-import-prelude-sample-shadow ~[%tests %golden ~.module-import-prelude-sample-shadow %source %jibb] src-384 `typ-384 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-384-1]])) (check-module-trees ~.module-import-prelude-sample-shadow `mtre-384 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-384-1]]))
2212+++ test-module-import-prelude-value-shadow
2213+ (weld (weld (check ~.module-import-prelude-value-shadow src-385 `tok-385 `tre-385) (check-module-types ~.module-import-prelude-value-shadow ~[%tests %golden ~.module-import-prelude-value-shadow %source %jibb] src-385 `typ-385 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-385-1]])) (check-module-trees ~.module-import-prelude-value-shadow `mtre-385 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-385-1]]))
2214+++ test-module-import-root-cycle
2215+ (weld (weld (check-at ~.module-import-root-cycle ~[~.ui ~.main ~.jibb] src-386 `tok-386 `tre-386) (check-module-types ~.module-import-root-cycle ~[~.ui ~.main ~.jibb] src-386 `typ-386 ~ ~ ~[['/ui/a.jibb' ~[~.ui ~.a ~.jibb] mod-386-1]])) (check-module-trees ~.module-import-root-cycle `mtre-386 ~[['/ui/a.jibb' ~[~.ui ~.a ~.jibb] mod-386-1]]))
2216+++ test-module-import-root-import-shadow
2217+ (weld (check ~.module-import-root-import-shadow src-387 `tok-387 `tre-387) (check-module-types ~.module-import-root-import-shadow ~[%tests %golden ~.module-import-root-import-shadow %source %jibb] src-387 `typ-387 ~[[%fixture %title imp-387-1]] ~[[%label mark-387-1]] ~))
2218+++ test-module-import-separate-namespaces
2219+ (weld (weld (check ~.module-import-separate-namespaces src-388 `tok-388 `tre-388) (check-module-types ~.module-import-separate-namespaces ~[%tests %golden ~.module-import-separate-namespaces %source %jibb] src-388 `typ-388 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-388-1]])) (check-module-trees ~.module-import-separate-namespaces `mtre-388 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-388-1]]))
2220+++ test-module-import-sur-scope
2221+ (weld (weld (check ~.module-import-sur-scope src-389 `tok-389 `tre-389) (check-module-types ~.module-import-sur-scope ~[%tests %golden ~.module-import-sur-scope %source %jibb] src-389 `typ-389 ~[[%fixture %title imp-389-1]] ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-389-1]])) (check-module-trees ~.module-import-sur-scope `mtre-389 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-389-1]]))
2222+++ test-module-import-transitive
2223+ (weld (weld (check-at ~.module-import-transitive ~[~.ui ~.main ~.jibb] src-390 `tok-390 `tre-390) (check-module-types ~.module-import-transitive ~[~.ui ~.main ~.jibb] src-390 `typ-390 ~ ~ ~[['/ui/a.jibb' ~[~.ui ~.a ~.jibb] mod-390-1] ['/ui/b.jibb' ~[~.ui ~.b ~.jibb] mod-390-2] ['/ui/c.jibb' ~[~.ui ~.c ~.jibb] mod-390-3]])) (check-module-trees ~.module-import-transitive `mtre-390 ~[['/ui/a.jibb' ~[~.ui ~.a ~.jibb] mod-390-1] ['/ui/b.jibb' ~[~.ui ~.b ~.jibb] mod-390-2] ['/ui/c.jibb' ~[~.ui ~.c ~.jibb] mod-390-3]]))
2224+++ test-module-import-unused-invalid
2225+ (weld (weld (check ~.module-import-unused-invalid src-391 `tok-391 `tre-391) (check-module-types ~.module-import-unused-invalid ~[%tests %golden ~.module-import-unused-invalid %source %jibb] src-391 `typ-391 ~ ~ ~[['/ui/good.jibb' ~[~.ui ~.good ~.jibb] mod-391-1] ['/ui/unused.jibb' ~[~.ui ~.unused ~.jibb] mod-391-2]])) (check-module-trees ~.module-import-unused-invalid `mtre-391 ~[['/ui/good.jibb' ~[~.ui ~.good ~.jibb] mod-391-1] ['/ui/unused.jibb' ~[~.ui ~.unused ~.jibb] mod-391-2]]))
2081++ test-prelude-1c-structural
2226++ test-prelude-1c-structural
2082− (weld (check ~.prelude-1c-structural src-374 `tok-374 `tre-374) (check-types ~.prelude-1c-structural ~[%tests %golden ~.prelude-1c-structural %source %jibb] src-374 `typ-374))
2227+ (weld (check ~.prelude-1c-structural src-392 `tok-392 `tre-392) (check-types ~.prelude-1c-structural ~[%tests %golden ~.prelude-1c-structural %source %jibb] src-392 `typ-392))
2083++ test-prelude-3g-basic
2228++ test-prelude-3g-basic
2084− (weld (check ~.prelude-3g-basic src-375 `tok-375 `tre-375) (check-types ~.prelude-3g-basic ~[%tests %golden ~.prelude-3g-basic %source %jibb] src-375 `typ-375))
2229+ (weld (check ~.prelude-3g-basic src-393 `tok-393 `tre-393) (check-types ~.prelude-3g-basic ~[%tests %golden ~.prelude-3g-basic %source %jibb] src-393 `typ-393))
2085++ test-prelude-3g-like
2230++ test-prelude-3g-like
2086− (weld (check ~.prelude-3g-like src-376 `tok-376 `tre-376) (check-types ~.prelude-3g-like ~[%tests %golden ~.prelude-3g-like %source %jibb] src-376 `typ-376))
2231+ (weld (check ~.prelude-3g-like src-394 `tok-394 `tre-394) (check-types ~.prelude-3g-like ~[%tests %golden ~.prelude-3g-like %source %jibb] src-394 `typ-394))
2087++ test-prelude-3g-structural
2232++ test-prelude-3g-structural
2088− (weld (check ~.prelude-3g-structural src-377 `tok-377 `tre-377) (check-types ~.prelude-3g-structural ~[%tests %golden ~.prelude-3g-structural %source %jibb] src-377 `typ-377))
2233+ (weld (check ~.prelude-3g-structural src-395 `tok-395 `tre-395) (check-types ~.prelude-3g-structural ~[%tests %golden ~.prelude-3g-structural %source %jibb] src-395 `typ-395))
2089++ test-prelude-core-functions
2234++ test-prelude-core-functions
2090− (weld (check ~.prelude-core-functions src-378 `tok-378 `tre-378) (check-types ~.prelude-core-functions ~[%tests %golden ~.prelude-core-functions %source %jibb] src-378 `typ-378))
2235+ (weld (check ~.prelude-core-functions src-396 `tok-396 `tre-396) (check-types ~.prelude-core-functions ~[%tests %golden ~.prelude-core-functions %source %jibb] src-396 `typ-396))
2091++ test-prelude-list-helpers
2236++ test-prelude-list-helpers
2092− (weld (check ~.prelude-list-helpers src-379 `tok-379 `tre-379) (check-types ~.prelude-list-helpers ~[%tests %golden ~.prelude-list-helpers %source %jibb] src-379 `typ-379))
2237+ (weld (check ~.prelude-list-helpers src-397 `tok-397 `tre-397) (check-types ~.prelude-list-helpers ~[%tests %golden ~.prelude-list-helpers %source %jibb] src-397 `typ-397))
2093++ test-prelude-list-unit
2238++ test-prelude-list-unit
2094− (weld (check ~.prelude-list-unit src-380 `tok-380 `tre-380) (check-types ~.prelude-list-unit ~[%tests %golden ~.prelude-list-unit %source %jibb] src-380 `typ-380))
2239+ (weld (check ~.prelude-list-unit src-398 `tok-398 `tre-398) (check-types ~.prelude-list-unit ~[%tests %golden ~.prelude-list-unit %source %jibb] src-398 `typ-398))
2095++ test-prelude-unit-list-transforms
2240++ test-prelude-unit-list-transforms
2096− (weld (check ~.prelude-unit-list-transforms src-381 `tok-381 `tre-381) (check-types ~.prelude-unit-list-transforms ~[%tests %golden ~.prelude-unit-list-transforms %source %jibb] src-381 `typ-381))
2241+ (weld (check ~.prelude-unit-list-transforms src-399 `tok-399 `tre-399) (check-types ~.prelude-unit-list-transforms ~[%tests %golden ~.prelude-unit-list-transforms %source %jibb] src-399 `typ-399))
2097++ test-types-import-mark
2242++ test-types-import-mark
2098− (weld (check ~.types-import-mark src-382 `tok-382 `tre-382) (check-mark-types ~.types-import-mark ~[%tests %golden ~.types-import-mark %source %jibb] src-382 `typ-382 ~[[%fixture %title imp-382-1]] ~[[%label mark-382-1]]))
2243+ (weld (check ~.types-import-mark src-400 `tok-400 `tre-400) (check-mark-types ~.types-import-mark ~[%tests %golden ~.types-import-mark %source %jibb] src-400 `typ-400 ~[[%fixture %title imp-400-1]] ~[[%label mark-400-1]]))
2099++ test-types-import-missing-mold
2244++ test-types-import-missing-mold
2100− (weld (check ~.types-import-missing-mold src-383 `tok-383 `tre-383) (check-import-types ~.types-import-missing-mold ~[%tests %golden ~.types-import-missing-mold %source %jibb] src-383 `typ-383 ~[[%fixture %missing imp-383-1]]))
2245+ (weld (check ~.types-import-missing-mold src-401 `tok-401 `tre-401) (check-import-types ~.types-import-missing-mold ~[%tests %golden ~.types-import-missing-mold %source %jibb] src-401 `typ-401 ~[[%fixture %missing imp-401-1]]))
2101++ test-types-import-sur
2246++ test-types-import-sur
2102− (weld (check ~.types-import-sur src-384 `tok-384 `tre-384) (check-import-types ~.types-import-sur ~[%tests %golden ~.types-import-sur %source %jibb] src-384 `typ-384 ~[[%fixture %title imp-384-1] [%fixture %pair imp-384-2]]))
2247+ (weld (check ~.types-import-sur src-402 `tok-402 `tre-402) (check-import-types ~.types-import-sur ~[%tests %golden ~.types-import-sur %source %jibb] src-402 `typ-402 ~[[%fixture %title imp-402-1] [%fixture %pair imp-402-2]]))
2103++ test-types-module-fixtures
2248++ test-types-module-fixtures
2104− (weld (weld (check-at ~.types-module-fixtures ~[~.ui ~.blog ~.index ~.jibb] src-385 `tok-385 `tre-385) (check-module-types ~.types-module-fixtures ~[~.ui ~.blog ~.index ~.jibb] src-385 `typ-385 ~ ~ ~[['/ui/api/blog.jibb' ~[~.ui ~.api ~.blog ~.jibb] mod-385-1] ['/ui/components/card.jibb' ~[~.ui ~.components ~.card ~.jibb] mod-385-2]])) (check-module-trees ~.types-module-fixtures `mtre-385 ~[['/ui/api/blog.jibb' ~[~.ui ~.api ~.blog ~.jibb] mod-385-1] ['/ui/components/card.jibb' ~[~.ui ~.components ~.card ~.jibb] mod-385-2]]))
2249+ (weld (weld (check-at ~.types-module-fixtures ~[~.ui ~.blog ~.index ~.jibb] src-403 `tok-403 `tre-403) (check-module-types ~.types-module-fixtures ~[~.ui ~.blog ~.index ~.jibb] src-403 `typ-403 ~ ~ ~[['/ui/api/blog.jibb' ~[~.ui ~.api ~.blog ~.jibb] mod-403-1] ['/ui/components/card.jibb' ~[~.ui ~.components ~.card ~.jibb] mod-403-2]])) (check-module-trees ~.types-module-fixtures `mtre-403 ~[['/ui/api/blog.jibb' ~[~.ui ~.api ~.blog ~.jibb] mod-403-1] ['/ui/components/card.jibb' ~[~.ui ~.components ~.card ~.jibb] mod-403-2]]))
2105++ test-types-module-mixed
2250++ test-types-module-mixed
2106− (weld (weld (check ~.types-module-mixed src-386 `tok-386 `tre-386) (check-module-types ~.types-module-mixed ~[%tests %golden ~.types-module-mixed %source %jibb] src-386 `typ-386 ~[[%fixture %title imp-386-1]] ~[[%label mark-386-1]] ~[['/ui/helper.jibb' ~[~.ui ~.helper ~.jibb] mod-386-1]])) (check-module-trees ~.types-module-mixed `mtre-386 ~[['/ui/helper.jibb' ~[~.ui ~.helper ~.jibb] mod-386-1]]))
2251+ (weld (weld (check ~.types-module-mixed src-404 `tok-404 `tre-404) (check-module-types ~.types-module-mixed ~[%tests %golden ~.types-module-mixed %source %jibb] src-404 `typ-404 ~[[%fixture %title imp-404-1]] ~[[%label mark-404-1]] ~[['/ui/helper.jibb' ~[~.ui ~.helper ~.jibb] mod-404-1]])) (check-module-trees ~.types-module-mixed `mtre-404 ~[['/ui/helper.jibb' ~[~.ui ~.helper ~.jibb] mod-404-1]]))
2107++ test-types-partial-apply
2252++ test-types-partial-apply
2108− (weld (check ~.types-partial-apply src-387 `tok-387 `tre-387) (check-types ~.types-partial-apply ~[%tests %golden ~.types-partial-apply %source %jibb] src-387 `typ-387))
2253+ (weld (check ~.types-partial-apply src-405 `tok-405 `tre-405) (check-types ~.types-partial-apply ~[%tests %golden ~.types-partial-apply %source %jibb] src-405 `typ-405))
2109++ test-types-partial-atom-alias
2254++ test-types-partial-atom-alias
2110− (weld (check ~.types-partial-atom-alias src-388 `tok-388 `tre-388) (check-types ~.types-partial-atom-alias ~[%tests %golden ~.types-partial-atom-alias %source %jibb] src-388 `typ-388))
2255+ (weld (check ~.types-partial-atom-alias src-406 `tok-406 `tre-406) (check-types ~.types-partial-atom-alias ~[%tests %golden ~.types-partial-atom-alias %source %jibb] src-406 `typ-406))
2111++ test-types-partial-atom-constraint
2256++ test-types-partial-atom-constraint
2112− (weld (check ~.types-partial-atom-constraint src-389 `tok-389 `tre-389) (check-types ~.types-partial-atom-constraint ~[%tests %golden ~.types-partial-atom-constraint %source %jibb] src-389 `typ-389))
2257+ (weld (check ~.types-partial-atom-constraint src-407 `tok-407 `tre-407) (check-types ~.types-partial-atom-constraint ~[%tests %golden ~.types-partial-atom-constraint %source %jibb] src-407 `typ-407))
2113++ test-types-partial-atom-widening
2258++ test-types-partial-atom-widening
2114− (weld (check ~.types-partial-atom-widening src-390 `tok-390 `tre-390) (check-types ~.types-partial-atom-widening ~[%tests %golden ~.types-partial-atom-widening %source %jibb] src-390 `typ-390))
2259+ (weld (check ~.types-partial-atom-widening src-408 `tok-408 `tre-408) (check-types ~.types-partial-atom-widening ~[%tests %golden ~.types-partial-atom-widening %source %jibb] src-408 `typ-408))
2115++ test-types-partial-aura
2260++ test-types-partial-aura
2116− (weld (check ~.types-partial-aura src-391 `tok-391 `tre-391) (check-types ~.types-partial-aura ~[%tests %golden ~.types-partial-aura %source %jibb] src-391 `typ-391))
2261+ (weld (check ~.types-partial-aura src-409 `tok-409 `tre-409) (check-types ~.types-partial-aura ~[%tests %golden ~.types-partial-aura %source %jibb] src-409 `typ-409))
2117++ test-types-partial-aura-family
2262++ test-types-partial-aura-family
2118− (weld (check ~.types-partial-aura-family src-392 `tok-392 `tre-392) (check-types ~.types-partial-aura-family ~[%tests %golden ~.types-partial-aura-family %source %jibb] src-392 `typ-392))
2263+ (weld (check ~.types-partial-aura-family src-410 `tok-410 `tre-410) (check-types ~.types-partial-aura-family ~[%tests %golden ~.types-partial-aura-family %source %jibb] src-410 `typ-410))
2119++ test-types-partial-aura-generalization
2264++ test-types-partial-aura-generalization
2120− (weld (check ~.types-partial-aura-generalization src-393 `tok-393 `tre-393) (check-types ~.types-partial-aura-generalization ~[%tests %golden ~.types-partial-aura-generalization %source %jibb] src-393 `typ-393))
2265+ (weld (check ~.types-partial-aura-generalization src-411 `tok-411 `tre-411) (check-types ~.types-partial-aura-generalization ~[%tests %golden ~.types-partial-aura-generalization %source %jibb] src-411 `typ-411))
2121++ test-types-partial-bare-atom
2266++ test-types-partial-bare-atom
2122− (weld (check ~.types-partial-bare-atom src-394 `tok-394 `tre-394) (check-types ~.types-partial-bare-atom ~[%tests %golden ~.types-partial-bare-atom %source %jibb] src-394 `typ-394))
2267+ (weld (check ~.types-partial-bare-atom src-412 `tok-412 `tre-412) (check-types ~.types-partial-bare-atom ~[%tests %golden ~.types-partial-bare-atom %source %jibb] src-412 `typ-412))
2123++ test-types-partial-branch-widening
2268++ test-types-partial-branch-widening
2124− (weld (check ~.types-partial-branch-widening src-395 `tok-395 `tre-395) (check-types ~.types-partial-branch-widening ~[%tests %golden ~.types-partial-branch-widening %source %jibb] src-395 `typ-395))
2269+ (weld (check ~.types-partial-branch-widening src-413 `tok-413 `tre-413) (check-types ~.types-partial-branch-widening ~[%tests %golden ~.types-partial-branch-widening %source %jibb] src-413 `typ-413))
2125++ test-types-partial-conflicting-sites
2270++ test-types-partial-conflicting-sites
2126− (weld (check ~.types-partial-conflicting-sites src-396 `tok-396 `tre-396) (check-types ~.types-partial-conflicting-sites ~[%tests %golden ~.types-partial-conflicting-sites %source %jibb] src-396 `typ-396))
2271+ (weld (check ~.types-partial-conflicting-sites src-414 `tok-414 `tre-414) (check-types ~.types-partial-conflicting-sites ~[%tests %golden ~.types-partial-conflicting-sites %source %jibb] src-414 `typ-414))
2127++ test-types-partial-decimal-default
2272++ test-types-partial-decimal-default
2128− (weld (check ~.types-partial-decimal-default src-397 `tok-397 `tre-397) (check-types ~.types-partial-decimal-default ~[%tests %golden ~.types-partial-decimal-default %source %jibb] src-397 `typ-397))
2273+ (weld (check ~.types-partial-decimal-default src-415 `tok-415 `tre-415) (check-types ~.types-partial-decimal-default ~[%tests %golden ~.types-partial-decimal-default %source %jibb] src-415 `typ-415))
2129++ test-types-partial-dependency-chain
2274++ test-types-partial-dependency-chain
2130− (weld (check ~.types-partial-dependency-chain src-398 `tok-398 `tre-398) (check-types ~.types-partial-dependency-chain ~[%tests %golden ~.types-partial-dependency-chain %source %jibb] src-398 `typ-398))
2275+ (weld (check ~.types-partial-dependency-chain src-416 `tok-416 `tre-416) (check-types ~.types-partial-dependency-chain ~[%tests %golden ~.types-partial-dependency-chain %source %jibb] src-416 `typ-416))
2131++ test-types-partial-explicit-capital
2276++ test-types-partial-explicit-capital
2132− (weld (check ~.types-partial-explicit-capital src-399 `tok-399 `tre-399) (check-types ~.types-partial-explicit-capital ~[%tests %golden ~.types-partial-explicit-capital %source %jibb] src-399 `typ-399))
2277+ (weld (check ~.types-partial-explicit-capital src-417 `tok-417 `tre-417) (check-types ~.types-partial-explicit-capital ~[%tests %golden ~.types-partial-explicit-capital %source %jibb] src-417 `typ-417))
2133++ test-types-partial-forward
2278++ test-types-partial-forward
2134− (weld (check ~.types-partial-forward src-400 `tok-400 `tre-400) (check-types ~.types-partial-forward ~[%tests %golden ~.types-partial-forward %source %jibb] src-400 `typ-400))
2279+ (weld (check ~.types-partial-forward src-418 `tok-418 `tre-418) (check-types ~.types-partial-forward ~[%tests %golden ~.types-partial-forward %source %jibb] src-418 `typ-418))
2135++ test-types-partial-generalization
2280++ test-types-partial-generalization
2136− (weld (check ~.types-partial-generalization src-401 `tok-401 `tre-401) (check-types ~.types-partial-generalization ~[%tests %golden ~.types-partial-generalization %source %jibb] src-401 `typ-401))
2281+ (weld (check ~.types-partial-generalization src-419 `tok-419 `tre-419) (check-types ~.types-partial-generalization ~[%tests %golden ~.types-partial-generalization %source %jibb] src-419 `typ-419))
2137++ test-types-partial-identity
2282++ test-types-partial-identity
2138− (weld (check ~.types-partial-identity src-402 `tok-402 `tre-402) (check-types ~.types-partial-identity ~[%tests %golden ~.types-partial-identity %source %jibb] src-402 `typ-402))
2283+ (weld (check ~.types-partial-identity src-420 `tok-420 `tre-420) (check-types ~.types-partial-identity ~[%tests %golden ~.types-partial-identity %source %jibb] src-420 `typ-420))
2139++ test-types-partial-independent-atoms
2284++ test-types-partial-independent-atoms
2140− (weld (check ~.types-partial-independent-atoms src-403 `tok-403 `tre-403) (check-types ~.types-partial-independent-atoms ~[%tests %golden ~.types-partial-independent-atoms %source %jibb] src-403 `typ-403))
2285+ (weld (check ~.types-partial-independent-atoms src-421 `tok-421 `tre-421) (check-types ~.types-partial-independent-atoms ~[%tests %golden ~.types-partial-independent-atoms %source %jibb] src-421 `typ-421))
2141++ test-types-partial-local-molds
2286++ test-types-partial-local-molds
2142− (weld (check ~.types-partial-local-molds src-404 `tok-404 `tre-404) (check-types ~.types-partial-local-molds ~[%tests %golden ~.types-partial-local-molds %source %jibb] src-404 `typ-404))
2287+ (weld (check ~.types-partial-local-molds src-422 `tok-422 `tre-422) (check-types ~.types-partial-local-molds ~[%tests %golden ~.types-partial-local-molds %source %jibb] src-422 `typ-422))
2143++ test-types-partial-locals
2288++ test-types-partial-locals
2144− (weld (check ~.types-partial-locals src-405 `tok-405 `tre-405) (check-types ~.types-partial-locals ~[%tests %golden ~.types-partial-locals %source %jibb] src-405 `typ-405))
2289+ (weld (check ~.types-partial-locals src-423 `tok-423 `tre-423) (check-types ~.types-partial-locals ~[%tests %golden ~.types-partial-locals %source %jibb] src-423 `typ-423))
2145++ test-types-partial-many-atom-constraints
2290++ test-types-partial-many-atom-constraints
2146− (weld (check ~.types-partial-many-atom-constraints src-406 `tok-406 `tre-406) (check-types ~.types-partial-many-atom-constraints ~[%tests %golden ~.types-partial-many-atom-constraints %source %jibb] src-406 `typ-406))
2291+ (weld (check ~.types-partial-many-atom-constraints src-424 `tok-424 `tre-424) (check-types ~.types-partial-many-atom-constraints ~[%tests %golden ~.types-partial-many-atom-constraints %source %jibb] src-424 `typ-424))
2147++ test-types-partial-mold-bare-aura
2292++ test-types-partial-mold-bare-aura
2148− (weld (check ~.types-partial-mold-bare-aura src-407 `tok-407 `tre-407) (check-types ~.types-partial-mold-bare-aura ~[%tests %golden ~.types-partial-mold-bare-aura %source %jibb] src-407 `typ-407))
2293+ (weld (check ~.types-partial-mold-bare-aura src-425 `tok-425 `tre-425) (check-types ~.types-partial-mold-bare-aura ~[%tests %golden ~.types-partial-mold-bare-aura %source %jibb] src-425 `typ-425))
2149++ test-types-partial-mold-composite
2294++ test-types-partial-mold-composite
2150− (weld (check ~.types-partial-mold-composite src-408 `tok-408 `tre-408) (check-types ~.types-partial-mold-composite ~[%tests %golden ~.types-partial-mold-composite %source %jibb] src-408 `typ-408))
2295+ (weld (check ~.types-partial-mold-composite src-426 `tok-426 `tre-426) (check-types ~.types-partial-mold-composite ~[%tests %golden ~.types-partial-mold-composite %source %jibb] src-426 `typ-426))
2151++ test-types-partial-mold-forward
2296++ test-types-partial-mold-forward
2152− (weld (check ~.types-partial-mold-forward src-409 `tok-409 `tre-409) (check-types ~.types-partial-mold-forward ~[%tests %golden ~.types-partial-mold-forward %source %jibb] src-409 `typ-409))
2297+ (weld (check ~.types-partial-mold-forward src-427 `tok-427 `tre-427) (check-types ~.types-partial-mold-forward ~[%tests %golden ~.types-partial-mold-forward %source %jibb] src-427 `typ-427))
2153++ test-types-partial-mold-recursive
2298++ test-types-partial-mold-recursive
2154− (weld (check ~.types-partial-mold-recursive src-410 `tok-410 `tre-410) (check-types ~.types-partial-mold-recursive ~[%tests %golden ~.types-partial-mold-recursive %source %jibb] src-410 `typ-410))
2299+ (weld (check ~.types-partial-mold-recursive src-428 `tok-428 `tre-428) (check-types ~.types-partial-mold-recursive ~[%tests %golden ~.types-partial-mold-recursive %source %jibb] src-428 `typ-428))
2155++ test-types-partial-occurs
2300++ test-types-partial-occurs
2156− (weld (check ~.types-partial-occurs src-411 `tok-411 `tre-411) (check-types ~.types-partial-occurs ~[%tests %golden ~.types-partial-occurs %source %jibb] src-411 `typ-411))
2301+ (weld (check ~.types-partial-occurs src-429 `tok-429 `tre-429) (check-types ~.types-partial-occurs ~[%tests %golden ~.types-partial-occurs %source %jibb] src-429 `typ-429))
2157++ test-types-partial-projection
2302++ test-types-partial-projection
2158− (weld (check ~.types-partial-projection src-412 `tok-412 `tre-412) (check-types ~.types-partial-projection ~[%tests %golden ~.types-partial-projection %source %jibb] src-412 `typ-412))
2303+ (weld (check ~.types-partial-projection src-430 `tok-430 `tre-430) (check-types ~.types-partial-projection ~[%tests %golden ~.types-partial-projection %source %jibb] src-430 `typ-430))
2159++ test-types-partial-shadow-global
2304++ test-types-partial-shadow-global
2160− (weld (check ~.types-partial-shadow-global src-413 `tok-413 `tre-413) (check-types ~.types-partial-shadow-global ~[%tests %golden ~.types-partial-shadow-global %source %jibb] src-413 `typ-413))
2305+ (weld (check ~.types-partial-shadow-global src-431 `tok-431 `tre-431) (check-types ~.types-partial-shadow-global ~[%tests %golden ~.types-partial-shadow-global %source %jibb] src-431 `typ-431))
2161++ test-types-partial-shared-tvar
2306++ test-types-partial-shared-tvar
2162− (weld (check ~.types-partial-shared-tvar src-414 `tok-414 `tre-414) (check-types ~.types-partial-shared-tvar ~[%tests %golden ~.types-partial-shared-tvar %source %jibb] src-414 `typ-414))
2307+ (weld (check ~.types-partial-shared-tvar src-432 `tok-432 `tre-432) (check-types ~.types-partial-shared-tvar ~[%tests %golden ~.types-partial-shared-tvar %source %jibb] src-432 `typ-432))
2163++ test-types-partial-union-cases
2308++ test-types-partial-union-cases
2164− (weld (check ~.types-partial-union-cases src-415 `tok-415 `tre-415) (check-types ~.types-partial-union-cases ~[%tests %golden ~.types-partial-union-cases %source %jibb] src-415 `typ-415))
2309+ (weld (check ~.types-partial-union-cases src-433 `tok-433 `tre-433) (check-types ~.types-partial-union-cases ~[%tests %golden ~.types-partial-union-cases %source %jibb] src-433 `typ-433))
2165++ test-types-partial-union-edges
2310++ test-types-partial-union-edges
2166− (weld (check ~.types-partial-union-edges src-416 `tok-416 `tre-416) (check-types ~.types-partial-union-edges ~[%tests %golden ~.types-partial-union-edges %source %jibb] src-416 `typ-416))
2311+ (weld (check ~.types-partial-union-edges src-434 `tok-434 `tre-434) (check-types ~.types-partial-union-edges ~[%tests %golden ~.types-partial-union-edges %source %jibb] src-434 `typ-434))
2167++ test-types-partial-unresolved-tag
2312++ test-types-partial-unresolved-tag
2168− (weld (check ~.types-partial-unresolved-tag src-417 `tok-417 `tre-417) (check-types ~.types-partial-unresolved-tag ~[%tests %golden ~.types-partial-unresolved-tag %source %jibb] src-417 `typ-417))
2313+ (weld (check ~.types-partial-unresolved-tag src-435 `tok-435 `tre-435) (check-types ~.types-partial-unresolved-tag ~[%tests %golden ~.types-partial-unresolved-tag %source %jibb] src-435 `typ-435))
2169::
2314::
2170:: +check: run golden:jibb on a case and compare both outputs
2315:: +check: run golden:jibb on a case and compare both outputs
2171::
2316::
@@ -2327,5 +2472,5 @@
2327 [name.fixture (read-mark:jibb-import name.fixture cor)]
2472 [name.fixture (read-mark:jibb-import name.fixture cor)]
2328 =/ sources=(list [path=path source=@t])
2473 =/ sources=(list [path=path source=@t])
2329 (turn modules |=(item=[label=@t at=path source=@t] [at.item source.item]))
2474 (turn modules |=(item=[label=@t at=path source=@t] [at.item source.item]))
2330− (golden-types-with-modules:jibb at src external mark-external sources)
2475+ (golden-types-with-prelude:jibb at src external mark-external sources prelude-source)
2331--
2476--
tests/type-module-scope/about.txtnew file+5
@@ -0,0 +1,5 @@
1+The partial Jibb module interface is available only with a parseable prelude
2+source. Names from the prelude occupy separate value and mold namespaces;
3+import faces cannot shadow either. This synthetic prelude exercises a value
4+whose name is used as an imported mold and a mold whose name is used as an
5+imported value. Empty and malformed prelude sources fail closed.
tests/type-module-scope/expected.txtnew file+9
@@ -0,0 +1,9 @@
1+partial inference; module not checked
2+++ identity: $-(@t @t)
3+++ atom: @p
4+partial inference; module not checked
5+prelude source missing; module import inference unsupported
6+partial inference; module not checked
7+prelude source does not parse; module import inference unsupported
8+partial inference; module not checked
9+module has conflicting names
tools/golden+21−7
@@ -55,7 +55,7 @@ HARNESS = r""":: The harness tools/golden writes after the library. It runs
55 ==
55 ==
56::
56::
57++ run
57++ run
58− |= [name=@t metadata=[logical=(unit path) check=? imports=(list [module=term mold=term source=@t]) marks=(list [name=term source=@t]) modules=(list [label=@t at=path source=@t])] src=@t]
58+ |= [name=@t metadata=[logical=(unit path) check=? imports=(list [module=term mold=term source=@t]) marks=(list [name=term source=@t]) module-check=? modules=(list [label=@t at=path source=@t])] src=@t]
59 ^- @t
59 ^- @t
60 =/ at=path ?~(logical.metadata (file name) u.logical.metadata)
60 =/ at=path ?~(logical.metadata (file name) u.logical.metadata)
61 =/ parsed (mule |.((golden:lib at src)))
61 =/ parsed (mule |.((golden:lib at src)))
@@ -96,6 +96,7 @@ HARNESS = r""":: The harness tools/golden writes after the library. It runs
96 (rap 3 ~[(crip (a-co:co (met 3 b))) ':' b ','])
96 (rap 3 ~[(crip (a-co:co (met 3 b))) ':' b ','])
97{import-helper}
97{import-helper}
98{module-helper}
98{module-helper}
99+{prelude-helper}
99--
100--
100"""
101"""
101
102
@@ -161,6 +162,7 @@ class Case:
161 self.imports = golden_case.sur_imports(folder)
162 self.imports = golden_case.sur_imports(folder)
162 self.marks = golden_case.mark_imports(folder)
163 self.marks = golden_case.mark_imports(folder)
163 self.modules = golden_case.module_fixtures(folder)
164 self.modules = golden_case.module_fixtures(folder)
165+ self.want_modules = golden_case.wants_modules(folder)
164 except ValueError as e:
166 except ValueError as e:
165 raise ue.ToolError(str(e))
167 raise ue.ToolError(str(e))
166 self.want_types = golden_case.wants_types(folder)
168 self.want_types = golden_case.wants_types(folder)
@@ -218,10 +220,11 @@ def run_lines(case):
218 source = '(rap 3 `(list @t)`~[%s])' % ' '.join(ue.cord_literal(p) for p in parts)
220 source = '(rap 3 `(list @t)`~[%s])' % ' '.join(ue.cord_literal(p) for p in parts)
219 fixtures.append('[%s %s %s]' % (ue.cord_literal(logical.encode()), at, source))
221 fixtures.append('[%s %s %s]' % (ue.cord_literal(logical.encode()), at, source))
220 modules = '~[' + ' '.join(fixtures) + ']' if fixtures else '~'
222 modules = '~[' + ' '.join(fixtures) + ']' if fixtures else '~'
221− out = [' %%^ run %s [%s %s %s %s %s]' % (
223+ out = [' %%^ run %s [%s %s %s %s %s %s]' % (
222 ue.cord_literal(case.name.encode()),
224 ue.cord_literal(case.name.encode()),
223 '`' + case.logical_path if case.logical_path else '~',
225 '`' + case.logical_path if case.logical_path else '~',
224− '%.y' if case.want_types else '%.n', imports, marks, modules),
226+ '%.y' if case.want_types else '%.n', imports, marks,
227+ '%.y' if case.want_modules else '%.n', modules),
225 ' %- text',
228 ' %- text',
226 ' :~ ' + ue.cord_literal(lines[0])]
229 ' :~ ' + ue.cord_literal(lines[0])]
227 out += [' ' + ue.cord_literal(line) for line in lines[1:]]
230 out += [' ' + ue.cord_literal(line) for line in lines[1:]]
@@ -235,7 +238,7 @@ def golden_program(lib_path, cases):
235 imported = any(c.imports or c.marks for c in cases)
238 imported = any(c.imports or c.marks for c in cases)
236 has_marks = any(c.marks for c in cases)
239 has_marks = any(c.marks for c in cases)
237 has_modules = any(c.modules for c in cases)
240 has_modules = any(c.modules for c in cases)
238− has_module_types = any(c.modules and c.want_types for c in cases)
241+ has_module_types = any(c.want_modules and c.want_types for c in cases)
239 harness = HARNESS
242 harness = HARNESS
240 if imported:
243 if imported:
241 reader = ue.read_text(os.path.join(ue.ROOT, 'jibb-dev', 'lib', 'jibb-import.hoon'))
244 reader = ue.read_text(os.path.join(ue.ROOT, 'jibb-dev', 'lib', 'jibb-import.hoon'))
@@ -252,15 +255,26 @@ def golden_program(lib_path, cases):
252 surs = '(import-types imports.metadata)' if imported else '~'
255 surs = '(import-types imports.metadata)' if imported else '~'
253 marks = '(import-marks marks.metadata)' if imported else '~'
256 marks = '(import-marks marks.metadata)' if imported else '~'
254 modules = '(turn modules.metadata |=(item=[label=@t at=path source=@t] [at.item source.item]))'
257 modules = '(turn modules.metadata |=(item=[label=@t at=path source=@t] [at.item source.item]))'
255− types_value = ('?~(modules.metadata %s (golden-types-with-modules:lib '
258+ types_value = ('?:(module-check.metadata (golden-types-with-prelude:lib '
256− 'at src %s %s %s))' % (types_value, surs, marks, modules))
259+ 'at src %s %s %s prelude-source) %s)' % (surs, marks, modules, types_value))
257 types_expr = '?:(check.metadata %s \'\')' % types_value
260 types_expr = '?:(check.metadata %s \'\')' % types_value
261+ prelude_helper = ''
262+ if has_module_types:
263+ prelude_path = os.path.join(ue.ROOT, 'jibb-dev', 'lib', 'jibb', 'prelude.jibb')
264+ try:
265+ with open(prelude_path, 'rb') as f:
266+ parts = ue.cord_pieces(f.read())
267+ except OSError as e:
268+ raise ue.ToolError('cannot read the Jibb prelude %s: %s' % (prelude_path, e))
269+ prelude_helper = "++ prelude-source\n ^- @t\n (rap 3 `(list @t)`~[%s])\n" % (
270+ ' '.join(ue.cord_literal(p) for p in parts))
258 prog.add(harness.replace('{count}', str(len(cases)))
271 prog.add(harness.replace('{count}', str(len(cases)))
259 .replace('{runs}', runs)
272 .replace('{runs}', runs)
260 .replace('{types-expr}', types_expr if any(c.want_types for c in cases) else "''")
273 .replace('{types-expr}', types_expr if any(c.want_types for c in cases) else "''")
261 .replace('{import-helper}', IMPORT_HELPER if imported else '')
274 .replace('{import-helper}', IMPORT_HELPER if imported else '')
262 .replace('{modules-expr}', '(module-trees modules.metadata)' if has_modules else "''")
275 .replace('{modules-expr}', '(module-trees modules.metadata)' if has_modules else "''")
263− .replace('{module-helper}', MODULE_HELPER if has_modules else ''),
276+ .replace('{module-helper}', MODULE_HELPER if has_modules else '')
277+ .replace('{prelude-helper}', prelude_helper),
264 '(harness)', 'harness')
278 '(harness)', 'harness')
265 return prog
279 return prog
266
280
tools/golden_case.py+7
@@ -115,6 +115,8 @@ def module_fixtures(folder):
115 out, seen = [], set()
115 out, seen = [], set()
116 for number, line in enumerate(lines, 1):
116 for number, line in enumerate(lines, 1):
117 logical = line[:-1] if line.endswith('\n') else line
117 logical = line[:-1] if line.endswith('\n') else line
118+ if not logical.strip() or logical.lstrip().startswith('#'):
119+ continue
118 where = '%s:%d' % (filename, number)
120 where = '%s:%d' % (filename, number)
119 hoon_path = ui_path(logical, where)
121 hoon_path = ui_path(logical, where)
120 if logical in seen:
122 if logical in seen:
@@ -125,3 +127,8 @@ def module_fixtures(folder):
125 seen.add(logical)
127 seen.add(logical)
126 out.append((logical, hoon_path, fixture))
128 out.append((logical, hoon_path, fixture))
127 return out
129 return out
130+
131+
132+def wants_modules(folder):
133+ """A manifest, even without sources, opts into module import checking."""
134+ return os.path.isfile(os.path.join(folder, 'modules.txt'))
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: 81 projections passed')
37+print('importer golden: 90 projections passed')
tools/ship+7−3
@@ -1069,11 +1069,14 @@ def generate_tests(golden):
1069 has_imports |= bool(sur or marks)
1069 has_imports |= bool(sur or marks)
1070 has_marks |= bool(marks)
1070 has_marks |= bool(marks)
1071 has_modules |= bool(modules)
1071 has_modules |= bool(modules)
1072+ has_module_types |= bool(golden_case.wants_modules(folder) and
1072− has_module_types |= bool(modules and golden_case.wants_types(folder))
1073+ golden_case.wants_types(folder))
1073 except ValueError as e:
1074 except ValueError as e:
1074 raise Unable(str(e))
1075 raise Unable(str(e))
1075 lines = [fill(TESTS_HEADER, SOURCE=show(golden)).rstrip('\n'),
1076 lines = [fill(TESTS_HEADER, SOURCE=show(golden)).rstrip('\n'),
1076 '/+ jibb, jibb-import' if has_imports or has_module_types else '/+ jibb']
1077 '/+ jibb, jibb-import' if has_imports or has_module_types else '/+ jibb']
1078+ if has_module_types:
1079+ lines.append('/* prelude-source %jibb /lib/jibb/prelude/jibb')
1077 arms = []
1080 arms = []
1078 for i, ((name, folder), arm) in enumerate(
1081 for i, ((name, folder), arm) in enumerate(
1079 zip(cases, arm_names([c[0] for c in cases])), 1):
1082 zip(cases, arm_names([c[0] for c in cases])), 1):
@@ -1086,6 +1089,7 @@ def generate_tests(golden):
1086 imports = golden_case.sur_imports(folder)
1089 imports = golden_case.sur_imports(folder)
1087 marks = golden_case.mark_imports(folder)
1090 marks = golden_case.mark_imports(folder)
1088 modules = golden_case.module_fixtures(folder)
1091 modules = golden_case.module_fixtures(folder)
1092+ want_modules = golden_case.wants_modules(folder)
1089 except ValueError as e:
1093 except ValueError as e:
1090 raise Unable(str(e))
1094 raise Unable(str(e))
1091 args = ['~.%s' % name]
1095 args = ['~.%s' % name]
@@ -1113,7 +1117,7 @@ def generate_tests(golden):
1113 else:
1117 else:
1114 expected_types = '~'
1118 expected_types = '~'
1115 path = logical or '~[%%tests %%golden ~.%s %%source %%jibb]' % name
1119 path = logical or '~[%%tests %%golden ~.%s %%source %%jibb]' % name
1116− if modules:
1120+ if want_modules:
1117 fixtures = []
1121 fixtures = []
1118 for j, (module, mold, _) in enumerate(imports, 1):
1122 for j, (module, mold, _) in enumerate(imports, 1):
1119 face = 'imp-%d-%d' % (i, j)
1123 face = 'imp-%d-%d' % (i, j)
@@ -1282,7 +1286,7 @@ def generate_tests(golden):
1282 [name.fixture (read-mark:jibb-import name.fixture cor)]
1286 [name.fixture (read-mark:jibb-import name.fixture cor)]
1283 =/ sources=(list [path=path source=@t])
1287 =/ sources=(list [path=path source=@t])
1284 (turn modules |=(item=[label=@t at=path source=@t] [at.item source.item]))
1288 (turn modules |=(item=[label=@t at=path source=@t] [at.item source.item]))
1285− (golden-types-with-modules:jibb at src external mark-external sources)
1289+ (golden-types-with-prelude:jibb at src external mark-external sources prelude-source)
1286'''
1290'''
1287 return '\n'.join(lines) + '\n' + TESTS_HELPERS.replace('\n--\n', '\n' + types_helper + '--\n')
1291 return '\n'.join(lines) + '\n' + TESTS_HELPERS.replace('\n--\n', '\n' + types_helper + '--\n')
1288
1292
tools/testdata/selftest+21
@@ -317,6 +317,27 @@ def check_module_fixtures(c, tmp):
317 c.expect(status == 2 and 'no fixture' in out, 'missing module: ' + out)
317 c.expect(status == 2 and 'no fixture' in out, 'missing module: ' + out)
318
318
319
319
320+def check_empty_module_bundle(c, tmp):
321+ cases = copy_cases(tmp)
322+ folder = os.path.join(cases, 'basic')
323+ with open(os.path.join(folder, 'modules.txt'), 'w') as f:
324+ f.write('# no modules\n')
325+ with open(os.path.join(folder, 'about.txt'), 'a') as f:
326+ f.write('expect-types: test module input\n')
327+ lib, _ = stub_with(tmp, 'module-stub.hoon', '--',
328+ "++ golden-types-with-prelude\n"
329+ " |= [file=path src=@t surs=* marks=* modules=* prelude=@t]\n"
330+ " ^- @t\n"
331+ " ?~(prelude 'missing prelude' ?~(modules 'empty module bundle' 'unexpected modules'))\n"
332+ "--")
333+ status, out = golden('--dir', cases, '--lib', lib, '--case', 'basic', '--update')
334+ actual = read(os.path.join(folder, 'types.txt'))
335+ c.expect(status == 0 and actual == b'empty module bundle\n',
336+ 'empty bundle should reach module checker: %d %r\n%s' % (status, actual, out))
337+ c.expect(not os.path.exists(os.path.join(folder, 'module-trees.txt')),
338+ 'empty bundle should not require a fixture tree output')
339+
340+
320def check_fixture_crash_isolated(c, tmp):
341def check_fixture_crash_isolated(c, tmp):
321 """A bad Hoon fixture must not hide the Jibb parse or other cases."""
342 """A bad Hoon fixture must not hide the Jibb parse or other cases."""
322 original = os.path.join(ROOT, 'tests', 'golden', 'types-import-mark')
343 original = os.path.join(ROOT, 'tests', 'golden', 'types-import-mark')
tools/testdata/ship-selftest+11−1
@@ -170,9 +170,19 @@ def generator_checks(tmp):
170 out = ship.generate_tests(module_cases)
170 out = ship.generate_tests(module_cases)
171 check('Jibb module sources are also supplied to the partial checker',
171 check('Jibb module sources are also supplied to the partial checker',
172 '(check-module-types ~.main' in out and
172 '(check-module-types ~.main' in out and
173+ '/* prelude-source %jibb /lib/jibb/prelude/jibb' in out and
173− '(golden-types-with-modules:jibb at src external mark-external sources)' in out and
174+ '(golden-types-with-prelude:jibb at src external mark-external sources prelude-source)' in out and
174 "['/ui/card.jibb' ~[~.ui ~.card ~.jibb] mod-1-1]" in out and
175 "['/ui/card.jibb' ~[~.ui ~.card ~.jibb] mod-1-1]" in out and
175 'src-1 `typ-1 ~ ~ ~[[' in out and '~[]' not in out, out)
176 'src-1 `typ-1 ~ ~ ~[[' in out and '~[]' not in out, out)
177+ with open(os.path.join(folder, 'modules.txt'), 'w') as f:
178+ f.write('# no module fixtures\n')
179+ out = ship.generate_tests(module_cases)
180+ check('an empty module bundle still opts into module checking',
181+ '(check-module-types ~.main' in out and
182+ 'src-1 `typ-1 ~ ~ ~)' in out and
183+ '(check-module-trees ~.main' not in out and '~[]' not in out, out)
184+ with open(os.path.join(folder, 'modules.txt'), 'w') as f:
185+ f.write('/ui/card.jibb\n')
176 os.makedirs(os.path.join(folder, 'sur'))
186 os.makedirs(os.path.join(folder, 'sur'))
177 os.makedirs(os.path.join(folder, 'mar'))
187 os.makedirs(os.path.join(folder, 'mar'))
178 with open(os.path.join(folder, 'sur', 'fixture.txt'), 'w') as f:
188 with open(os.path.join(folder, 'sur', 'fixture.txt'), 'w') as f:
tools/type-module-scope-testnew file+31
@@ -0,0 +1,31 @@
1+#!/usr/bin/env python3
2+"""Compare the module/prelude scope report under urbit eval."""
3+
4+from pathlib import Path
5+import difflib
6+import subprocess
7+import sys
8+import tempfile
9+
10+root = Path(__file__).resolve().parent.parent
11+fixture = root / 'tests/type-module-scope/expected.txt'
12+tests = (root / 'tests/lib/jibb-module-scope.hoon').read_text()
13+tests = tests[tests.index('\n|%\n') + 1:]
14+expression = ('=/ jibb .\n=/ expected=wain (to-wain:format expected-text)\n'
15+ '=/ suite\n' + tests + '\nscope-output:suite\n')
16+with tempfile.TemporaryDirectory(prefix='jibb-module-scope-') as tmp:
17+ program = Path(tmp) / 'scope.hoon'
18+ program.write_text(expression)
19+ result = subprocess.run([str(root / 'tools/hoon'), '--raw', '-f', str(program),
20+ '--cord', 'expected-text=' + str(fixture)],
21+ stdout=subprocess.PIPE)
22+if result.returncode:
23+ sys.exit(result.returncode)
24+expected = fixture.read_bytes()
25+if result.stdout != expected:
26+ sys.stderr.writelines(difflib.unified_diff(
27+ expected.decode().splitlines(keepends=True),
28+ result.stdout.decode().splitlines(keepends=True),
29+ fromfile='expected.txt', tofile='actual types'))
30+ sys.exit(1)
31+print('module/prelude scope golden passed')