@@ -14,6 +14,7 @@
1414/* atoms %txt /tests/type-full-overlap/atoms/txt
1515/* flag %txt /tests/type-full-overlap/flag/txt
1616/* nested %txt /tests/type-full-overlap/nested/txt
17+/* order %txt /tests/type-full-overlap/order/txt
1718/* expected %txt /tests/type-full-overlap/expected-basic/txt
1819|%
1920+$ overlap-evidence [file=path source=@t name=term cases=upair:jibb]
@@ -33,18 +34,32 @@
3334 ?~ cases.sh ~
3435 ?~ t.cases.sh ~
3536 `[at.i.cases.sh at.i.t.cases.sh %overlap]
36−++ source-witness
37+++ source-overlap
3738 |= [file=path source=@t name=term]
38− ^- ?
39+ ^- (unit upair:jibb)
3940 =/ parsed (parse:jibb file source)
40− ?: ?=(%| -.parsed) |
41+ ?: ?=(%| -.parsed) ~
4142 =/ molds=imolds:jibb (collect-simple-molds:jibb defs.p.parsed)
4243 =/ found=(unit shape:jibb) (find-simple-mold:jibb name molds)
43− ?~ found |
44+ ?~ found ~
4445 =/ sh=shape:jibb u.found
4546 =? sh ?=(%generic -.sh) body.sh
46− ?. ?=(%union -.sh) |
47− ?=(^ (union-source-overlap:jibb cases.sh molds 256))
47+ ?. ?=(%union -.sh) ~
48+ (union-source-overlap:jibb cases.sh molds 256)
49+++ source-witness
50+ |= [file=path source=@t name=term]
51+ ^- ?
52+ ?=(^ (source-overlap file source name))
53+:: An overlapping pair of cases written at column 3 of the given lines.
54+++ pair-at
55+ |= [pair=upair:jibb first=@ud second=@ud]
56+ ^- ?
57+ ?& =(%overlap relation.pair)
58+ =(first line.beg.first.pair)
59+ =(3 col.beg.first.pair)
60+ =(second line.beg.second.pair)
61+ =(3 col.beg.second.pair)
62+ ==
4863++ detailed
4964 |= [file=path source=@t modules=jbundle:jibb]
5065 ^- detailed-result
@@ -79,7 +94,7 @@
7994 ?: ?=(%& -.result) |
8095 &(!=(0 message.p.result) ?=(~ overlap.p.result))
8196++ run
82− |= [same=@t zero=@t unsupported=@t precedence=@t duplicate=@t invalid=@t distinct=@t parent=@t child=@t generic=@t duplicate-generic=@t atoms=@t flag=@t nested=@t]
97+ |= [same=@t zero=@t unsupported=@t precedence=@t duplicate=@t invalid=@t distinct=@t parent=@t child=@t generic=@t duplicate-generic=@t atoms=@t flag=@t nested=@t order=@t]
8398 ^- (list [@t ?])
8499 =/ root=path /ui/root/jibb
85100 =/ names256=(list @t) (turn (gulf 0 255) |=(n=@ud (scot %ud n)))
@@ -103,6 +118,22 @@
103118 =/ legacy-projected=?
104119 ?: ?=(%& -.legacy-atoms) |
105120 =((to-wain:format p.legacy-atoms) ~['module mold bad has overlapping cases' '/ui/root.jibb:2:3: first union case' ' @t' ' ^' '/ui/root.jibb:3:3: overlapping case' ' @ud' ' ^'])
121+ :: The source witness alone proves the first two cases of .order, but
122+ :: the projection proves the last two and is consulted first, so both
123+ :: the full check and the partial report name the later pair.
124+ =/ order-source=(unit upair:jibb) (source-overlap root order %bad)
125+ =/ order-result=detailed-result (detailed root order ~)
126+ =/ order-full=?
127+ ?: ?=(%& -.order-result) |
128+ ?~ overlap.p.order-result |
129+ =/ ev=overlap-evidence u.overlap.p.order-result
130+ &(=(file.ev root) =(name.ev %bad) (pair-at cases.ev 5 6))
131+ =/ order-partial=wain (to-wain:format (golden-types:jibb root order))
132+ =/ order-reported=?
133+ ?& (lien order-partial |=(line=@t =(line '+$ bad: overlapping cases; mold not checked')))
134+ (lien order-partial |=(line=@t =(line '/ui/root.jibb:5:3: first union case')))
135+ (lien order-partial |=(line=@t =(line '/ui/root.jibb:6:3: overlapping case')))
136+ ==
106137 =/ imported=detailed-result (detailed root parent ~[[child-file child]])
107138 =/ child-pair=(unit upair:jibb) (source-pair child-file child %child-bad)
108139 =/ import-valid=?
@@ -125,6 +156,9 @@
125156 ['two auras have source-bound overlap' (expected-overlap root atoms %bad 2)]
126157 ['flag and yes have source-bound overlap' (expected-overlap root flag %bad 2)]
127158 ['nested equal tags have source-bound overlap' (expected-overlap root nested %bad 2)]
159+ ['source witness alone names the earlier pair' ?~(order-source | (pair-at u.order-source 3 4))]
160+ ['full check names the later projected pair' order-full]
161+ ['partial report names the same later pair' order-reported]
128162 ['duplicate generic parameters remain unstructured' (plain-failure root duplicate-generic)]
129163 ['unsupported remains unstructured' (plain-failure root unsupported)]
130164 ['later overlap exists in precedence source' (source-witness root precedence %bad)]
@@ -142,14 +176,14 @@
142176 ^- @t
143177 (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
144178++ output
145− |= [same=@t zero=@t unsupported=@t precedence=@t duplicate=@t invalid=@t distinct=@t parent=@t child=@t generic=@t duplicate-generic=@t atoms=@t flag=@t nested=@t]
179+ |= [same=@t zero=@t unsupported=@t precedence=@t duplicate=@t invalid=@t distinct=@t parent=@t child=@t generic=@t duplicate-generic=@t atoms=@t flag=@t nested=@t order=@t]
146180 ^- @t
147− =/ result=(list [@t ?]) (run same zero unsupported precedence duplicate invalid distinct parent child generic duplicate-generic atoms flag nested)
181+ =/ result=(list [@t ?]) (run same zero unsupported precedence duplicate invalid distinct parent child generic duplicate-generic atoms flag nested order)
148182 (of-wain:format (turn result |=(entry=[@t ?] (crip "{(trip -.entry)}: {?:(+.entry "ok" "BAD")}"))))
149183++ test-full-overlap-basic
150184 ^- tang
151185 ?~ expected ~[leaf+"expected output missing"]
152− =/ actual=@t (output (text same) (text zero) (text unsupported) (text precedence) (text duplicate) (text invalid) (text distinct) (text parent) (text child) (text generic) (text duplicate-generic) (text atoms) (text flag) (text nested))
186+ =/ actual=@t (output (text same) (text zero) (text unsupported) (text precedence) (text duplicate) (text invalid) (text distinct) (text parent) (text child) (text generic) (text duplicate-generic) (text atoms) (text flag) (text nested) (text order))
153187 ?. =((to-wain:format (cat 3 actual '\0a')) expected)
154188 ~[leaf+"full-module overlap output differs"]
155189 ~