Slide 1

Slide 1 text

JavaScript Syntax Tree Demystified

Slide 2

Slide 2 text

@ariyahidayat @mikesherov PhantomJS Esprima

Slide 3

Slide 3 text

Composable De-facto Interface

Slide 4

Slide 4 text

SpiderMonkey Reflect.js Escodegen Esprima

Slide 5

Slide 5 text

SpiderMonkey Reflect.js Esprima Escodegen Escope Esmangle Istanbul Acorn Babel JSCS js2coffee Webpack ast-query recast falafel ESLint Esformatter Jsfmt Require.js Blanket MetaJS Ibrik JSDoc Rocambole JSComplexity Plato

Slide 6

Slide 6 text

Parsing

Slide 7

Slide 7 text

Parser Interpreter Run-time Libraries var answer = 42; alert(answer);

Slide 8

Slide 8 text

JavaScript Execution Visualization int3.github.io/metajs/

Slide 9

Slide 9 text

Parser Execution Static analysis Transformatio n

Slide 10

Slide 10 text

“jQuery is cool” jQuery is cool separator word jQuery is cool Subject Adjective Verb

Slide 11

Slide 11 text

var answer = 42; keyword identifier equal sign number semicolon

Slide 12

Slide 12 text

var answer = 42; var answer = 42; var answer = 42 ; var answer = 42 ; same tokens

Slide 13

Slide 13 text

var answer = 42; Variable Declaration Initializer Identifier syntax tree

Slide 14

Slide 14 text

var answer = 42; alert(answer); Program Variable Declaration Call Expression Initializer Identifier answer 42 Arguments Identifier alert answer

Slide 15

Slide 15 text

Syntax Tree Visualization esprima.org/demo/parse.html var answer = 42 github.com/estree/estree

Slide 16

Slide 16 text

Stray Logging function detect_console(code) { function check(node) { if (node.type === 'CallExpression') { if (node.callee.type === 'MemberExpression') { if (node.callee.object.name === 'console') { alert('console call at line', node.loc.start.line); } } } } var tree = esprima.parse(code, { loc: true }); estraverse.traverse(tree, { enter:check }); } http://ariya.ofilabs.com/2013/04/automagic-removal-of-javascript-logging.html

Slide 17

Slide 17 text

Style Checking

Slide 18

Slide 18 text

A Note on Style... “Arguments over style are pointless. There should be a style guide, and you should follow it” - Rebecca Murphey “Have the robots do it.” - Someone, probably.

Slide 19

Slide 19 text

A Rose By Any Other Name... var answer = 6 * 7; var answer=6*7

Slide 20

Slide 20 text

Inspecting The Tree var answer = 6 * 7; literal literal 6 7 var answer=6*7 Binary Expression Variable Declaration Identifier answer *

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

Using Ranges literal literal 6 7 var answer=6*7 Binary Expression * range: 11-14 range: 11-12 range: 13-14

Slide 23

Slide 23 text

Using Ranges literal literal 6 7 var answer = 6 * 7; Binary Expression * range: 13-18 range: 13-14 range: 17-18

Slide 24

Slide 24 text

Using Ranges literal literal 6 7 var answer = 6* 7; Binary Expression * range: 13-18 range: 13-14 range: 17-18

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

Using Tokens literal literal 6 7 * range: 13-14 range: 17-18 6 7 * 13-14 17-18 ... Tokens Tree 14-15

Slide 27

Slide 27 text

Tying Tokens To The Tree literal literal * Tree 6 7 * 13-14 17-18 Tokens 14-15

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

JSCS A Javascript Style Guide Enforcer https://github.com/jscs-dev/node-jscs

Slide 30

Slide 30 text

JSCS File Object Walks AST, creates annotations, API for traversal

Slide 31

Slide 31 text

JSCS Error Object Assertion Library, Error Retrieval and Addition API

Slide 32

Slide 32 text

JSCS Rule Object

Slide 33

Slide 33 text

YOU CAN SHOULD CONTRIBUTE https://github.com/jquery/esprima/issues https://github.com/jscs-dev/node-jscs/issues https://github.com/estree/estree/issues

Slide 34

Slide 34 text

@ariyahidayat @mikesherov Thank You Some artworks are from http://openclipart.org.