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
788
789
790
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}