-
Notifications
You must be signed in to change notification settings - Fork 0
/
hello-recast.js
45 lines (33 loc) · 1.19 KB
/
hello-recast.js
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
35
36
37
38
39
40
41
42
43
44
const recast = require("recast");
const code = `
function add(a, b) {
return a * b;
}
`
;
// Let us transform the order of the parameters and convert it in a functionExpression
// Parse the code using an interface similar to require("esprima").parse.
const ast = recast.parse(code);
console.log(`The generated code from the AST is equal to the original code!`)
console.log(recast.print(ast).code === code);
const add = ast.program.body[0];
debugger;
const n = recast.types.namedTypes;
n.FunctionDeclaration.assert(add);
// If you choose to use recast.builders to construct new AST nodes, all builder
// arguments will be dynamically type-checked against the Mozilla Parser API.
const B = recast.types.builders;
// This kind of manipulation should seem familiar if you've used Esprima or the
// Mozilla Parser API before.
ast.program.body[0] = B.variableDeclaration("const", [
B.variableDeclarator(add.id, B.functionExpression(
null, // Anonymize the function expression.
add.params,
add.body
))
]);
// Switch the parameters order:
add.params.push(add.params.shift());
const output = recast.print(ast).code;
console.log(`input code:\n${code}`);
console.log(`output code:\n${output}`);