@@ -8435,7 +8435,10 @@
84358435 =/ traced=iresult $(e val.e)
84368436 ?: ?=(%| -.traced) traced
84378437 $(e then.e, state state.p.traced)
8438− %tuple (infer-simple-items items.e env state)
8438+ %tuple
8439+ ?: &(?=(^ defer.state) ?=(^ prelude.state))
8440+ (dg-infer-tuple-items items.e env state)
8441+ (infer-simple-items items.e env state)
84398442 %body
84408443 ?~ defs.e $(e final.e)
84418444 =/ local-names=(list term) (global-value-names defs.e)
@@ -9241,6 +9244,8 @@
92419244 |= [e=expr expected=itype env=ienv state=istate context=span]
92429245 ^- iresult
92439246 ?: &(?=(^ defer.state) ?=(%branch -.e)) (infer-fragment e env state)
9247+ ?: &(?=(^ defer.state) ?=(^ prelude.state) ?=(%tuple -.e))
9248+ (infer-fragment e env state)
92449249 ?: ?=(%pair -.e) $(e (pair-as-cell e))
92459250 ?: ?=(%group -.e) $(e inner.e)
92469251 ?: &(?=(%body -.e) ?=(~ defs.e)) $(e final.e)
@@ -12658,7 +12663,7 @@
1265812663 ?: ?=(%| -.js) (of-wain:format ~['partial inference; module not checked' p.js])
1265912664 =/ scope-values=(list term)
1266012665 (weld prelude-values (weld (collect-sur-imports imports.p.parsed) (collect-mark-imports imports.p.parsed)))
12661− (golden-types-in-context file src externals mark-externals resolved.p.js scope-values prelude-molds iface)
12666+ (golden-types-in-context-core file src externals mark-externals resolved.p.js scope-values prelude-molds iface prepared)
1266212667::
1266312668:: +golden-types-with-marks: supply declared mark types separately from /sur
1266412669:: entries, as [mark result] with the result from +read-mark:jibb-import.
@@ -12689,6 +12694,10 @@
1268912694++ golden-types-in-context
1269012695 |= [file=path src=@t externals=iexternals mark-externals=imark-externals jimports=ijimports prelude-values=(list term) reserved-molds=(list term) prelude=(unit ifile)]
1269112696 ^- @t
12697+ (golden-types-in-context-core file src externals mark-externals jimports prelude-values reserved-molds prelude ~)
12698+++ golden-types-in-context-core
12699+ |= [file=path src=@t externals=iexternals mark-externals=imark-externals jimports=ijimports prelude-values=(list term) reserved-molds=(list term) prelude=(unit ifile) prepared=(unit iprelude)]
12700+ ^- @t
1269212701 =. reserved-molds (weld reserved-molds (turn jimports |=(j=[face=term interface=ifile] face.j)))
1269312702 =/ parsed (parse file src)
1269412703 ?: ?=(%| -.parsed) (show-error src p.parsed)
@@ -12708,19 +12717,27 @@
1270812717 =/ eligible=?
1270912718 ?& ?=(~ imports.p.parsed)
1271012719 ?=(~ jimports)
12711− ?=(~ prelude)
12712− ?=(~ prelude-values)
12713− ?=(~ reserved-molds)
1271412720 !?=([%ui %api *] file)
1271512721 !?=([%ui %stores *] file)
1271612722 !(lien (global-value-names ds) |=(n=term =(n %main)))
12717− (module-scope-valid p.parsed ~ ~)
1271812723 !(module-values-complete ds env)
1271912724 (lte (met 3 src) 65.536)
1272012725 (lte (lent ds) 64)
12721− (dg-source-candidate ds 64)
12726+ ?| &(?=(~ prepared) ?=(~ prelude) ?=(~ prelude-values) ?=(~ reserved-molds) (module-scope-valid p.parsed ~ ~) (dg-source-candidate ds 64))
12727+ ?& ?=(^ prepared)
12728+ ?=(^ prelude)
12729+ =(u.prelude iface.u.prepared)
12730+ =(prelude-values values.u.prepared)
12731+ =(reserved-molds molds.u.prepared)
12732+ (module-scope-valid p.parsed values.u.prepared molds.u.prepared)
12733+ (dg-prepared-candidate ds 64)
12734+ ==
12735+ ==
1272212736 ==
12723− =/ transaction=(unit dgcommit) ?:(eligible (dg-root-source file src) ~)
12737+ =/ transaction=(unit dgcommit)
12738+ ?. eligible ~
12739+ ?~ prepared (dg-root-source file src)
12740+ (dg-root-prepared file src u.prepared)
1272412741 =. recovered
1272512742 ?~ transaction ~
1272612743 ?. &((module-values-complete ds env.u.transaction) (dg-interface-safe env.u.transaction)) ~
@@ -13006,6 +13023,31 @@
1300613023 [%& result st(next +(next.st), obligations [ex ey obligations.st])]
1300713024 [%& typ.p.left state.p.right]
1300813025::
13026+:: A direct tuple literal may wait for a later exact result context.
13027+:: Each pending literal retains its source tag and its own fit obligation.
13028+++ dg-infer-tuple-items
13029+ |= [items=(list item) env=ienv state=istate]
13030+ ^- iresult
13031+ ?~ items [%| ["empty cell is not supported by partial inference" ~]]
13032+ =/ head=iresult (infer-fragment val.i.items env state)
13033+ ?: ?=(%| -.head) head
13034+ =/ typ=itype typ.p.head
13035+ =/ st=istate state.p.head
13036+ =/ adjusted=(unit [typ=itype state=istate])
13037+ ?. (dg-owned-arm-literal val.i.items typ tags.st sub.st next.state) `[typ st]
13038+ ?: (gth (lent obligations.st) 63) ~
13039+ =/ pending=itype [%var next.st]
13040+ =/ edge=dgo [typ pending (span-of val.i.items) at.i.items]
13041+ `[pending st(next +(next.st), obligations [edge obligations.st])]
13042+ ?~ adjusted [%| ["deferred tuple context needs unsupported inference" ~]]
13043+ =. typ typ.u.adjusted
13044+ =. st state.u.adjusted
13045+ =. typ ?~(face.i.items typ [%face u.face.i.items typ])
13046+ ?~ t.items [%& typ st]
13047+ =/ tail=iresult $(items t.items, state st)
13048+ ?: ?=(%| -.tail) tail
13049+ [%& [%cell typ typ.p.tail] state.p.tail]
13050+::
1300913051:: Deferred inference uses only source forms whose successful fit sites are
1301013052:: guarded below; a shared source-node budget bounds this screen.
1301113053++ dg-safe-expressions
@@ -13015,6 +13057,13 @@
1301513057 =/ first=(unit @ud) (dg-safe-expression i.todo fuel)
1301613058 ?~ first ~
1301713059 $(todo t.todo, fuel u.first)
13060+++ dg-safe-items
13061+ |= [items=(list item) fuel=@ud]
13062+ ^- (unit @ud)
13063+ ?~ items `fuel
13064+ =/ first=(unit @ud) (dg-safe-expression val.i.items fuel)
13065+ ?~ first ~
13066+ $(items t.items, fuel u.first)
1301813067++ dg-safe-expression
1301913068 |= [e=expr fuel=@ud]
1302013069 ^- (unit @ud)
@@ -13032,6 +13081,7 @@
1303213081 $(e final.e, fuel fuel)
1303313082 %gate $(e body.e, fuel fuel)
1303413083 %gate-wide $(e body.e, fuel fuel)
13084+ %tuple (dg-safe-items items.e fuel)
1303513085 %branch
1303613086 ?. (dg-boolean-patterns e) ~
1303713087 ?> ?=(^ arms.e)
@@ -13171,6 +13221,28 @@
1317113221 ?: (dg-direct-source val.i.ds 64) &
1317213222 $(ds t.ds, fuel (dec fuel))
1317313223::
13224+++ dg-prepared-source
13225+ |= [e=expr fuel=@ud]
13226+ ^- ?
13227+ ?: (dg-direct-source e fuel) &
13228+ ?: =(0 fuel) |
13229+ ?+ -.e |
13230+ %group $(e inner.e, fuel (dec fuel))
13231+ %gate $(e body.e, fuel (dec fuel))
13232+ %gate-wide $(e body.e, fuel (dec fuel))
13233+ %cast $(e val.e, fuel (dec fuel))
13234+ %body ?~(defs.e $(e final.e, fuel (dec fuel)) |)
13235+ %tuple &
13236+ ==
13237+++ dg-prepared-candidate
13238+ |= [ds=(list def) fuel=@ud]
13239+ ^- ?
13240+ ?~ ds |
13241+ ?: =(0 fuel) |
13242+ ?. ?=(%value -.i.ds) $(ds t.ds, fuel (dec fuel))
13243+ ?: (dg-prepared-source val.i.ds 64) &
13244+ $(ds t.ds, fuel (dec fuel))
13245+::
1317413246++ dg-interface-safe
1317513247 |= [env=ienv]
1317613248 ^- ?
@@ -13216,6 +13288,47 @@
1321613288 (dg-stage defs base base st ~ 64)
1321713289 ::
1321813290 [& (transact)]
13291+:: The caller supplies the trusted prepared prelude. This transaction is
13292+:: only report evidence; the ordinary module resolver does not publish it.
13293+++ dg-root-prepared
13294+ |= [at=path src=@t prepared=iprelude]
13295+ ^- (unit dgcommit)
13296+ ?: ?=([%ui %api *] at) ~
13297+ ?: ?=([%ui %stores *] at) ~
13298+ ?: (gth (met 3 src) 65.536) ~
13299+ =/ parsed (parse at src)
13300+ ?: ?=(%| -.parsed) ~
13301+ ?^ imports.p.parsed ~
13302+ ?. (module-scope-valid p.parsed values.prepared molds.prepared) ~
13303+ ?^ (duplicate-defs defs.p.parsed) ~
13304+ =/ defs=(list def) defs.p.parsed
13305+ ?: (gth (lent defs) 64) ~
13306+ ?: (lien (global-value-names defs) |=(n=term =(n %main))) ~
13307+ ?. (dg-prepared-candidate defs 64) ~
13308+ =/ local-molds=imolds (collect-simple-molds defs)
13309+ =/ globals=(list term) (weld values.prepared (global-value-names defs))
13310+ =/ iface=ifile iface.prepared
13311+ =/ prelude=(unit ifile) `iface
13312+ =/ resolution=iresolved
13313+ (resolve-groups defs local-molds globals ~ ~ ~ ~ ~ molds.prepared at prelude)
13314+ ?^ grouped.resolution ~
13315+ ?^ artifacts.resolution ~
13316+ =/ base=ienv env.resolution
13317+ =/ templates=ienv
13318+ (turn molds.iface |=(x=[name=term template=ischeme] [name.x template.x]))
13319+ =/ all-env=ienv (weld base (weld values.iface templates))
13320+ =/ free=(unit dgscan) (dg-env all-env ~ 32.768 ~)
13321+ ?~ free ~
13322+ ?^ ids.u.free ~
13323+ =/ all=(unit dgscan) (dg-all-env-ids all-env 32.768 ~)
13324+ ?~ all ~
13325+ =/ fresh=@ud (dg-next-id ids.u.all 0)
13326+ =/ st=istate *istate
13327+ =. st st(next fresh, defer `~, molds local-molds, globals globals, at at, reserved-molds molds.prepared, prelude prelude, top-molds (turn local-molds |=(m=[name=term body=shape] name.m)), in-mold |, jrec-fuel 256)
13328+ =/ checked-molds=(each imold-types @t) (module-mold-types local-molds st)
13329+ ?: ?=(%| -.checked-molds) ~
13330+ (dg-stage defs base base st ~ 64)
13331+::
1321913332++ dg-all-env-ids
1322013333 |= [env=ienv fuel=@ud ids=(list @ud)]
1322113334 ^- (unit dgscan)