-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtraverse.ts
More file actions
34 lines (32 loc) · 915 Bytes
/
Copy pathtraverse.ts
File metadata and controls
34 lines (32 loc) · 915 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import { NodeTypes, RootNode, ChildNode, ParentNode, Visitor } from "../type/ast";
export function traverse(rootNode: RootNode, visitor: Visitor) {
// 1. depth-first
// 2. Visitor
function traverseArray(array: ChildNode[], parent: ParentNode) {
array.forEach((node) => {
traverseNode(node, parent);
});
}
function traverseNode(node: ChildNode | RootNode, parent?: ParentNode) {
// enter
const visitorObj = visitor[node.type];
if (visitorObj) {
visitorObj.enter(node, parent);
}
switch (node.type) {
case NodeTypes.NumberLiteral:
break;
case NodeTypes.CallExpression:
traverseArray(node.params, node);
break;
case NodeTypes.Program:
traverseArray(node.body, node);
break;
}
// exit
if (visitorObj && visitorObj.exit) {
visitorObj.exit(node, parent);
}
}
traverseNode(rootNode);
}