def walk

bolt@1.27.0.0 · src/syntax/bind.bend:787

import bolt@1.27.0.0/src/syntax/bind.bend as Bind
import Base
import bolt@1.27.0.0/src/syntax/lex.bend as Lex
import bolt@1.27.0.0/src/syntax/tree.bend as Tree

787# the walk: one node in one mode, against an environment. It takes the node
788# apart as far as its head, and the plan above says what the head does in
789# this mode. Every recursive call is on a subtree (kids, body, gkids or
790# rest), never on n itself
791def walk(nn: Tree.Node, +mode: Mode, +env: List<&2, Bind>, +ns: Names, out: Out) -> W:
792  match nn:
793    case Tree.NCons{hd, +rest}:
794      match hd:
795        case Tree.Leaf{Lex.Tok{+k, +t, +l, +c}}:
796          +keep = plan.keep(mode, k)
797          +bb = plan.binder(mode, k, t, l, c, rest)
798          +o1 = plan.recorded(plan.rec(mode, k, rest), bb, out)
799          +o2 = plan.used(plan.use(mode, k, rest), t, l, c, env, ns, o1)
800          +e2 = plan.enter(keep, plan.outer(mode), plan.push(mode, k, rest), bb, env)
801          +r = walk(rest, plan.lmode(mode, k, rest), e2, ns, o2)
802          W{Bool.pick(List<&2, Bind>, keep, env, env_of(r)), out_of(r)}
803        case Tree.Group{Lex.Tok{_gk, gt, _gl, _gc}, gkids, _close}:
804          +g = walk(gkids, plan.ginner(mode, gt), env, ns, out)
805          walk(rest, plan.gnext(mode), Bool.pick(List<&2, Bind>, plan.gkeeps(mode), env_of(g), env), ns, out_of(g))
806        case Tree.Stmt{+sk, +kids, body}:
807          +h = walk(kids, plan.kmode(mode, sk, env), env, ns,
808            plan.marked(plan.mark_head(mode, sk), Tree.line(kids), env, out))
809          +b = walk(body, plan.bmode(mode, sk), env_of(h), ns,
810            plan.marked(plan.mark_body(mode, sk), Tree.line(kids), env_of(h), out_of(h)))
811          walk(rest, plan.snext(mode), Bool.pick(List<&2, Bind>, plan.scoped(mode, sk), env, env_of(h)), ns, out_of(b))
812        case _other:
813          walk(rest, plan.skip(mode), env, ns, out)
814    case _other:
815      W{env, out}

Uses (33)

Used by (1)