Scala.jsで変換結果をASTにして弄ってる最中に分かったことのメモです。
@JSExport
@JSExport
で出力するときにクラスの種類によってJSに変換されるコードの変数名が変わる。
import scala.annotation.tailrec
import scala.scalajs.js
import js.annotation.JSExport
import scala.annotation.meta.field
@JSExport
class Hoge1 {
println("Hoge1");
}
// @JSExport
abstract class Hoge2 {
println("Hoge2");
}
@JSExport
final class Hoge3 {
println("Hoge3");
}
@JSExport
sealed class Hoge4 {
println("Hoge4");
}
@JSExport
case class Hoge5() {
println("Hoge5");
}
case class Hoge6(
@(JSExport @field) fuga: Double,
@(JSExport @field) piyo: Double)
// @JSExport
trait Hoge7 {
println("Hoge7");
}
@JSExport
class Hoge8 extends Hoge7 {
println("Hoge8");
}
@JSExport
object Hoge9 {
println("Hoge9");
}
JSExport対応表
JSExport | variable | export |
---|---|---|
class Hoge1 | \$c_LHoge1, \$h_LHoge1, \$d_LHoge1 | \$c_LHoge1 |
abstract class Hoge2 | \$c_LHoge2, \$h_LHoge2 | none |
final class Hoge3 | \$c_LHoge3, \$h_LHoge3, \$d_LHoge3 | \$c_LHoge1 |
sealed class Hoge4 | \$c_LHoge4, \$h_LHoge4, \$d_LHoge4 | \$c_LHoge1 |
case class Hoge5() | \$c_LHoge5, \$h_LHoge5, \$d_LHoge5 | \$c_LHoge1 |
case class Hoge6(@(JSExport @field) fuga: Double) | \$c_LHoge6, $h_LHoge6. $d_LHoge6 | none |
trait Hoge7 | \$s_LHoge7 | none |
class Hoge8 extends Hoge7 | \$c_LHoge8, \$h_LHoge8, \$d_LHoge8 | \$c_LHoge1 |
object Hoge9 | \$c_LHoge9, \$h_LHoge9, \$d_LHoge9, \$n_LHoge9, \$m_LHoge9 | \$m_LHoge9 |
$c_Lxxx$
var $c_LHoge1 = (function() {
$c_O.call(this)
});
$c_LHoge1.prototype.init___ = (function() {
$c_O.prototype.init___.call(this);
$m_s_Predef$().println__O__V("Hoge1");
return this
});
$d_Lxxx$
var $d_LHoge1 = new $TypeData().initClass({
LHoge1: 0
}, false, "Hoge1", {
LHoge1: 1,
O: 1
});
$h_Lxxx$
var $h_LHoge1 = (function() {
/*<skip>*/
});
$n_Lxxx$
var $n_LHoge9$ = (void 0);
$m_Lxxx$
var $m_LHoge9$ = (function() {
if ((!$n_LHoge9$)) {
$n_LHoge9$ = new $c_LHoge9$().init___()
};
return $n_LHoge9$
});
$s_Lxxx$
var $s_LHoge7$class__$$init$__LHoge7__V = (function($$this) {
$m_s_Predef$().println__O__V("Hoge7")
});
Classをグローバルに設定
$e["Hoge1"] = (function() {
var $thiz = new $c_LHoge1();
$c_LHoge1.prototype.init___.call($thiz);
return $thiz
});
$e["Hoge1"].prototype = $c_LHoge1.prototype;
Objectをグローバルに設定
$e["Hoge9"] = $m_LHoge9$;