読者です 読者をやめる 読者になる 読者になる

めっちゃヤク刈った

  • やりたいこと: TypeScriptの型定義 *.d.tsファイルをパースして型情報を手に入れたい
  • 最初に考えたこと: TypeScriptのASTを引っこ抜いて適当にパースすれば良いんじゃね?
  • scala.jsの作者がTypeScriptからscala.jsへの変換を書いてるのを発見
  • 素直に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

疲れたので寝ます。