From 3a29bdb1f0419f7a07751a9623678b980cb73660 Mon Sep 17 00:00:00 2001 From: Lilleman auf Larv Date: Mon, 5 Oct 2026 23:11:43 +0200 Subject: [PATCH] Answer stability round 1: the readField comment names both directions of the shared value, and readName drops what namedPick states --- pick.go | 10 +++++----- pick_test.go | 2 +- render.go | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pick.go b/pick.go index ff56d9b..c0f7178 100644 --- a/pick.go +++ b/pick.go @@ -141,11 +141,11 @@ func (sc renderScope) frameOf(scope *nameScope) *pickFrame { return nil } -// readName reads a from its name's pick in the frame rendering the name's scope. Every read of -// one pick stays on it: the pick keeps each path's value and variant in its memo and its rows in -// its pins. A read entering another category takes the frames of the name scopes there from the -// memo too (enter), and renderFrame finds them and opens none. So {a.street} and {a.postal-code} in -// data/sv_SE/address.json read one pick of the name l that data/geo/SE/address.json binds. +// readName reads a from its name's pick in the frame rendering the name's scope. A read entering +// another category takes the frames of the name scopes there from the pick's memo (enter), and +// renderFrame finds them and opens none, so every read of the pick reads one pick of each name +// bound there: {a.street} and {a.postal-code} in data/sv_SE/address.json read one pick of the +// name l that data/geo/SE/address.json binds. func readName(s *drawstate.State, sc renderScope, a arm) readValue { f := sc.frameOf(a.named.scope) if f == nil { diff --git a/pick_test.go b/pick_test.go index f8eed14..157abc8 100644 --- a/pick_test.go +++ b/pick_test.go @@ -333,7 +333,7 @@ func TestAColumnReadingABoundColumnIsThatColumn(t *testing.T) { } } -func TestAFreshReadInsideANamedPickReadsNoneOfThePick(t *testing.T) { +func TestAFreshReadInsideANamedPickSharesNoValueWithIt(t *testing.T) { f := engine(5) src := `{"format":"{w as p}{p.a}|{p.a.b}","w":{"format":"{a}","a":{"format":"{c}|{b}","b":["1","2","3"],"c":{"format":"{b}","b":["x","y","z"]}}}}` want := regexp.MustCompile(`^[xyz]\|([123])\|([123])$`) diff --git a/render.go b/render.go index ff9e871..55aac74 100644 --- a/render.go +++ b/render.go @@ -145,8 +145,8 @@ func expand(s *drawstate.State, t *template, sc renderScope) string { // readField renders one arm of a token. A read of a name, or of a level a read of the name // rendering addresses, is kept in that name's pick; every other read draws afresh, so {word} // {word} draws twice and {p.a} {p.b} reads two draws of p. A fresh read leaves the pick: a read -// below it would key the pick's memo by sc.pickKey, the level the pick rendered, and read the -// pick's value for a node the pick never drew. +// below it would key the pick's memo by sc.pickKey, the level the pick rendered, so it and the +// pick would read one value for two nodes. func readField(s *drawstate.State, t *template, sc renderScope, a arm) readValue { switch { case a.kind == namedRead: