1 | export default function walk(ast, { enter, leave }, state) {
|
2 | visit(ast, null, enter, leave, state)
|
3 | }
|
4 |
|
5 | function visit(node, parent, enter, leave, state) {
|
6 | if (!node) return
|
7 |
|
8 | if (enter) {
|
9 | if (enter.some(fn => fn(node, parent, state))) return
|
10 | }
|
11 |
|
12 | if (Array.isArray(node.children)) {
|
13 | node.children.forEach(child => {
|
14 | child.parent = node
|
15 | visit(child, node, enter, leave, state)
|
16 | })
|
17 | }
|
18 |
|
19 | if (leave) {
|
20 | leave.forEach(fn => fn(node, parent, state))
|
21 | }
|
22 | }
|