all repos — grayfriday @ 0f3eafddfa07d57c2d0fd289a9d6520a0f766220

blackfriday fork with a few changes

Merge pull request #287 from Ambrevar/v2walkfix

v2: Fix walk so that it does not step outside the root node
Vytautas Ĺ altenis vytas@rtfb.lt
Fri, 05 Aug 2016 09:17:14 +0300
commit

0f3eafddfa07d57c2d0fd289a9d6520a0f766220

parent

2e23e31bd43e45fc9082703fe10f4c488c547b09

1 files changed, 12 insertions(+), 25 deletions(-)

jump to
M node.gonode.go

@@ -270,16 +270,16 @@ type NodeVisitor func(node *Node, entering bool) WalkStatus

// Walk is a convenience method that instantiates a walker and starts a // traversal of subtree rooted at n. -func (n *Node) Walk(visitor NodeVisitor) { - walker := newNodeWalker(n) - node, entering := walker.next() - for node != nil { - status := visitor(node, entering) +func (root *Node) Walk(visitor NodeVisitor) { + w := newNodeWalker(root) + for w.current != nil { + status := visitor(w.current, w.entering) switch status { case GoToNext: - node, entering = walker.next() + w.next() case SkipChildren: - node, entering = walker.resumeAt(node, false) + w.entering = false + w.next() case Terminate: return }

@@ -295,18 +295,15 @@

func newNodeWalker(root *Node) *nodeWalker { return &nodeWalker{ current: root, - root: nil, + root: root, entering: true, } } -func (nw *nodeWalker) next() (*Node, bool) { - if nw.current == nil { - return nil, false - } - if nw.root == nil { - nw.root = nw.current - return nw.current, nw.entering +func (nw *nodeWalker) next() { + if !nw.entering && nw.current == nw.root { + nw.current = nil + return } if nw.entering && nw.current.isContainer() { if nw.current.FirstChild != nil {

@@ -322,16 +319,6 @@ } else {

nw.current = nw.current.Next nw.entering = true } - if nw.current == nw.root { - return nil, false - } - return nw.current, nw.entering -} - -func (nw *nodeWalker) resumeAt(node *Node, entering bool) (*Node, bool) { - nw.current = node - nw.entering = entering - return nw.next() } func dump(ast *Node) {