Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
Let’s try to hack AST of JavaScript
sota ohara
July 06, 2019
1
900
Let’s try to hack AST of JavaScript
sota ohara
July 06, 2019
Tweet
Share
More Decks by sota ohara
See All by sota ohara
sottar
1
66
sottar
2
7.6k
sottar
28
17k
sottar
5
2k
sottar
3
1k
sottar
2
1.7k
sottar
2
12k
sottar
9
4.6k
Featured
See All Featured
marcelosomers
220
15k
ddemaree
273
31k
shpigford
369
42k
paulrobertlloyd
72
1.4k
bryan
31
3.4k
jponch
103
5k
morganepeng
93
14k
ammeep
656
54k
carmenhchung
30
1.5k
keathley
20
700
colly
66
3k
tammielis
237
23k
Transcript
1 Let’s try to hack AST of JavaScript Sota Ohara
2019.7.4 Battle Conference U30
2 Tech Lead @ Mercari inc. Twitter: @sottar_ GitHub: @sottar
Sota Ohara
3 - Introduce the AST - Create babel plugin Index
4 What’s an AST
5 Abstract Syntax Tree (抽象構文木)
6 What’s an AST An AST is the result of
parsing source code. A tree data structure which extracted necessary information from the source code DOM Tree is one of them Used for analysis and processing the source code It’s using by the compiler and interpreter
7 It seems difficult...
8 JavaScript AST
9 JavaScript AST is not difficult We can use AST
easily in JavaScript What’s a JavaScript AST?
10 Just a JavaScript Object which displays an architecture of
code What’s a JavaScript AST?
11 ESTree de facto standard Parser Acorn Esprima Babylon: used
by Babel, Acorn based Espree: used by ESLint, Acorn based What’s a JavaScript AST?
12 AST Flow Source Code AST New AST New Source
Code parser traverser generator
13 Useful Tool AST Explorer
14 Let’s create a babel plugin
15 Create a babel plugin transform function take care the
parser, traverser and generator. $ npm i -S @babel/core const { transform } = require("babel-core"); index.js
16 Replace var with const
17 Create a babel plugin index.js const { transform }
= require("babel-core"); const src = "var foo = 'foooooo'" const plugin = ({ types }) => ({ visitor: { VariableDeclaration: nodePath => { if (nodePath.node.kind === "var") { nodePath.node.kind = "const"; } } } }); const { code } = transform(src, { plugins: [plugin] }); console.log(code); // -> const foo = 'foooooo'
18 That’s all
19 const { transform } = require("babel-core"); const src =
"var foo = 'foooooo'" const plugin = ({ types }) => ({ visitor: { VariableDeclaration: nodePath => { if (nodePath.node.kind === "var") { nodePath.node.kind = "const"; } } } }); const { code } = transform(src, { plugins: [plugin] }); console.log(code); // -> const foo = 'foooooo' Create babel plugin index.js Original source code Generated source code
20 const { transform } = require("babel-core"); const src =
"var foo = 'foooooo'" const plugin = ({ types }) => ({ visitor: { VariableDeclaration: nodePath => { if (nodePath.node.kind === "var") { nodePath.node.kind = "const"; } } } }); const { code } = transform(src, { plugins: [plugin] }); console.log(code); // -> const foo = 'foooooo' Create babel plugin index.js Call transform function with src and defined plugin
21 const { transform } = require("babel-core"); const src =
"var foo = 'foooooo'" const plugin = ({ types }) => ({ visitor: { VariableDeclaration: nodePath => { if (nodePath.node.kind === "var") { nodePath.node.kind = "const"; } } } }); const { code } = transform(src, { plugins: [plugin] }); console.log(code); // -> const foo = 'foooooo' Create babel plugin index.js Kind of visitor pattern
22 Create babel plugin index.js const { transform } =
require("babel-core"); const src = "var foo = 'foooooo'" const plugin = ({ types }) => ({ visitor: { VariableDeclaration: nodePath => { if (nodePath.node.kind === "var") { nodePath.node.kind = "const"; } } } }); const { code } = transform(src, { plugins: [plugin] }); console.log(code); // -> const foo = 'foooooo' Kind of visitor pattern This function will be fired when this label is found in the AST
23 Understand, but how to write it?
24 Useful Tools AST Explorer
25 Create babel plugin
26 Create babel plugin var foo = 'foooooo'
27 Create babel plugin var foo = 'foooooo'
28 Create babel plugin index.js const { transform } =
require("babel-core"); const src = "var foo = 'foooooo'" const plugin = ({ types }) => ({ visitor: { VariableDeclaration: nodePath => { if (nodePath.node.kind === "var") { nodePath.node.kind = "const"; } } } }); const { code } = transform(src, { plugins: [plugin] }); console.log(code); // -> const foo = 'foooooo'
29 If you have any question or feedback, please get
in touch with twitter (@sottar_) Thank you~
30 AST Explorer https://astexplorer.net/ Acorn https://github.com/acornjs/acorn Esprima https://github.com/jquery/esprima Babylon https://github.com/babel/babel/tree/master/packages/babel-parser
Espree https://github.com/eslint/espree Appendix