- やりたいこと: TypeScriptの型定義 *.d.tsファイルをパースして型情報を手に入れたい
- 最初に考えたこと: TypeScriptのASTを引っこ抜いて適当にパースすれば良いんじゃね?
- scala.jsの作者がTypeScriptからscala.jsへの変換を書いてるのを発見
- sjrd/scala-js-ts-importer
- ソース読んでたら自力でTypeScriptをパースしてることを発見しヤバみを感じて撤退する scala-js-ts-importer/src/main/scala/org/scalajs/tools/tsimporter/parser/TSDefParser.scala at master · sjrd/scala-js-ts-importer
- 素直にTypeScriptコンパイラからASTを手に入れよう…
- TypeScriptのコンパイラ周りのAPIが混沌としているのでラッパーがたくさんあるみたいだ
- sinclairzx81/typescript.api をみつける
- ↑のバージョンがd.tsを無視する仕様になってる
- しかもTypeScript v0.9.* 向けでAPIが古い(既に動かない)
- コード読んで d.ts をパースするように修正を試みるも諦める(今ならわかるがTypeScript.CompilerSettingsで第三引数か何かにtrue入れないといけなかった。そんなんわかるか)
- 諦めて素のTypesScriptからAPI探そう…
- getSyntaxTree とかでググってたら compiler.ts をみつける
- しかしTypeScriptのモジュールをどうにかしてインポートしないといけない。
- npm install typescript して require('typescript')してみるもmodule.exportsが定義されておらず何も参照できない…
- 中をみるとvar TypeScriptはしているっぽい
- 苦肉の策で
eval(fs.readFileSync('node_modules/typescript/bin/typescript.js').toString())
した。動いた。そりゃ動くわ。
- ↑のcompiler.tsがそのままだと動かない。仕方ないのでcoffeeで書きなおす。
fs = require 'fs' pj = require 'prettyjson' eval fs.readFileSync('node_modules/typescript/bin/typescript.js').toString() programText = fs.readFileSync(process.argv[2]).toString() tree = TypeScript.Parser.parse( 'dummy.ts', TypeScript.SimpleText.fromString(programText), true, new TypeScript.ParseOptions(TypeScript.LanguageVersion.EcmaScript5, true)) console.log pj.render tree.sourceUnit(), noColor:true
- やっととれた…
- でもこのASTネストが深すぎる…
- jq的なjsonにquery投げて適当に引っこ抜けるライブラリ欲しいなァ
- jsonQueryでぐぐってみると eugeneware/jsonquery と mmckegg/json-query が引っかかる
- どっちもあんまり使われてなくて微妙っぽい…
- jqのnode.jsバインディングないんだろうか
- ……ない(確信)
- 俺がバインディングを書くしかない(錯覚)
- NAN使ってネイティブでハローワ―ルドしてみる
- node.jsのnative addonを作るときはNANを使おう。 - from scratch
- ハローワ―ルドはできたからlibjq.so 的なものを引っ張ってこよう
- stedolan/jq をmakeしようとするもMacでautomake -i するとコケる
homebrew edit jq
でformulaみてautoreconf -iv
してたので真似したらコンパイル通った- libjqがどこにもない
- jqでlibjqでぐぐる
なんか面倒臭い感じになってたので萎えてきた jq as a library (libjq)? · Issue #307 · stedolan/jq
- 8 ways to query json structures の記事をみつけたので上から全部目を通す
- JSON:select、インターフェースがjqに似てるしGithubで1200スターで結構使われてるっぽい
- JSON:select使うか
- ところでtypescriptのASTでどんなクエリ投げたらうまく定義抜けるんだろうな <- いまここ
疲れたので寝ます。