diff --git a/path.go b/path.go index 1c86b54..3384122 100644 --- a/path.go +++ b/path.go @@ -183,9 +183,10 @@ func probePath(n node, tail []string, steps []pathStep) ([]pathStep, error) { // drawSteps draws the rows and variants a path's steps read from n, pinning the rows in pins; // pins is nil for a sibling path, which never crosses a table, since a table is only a category. // For a read through a name, memo keeps the variant drawn at each of levels, so paths sharing a -// prefix share it. It returns the leaf and the pins its row is in: a step down after a step up draws -// afresh, into pins of its own, which memo shares with every path stepping down there. +// prefix share it. It returns the leaf and the pins its row is in. func drawSteps(s *drawstate.State, n node, steps []pathStep, pins *pinSet, memo *drawMemo, levels []pickKey) (node, *pinSet) { + // climbed is the table a ".." stepped up to. The next step down from it draws its row afresh, + // into pins of its own, which memo shares with every path of the pick stepping down there. var climbed *rowsTable for _, st := range steps { if c, ok := n.(*choice); ok { diff --git a/table.go b/table.go index 97648b5..4eed165 100644 --- a/table.go +++ b/table.go @@ -266,11 +266,13 @@ func (t *table) route(tail []string, descended bool) (tableRoute, error) { if err != nil { return tableRoute{}, err } - // A selector further down pins this table by ancestry, so the walk draws only - // where none follows; drawing first could draw a row the selector is not inside. - r := tableRoute{sel: sel, draw: sel == "" && (descended || len(tail) > 0) && !grammar.HasSelector(tail)} + selected, readsRow := sel != "", descended || len(tail) > 0 + // A selector further down pins this table by ancestry; drawing first could draw a row the + // selector is not inside. + pinnedBelow := grammar.HasSelector(tail) + r := tableRoute{sel: sel, draw: !selected && readsRow && !pinnedBelow} switch { - case len(tail) == 0 && sel == "" && !descended: + case !selected && !readsRow: r.next = t case len(tail) == 0: r.next = t.rowNode