JavaScript AST Walker
JavaScript ASTを見て回る
Agenda
- JavaScript ASTとは
- JS AST Structure
- JS AST as JSON
- Try JavaScript AST
- パーサ
- ジェネレーター
- ここまでのまとめ
- More detail
- コードカバレッジツール
- istanbul-html
- istanbul-karma
- blanket
- [ESLint](https://github.com/nzakas/eslint "ESLint")
- [reQUnit](https://github.com/azu/reQUnit "reQUnit")
- reQunit : before
- reQunit : after
- [regenerator](https://github.com/facebook/regenerator "regenerator")
- [grasp](http://graspjs.com/ "grasp")
- [esgraph + graphviz](https://github.com/azu/esgraph-graphviz-online)
- detail
- TreeWalker
- JavaScript AST Traversal lib
- Traversal
- AST変換
- [Rephrase](https://github.com/puffnfresh/rephrase "Rephrase") example
- Other
JS AST Structure
JS AST as JSON
パーサ
JavaScriptのコードから JS ASTを生成する
ジェネレーター
JS Code -> esprima -> AST -> escodegen -> JS Code
parse(generate(parse(code))) === parse(code)
ここまでのまとめ
- パーサ
- ASTを扱うツール(このスライドの主題)
- ジェネレータ
- escodegen - ASTからコードを生成する
コードカバレッジツール
JS ASTを変換して、コード上にカバレッジ検出コードを埋め込んでいく
istanbul-html
istanbul-karma
blanket
- QUnitで書かれたテストをJasmineなどに変換
- 構造的な違いはJS ASTのnodeを移動させる
- assertion等のメソッドはRephraseで変換
- ES6のGeneratorをES5で動くように変換する
$ grasp -e "return __.length > __" lib/reQUnit.js
58: return node.expression["arguments"].length > 1;
JavaScript AST Traversal lib
- ASTを走査するライブラリ.
- 低レイヤーに近いので、他のライブラリがこれの上に成り立ってる事が多い
- estraverse
- JS AST traversalのデファクト
enter
, leave
, replace
- ast-traverse
pre
, post
, skipProperty
Traversal
- millermedeiros/rocambole
- 通常はコードとコメントのTreeは別れているがlinked listで辿れるようになってる
next
や prev
でコードのイメージそのままたどっていける
- これのために
token
という、nodeより小さい概念が導入されてる(独自っぽい?)
- traversalのメソッドも持ってるので便利
ASTセレクタ
[1, 2, 3].map(add(1)).map(add(2));
[1, 2, 3].map(compose(add(1), add(2)));
Other
Nitraにより皆様はパーサーや言語実装のエキスパートでなくても独自のDSLを開発することが出来るようになり、同時にエラーチェックやシンタックスハイライトといったIDEの機能を活用することができます