]> dreyeck.freedombox.rocks Git - idiomatic.git/blob - visitor.js
add headings and buttons
[idiomatic.git] / visitor.js
1 let stack=[]
2 let log = false ? console.log : () => null
3 let doit = () => null
4
5 const rules = {
6 Program({body}) {body.map(walk)},
7 VariableDeclaration({kind,declarations}) {declarations.map(walk)},
8 VariableDeclarator({id,init}) {walk(id);if(init)walk(init)},
9 Identifier({start,name}) {doit(name); log(start,name)},
10 CallExpression({callee}) {walk(callee); arguments[0]['arguments'].map(walk)},
11 NewExpression({callee}) {walk(callee); arguments[0]['arguments'].map(walk)},
12 FunctionExpression({params,body}) {params.map(walk); walk(body)},
13 MemberExpression({object,property}) {walk(object); walk(property)},
14 ObjectPattern({properties}) {properties.map(walk)},
15 ExpressionStatement({expression}) {walk(expression)},
16 IfStatement({test,consequent}) {walk(test); walk(consequent)},
17 BlockStatement({body}) {body.map(walk)},
18 ReturnStatement({argument}) {if(argument)walk(argument)},
19
20 Literal({start,value,raw}) {log(start,raw)},
21 AssignmentExpression({operator,left,right}) {log(operator);walk(left);walk(right)},
22 LogicalExpression({operator,left,right}) {log(operator);walk(left);walk(right)},
23 BinaryExpression({operator,left,right}) {log(operator);walk(left);walk(right)},
24 UnaryExpression({operator,prefix,argument}) {log(prefix?'prefix':'suffix',operator); walk(argument)},
25 UpdateExpression({operator,prefix,argument}) {log(prefix?'prefix':'suffix',operator); walk(argument)},
26 ObjectExpression({properties}) {properties.map(walk)},
27 Property({key,value}) {walk(key);walk(value)},
28 ArrayExpression({elements}) {elements.map(walk)},
29 ArrayPattern({elements}) {elements.map(walk)},
30 ArrowFunctionExpression({params,body}) {params.map(walk);walk(body)},
31 TemplateLiteral({expressions,quasis}) {quasis.map(walk);expressions.map(walk)},
32 TemplateElement({start,end}) {log(end-start,'bytes')},
33
34 ForStatement({init,test,update,body}) {walk(init);walk(test);walk(update);walk(body)},
35 ForInStatement({left,right,body}) {walk(left); walk(right); walk(body)},
36 ForOfStatement({left,right,body}) {walk(left); walk(right); walk(body)},
37 ChainExpression({expression}) {walk(expression)},
38 ConditionalExpression({test,consequent,alternative}) {walk(test);walk(consequent);walk(alternative)},
39 ContinueStatement(){},
40 BreakStatement(){},
41
42 AssignmentPattern({left,right}) {walk(left);walk(right)},
43 WhileStatement({test,body}) {walk(test);walk(body)},
44 TryStatement({block,handler,finalizer}) {walk(block);walk(handler);walk(finalizer)},
45 CatchClause({param,body}) {walk(param);walk(body)},
46
47 EmptyStatement() {},
48 AwaitExpression({argument}) {walk(argument)},
49 ThrowStatement({argument}) {walk(argument)},
50 SwitchStatement({discriminant,cases}) {walk(discriminant); cases.map(walk)},
51 SwitchCase({test,consequent}) {walk(test); consequent.map(walk)},
52 RestElement({argument}) {walk(argument)},
53 ImportExpression({source}) {walk(source)},
54 FunctionDeclaration({id,params,body}) {walk(id),params.map(walk),walk(body)},
55
56 ThisExpression({context}) {walk(context)},
57
58 DoWhileStatement({test,body}) {walk(test);walk(body)},
59 SequenceExpression({expressions}) {expressions.map(walk)},
60
61 SpreadElement({argument}) {walk(argument)},
62 }
63
64 let each = (branch,stack) => {}
65 function wander(mods,doit) {
66 each = doit
67 for (const mod of mods) {
68 stack = [mod.file]
69 walk(mod.tree)
70 }
71 each = (branch,stack) => {}
72 }
73 function walk(branch) {
74 if(branch) {
75 const type = branch?.type;
76 stack.unshift(branch);
77 log('PARSING',type);
78 each(branch,stack);
79 (rules[type]||fail)(branch);
80 stack.shift()
81 }
82 }
83 function fail(branch) {
84 console.log('FAIL',branch)
85 }
86
87 module.exports = {wander}