Scala Compiler 内部で、Android の Parcelable のために特殊処理しているところ

なんとなくメモ

このあたり↓
https://github.com/scala/scala/blob/v2.9.2/src/compiler/scala/tools/nsc/backend/jvm/GenAndroid.scala
https://github.com/scala/scala/blob/v2.9.2/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala#L272
https://github.com/scala/scala/blob/v2.9.2/src/compiler/scala/tools/nsc/backend/jvm/GenJVM.scala#L924

普通の方法では*1 java での static なフィールドは、Scalaでは作れないわけですが、androidの場合だけ特殊処理していて、以下のようなclassをつくってjavapしてみたら、ちゃんと

public static final android.os.Parcelable$Creator CREATOR

というフィールドができてた


Parcelable についての公式のドキュメント


androidには Parcelable っていうデータを受け渡す際の仕組みがあって、これ使うためにはinterfaceを実装して、なおかつ規約(?)として、static な CREATOR という名前のフィールを持たないといけないわけですが、コンパイラ側内部でやっていたという・・・。
他にも極稀に、こういう「◯◯というstatic fieldを持たないといけない」というような、(使いづらい)フレームワーク側が決めた規約とか有り得そうですが、androidの場合だけベタ書きでコンパイラ側が対応しているというのもどうなんでしょうね・・・。androidの場合だけこんなことやっちゃうなら、ユーザー側である程度、自由に柔軟にstatic fieldが作れる仕組みがあってもいいような気がするけれど・・・

そして、この処理を入れたのがおそらく2.8.0が出る前のようで、2.8.1や2.8.2にはいずれもこの処理が入っていないようですね。つまり、Scala2.8系以前で Parcelable を使う場合は、Java のコードを書いてどうにかしないといけないってことでしょうかね?(実際試していないので、ある程度推測ですが。それとも他になにか方法あるのか?)
一番最初のコミットはこれですかね
Scala2.8以前もandroid用の処理自体は入っていたけれど、処理が分けられてなくて、GenJVM.scala のなかにベタ書きされていたっていうだけでしょうか・・・?まぁいつからandroid用の処理が入ったのかを厳密に調べる必要性も特にないので、こんな感じで調査はおしまい・・・

*1:コンパイラプラグインとか使わない限り