From c955d35bbe04c096ea2c3f7323fb1b473e5242a0 Mon Sep 17 00:00:00 2001 From: Lilleman auf Larv Date: Sat, 3 Oct 2026 12:25:35 +0200 Subject: [PATCH] Make checkNameReads and enter read on one pass, and keep name for names --- README.md | 4 ++-- doc.go | 2 +- name.go | 9 ++++----- render.go | 2 +- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 1f0e5bc..8f80dfd 100644 --- a/README.md +++ b/README.md @@ -716,11 +716,11 @@ anywhere: if `n`'s category has the format `{w}-{w}`, it draws `w` twice, and `{ A name is a pick of its own: `{t.name}` and `{/misc.territory.name}` beside it are two draws. A reference path the picked category reads is still held for the render as usual, so two names -bound to `sv_SE.person`, whose fields read `{.first-name.name}`, print the same first and last +bound to `sv_SE.person`, whose fields read `{.first-name.name}` and `{.last-name.name}`, print the same first and last name unless their reads sit in two [draw groups](#draw-group). A name is drawn on its first read, and lives in the category binding it: any field of the -category reads it, and a record's columns read one pick. Each render of the category picks +category may read it, and a record's columns read one pick. Each render of the category picks anew, and so does each bare reference to it. A name a `repeat` binds picks again on every iteration, and one bound outside the repeat keeps its pick on every line. diff --git a/doc.go b/doc.go index 176183e..1b608ed 100644 --- a/doc.go +++ b/doc.go @@ -23,7 +23,7 @@ package fejkdata // `Generator.Fake`, `FakeRecord`, `Template.Fake` and `RecordTemplate.Fake` // start one each, `FakeStruct` one per record, and `expandAnew` one per // iteration of a `template.repeat`. -// - hold — keeping one draw of a name, so every route to it reads that value: +// - hold — keeping one draw of a field, so every route to it reads that value: // an expansion holds a sibling path's head and an operand's field, its draw // group a reference path's: `formatOps.held` and `heldCheck` an expansion's, // `readReference` a draw group's. diff --git a/name.go b/name.go index d213c08..1228790 100644 --- a/name.go +++ b/name.go @@ -288,9 +288,8 @@ func linkName(t *template, a *arm) error { return nil } -// checkNameReads refuses a read of a name rendering, under the pick, a field it renders twice where -// a path through the name reads one draw of it: the pick keeps one draw there, and the two -// renders would disagree with it. +// checkNameReads refuses each binding of t that checkUses refuses, and a read such as {n} whose +// pick renders twice a field another read, {n.w}, reads once: the pick keeps one draw of it. func checkNameReads(path string, t *template) error { for _, tok := range t.tokens { if tok.kind != nameBind { @@ -474,8 +473,8 @@ func (d *renderDraws) depth() int { return len(d.frameStack.frames) } -// enter hides the frames already rendering from a read landing on n, and opens from memo a frame -// for each name scope around n, so every read sharing memo reads one pick of each name. It +// enter starts a read landing on n: the read sees no frame opened before it, and gets from memo a +// frame for each name scope around n, so reads sharing memo read one pick of each name. It // returns the mark that closes those frames. func (sc renderScope) enter(n node, memo *drawMemo) (renderScope, int) { sc.base, sc.pick = sc.draws.depth(), nil diff --git a/render.go b/render.go index b921b40..855afcf 100644 --- a/render.go +++ b/render.go @@ -165,7 +165,7 @@ func expand(s *generatorState, t *template, sc renderScope) string { return b.String() } -// readField renders one arm of a token. A name the expansion holds — a level some +// readField renders one arm of a token. A field the expansion holds — a level some // token addresses by a dotted path that is not a reference, or a field an operand // reads — is drawn once and kept in hold, so {place.postal-code} and {place.locality} // read one row, either read twice gives one value, and a shown operand is the operand