このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

TypeScriptコンパイラ、ひろい読み

  1. src/services/transpile.tsあたりから読む。
  2. コンパイラホスト(CompilerHost)というのがいて、OSファイルシステムを抽象化、便利化している。コンパイラコンパイラホスト上で動き、コンパイラホストの実体はinterface CompilerHostを実装していれば何でもいいので、ストレージとコンパイラの関係は非常に柔軟。
  3. コンパイラホストには、getSourceFile(fileName) という関数があり(要求されて)、これで“ソースファイル”が得られる。“ソースファイル”というのは高級な構造体(インターフェイス)で、src/compiler/types.ts に定義がある。
  4. createProgram([inputFileName1, ...], options, compilerHost) を呼ぶと“プログラム”が出来る。“プログラム”とは、src/compiler/types.tsで定義されているインターフェイスで、ソースファイルの解析結果を表すモノらしい。createProgram()は、src/compiler/program.tsで定義されている。
  5. Programインターフェイスはとても複雑。src/compiler/types.tsを読み込む必要がある。
  6. いくつかのソースファイル・オブジェクトから作られたプログラム・オブジェクトがあれば、何でも出来る感じだが、emitというメソッドが大仕事をする。
  7. テキストにシリアライズして吐き出す事をエミットと呼ぶらしい。
  8. エミッタに関しては、src/compiler/emitters.tsで定義されている。
  9. トランスフォーマーは、ASTを加工するやつ。src/compiler/transformers.tsと src/compiler/transformer/*.ts で定義される。/src/compiler/transformers/ のES2017への変換はやっていることが一番少ないはずだから、読むにはこれがいいと思う。src/compiler/transformers/es2017.ts
  10. トランスフォーマーから、"../factory.ts", "../visitor.ts" が参照されている。factoryはcreate*関数でノードを作るもの、vistorはAST内部をトラバースするもの。既存のツリーをたどりながら変更したり別なツリーを作ったりするのときに、vistorとfactoryを使うということだろう。

出力を変えたいときは、

  1. トランスフォーマーを取り替える。
  2. エミッタを取り替える。
  3. トランスフォーマーとエミッタの両方を取り替える。

があるが、大規模でない出力変更なら、エミッタを取り替えれば良さそう。

  1. エミットの出力を(おそらくはコンパイルホストに)書くにはwriterオブジェクトを使っていて、writer.write()を単にwrite()という名前の関数にしている。emitHoge()関数のwrite()呼び出しを見ると、最終的にどう書いているかが分かる。
  2. emitters.tsの863行から先に、ズラーッとemitHoge関数が並んでいる。
  3. src/services/formating/ の下が参考になるかも知れない。