scalajs コードリーディング
今回は backend.emit を見ていく
implementation: javascript
なんかよく分からんけど2回以上実行されることもあるらしい
emitOnce
emitOnce 内
generateClass
genModuleImports で module間の依存関係の解決
toplevel exports
module initializer
corejs https://scrapbox.io/shokai/core-js
ほんで最終的にここで全部 js.Tree を構築。js.Tree って何?
moduleImports を頭に加えて
val WithGlobals(body: Map[ModuleID,List[Trees.Tree]], globalRefs: Set[String]) =
emitInternal(moduleSet, logger)
body は Result
に含まれていて、cache に登録
PrintedTreesCache#update で printed tree を計算
PrintedTreeにはjs codeがそのまま入ってる
ここが tree printer 本番
いつの間に ir Tree から js.Tree になってるの? -> https://github.com/tanishiking/scala-js/blob/86d3f00d8056d77e69fb93463a81b6dfd1c9c8ba/linker/shared/src/main/scala/org/scalajs/linker/backend/emitter/Emitter.scala#L177 の emitOnce
genClass
返り値の型は
これは何? JSは一旦飛ばそう
static like ってなんですか?
引き続き genClass の中身
Scala class の実装に ECMAScript の class を使っていたが、今は Throwable なやつしか基本的には class は使わないらしい
パフォーマンスが理由らしいです
constructors
methods and members
exported members
って何?
class 定義
Linker編