リポジトリ
https://github.com/JetBrains/kotlin
jvmおなじみのディレクトリ階層で奥深くにソースコードが埋もれていてちょっとつらい。
Kotlinソースコード探訪が非常に役立った。
つまみ読み
実装に使ってる言語
jvmらしくJavaとKotlinがほとんど。
Scala96.6%はなんなんだ。
data class
DataClassMethodGenerator
generatorはKotlin持ち。
testData
で、本体がどこにいるのかよくわからなかったが、compilerにテストがあるのでおそらくその辺。
https://github.com/JetBrains/kotlin/tree/master/compiler/testData/loadJava/compiledKotlin/dataClass
data class(やclassやconstructor)のテストの引数の個数は0と1と2でそれぞれチェックしてた。
function
Represents a function with introspection capabilities.
- isExternal:
true
if this function isexternal
. → https://kotlinlang.org/docs/reference/java-interop.html#using-jni-with-kotlin - isOperator:
true
if this function isoperator
. → https://kotlinlang.org/docs/reference/operator-overloading.html - isInfix:
true
if this function isinfix
. → https://kotlinlang.org/docs/reference/functions.html#infix-notation - isSuspend:
true
if this is a suspending function.
という情報の管理はKotlinで実装している。
Array
ArrayとArraysが存在している。
https://github.com/JetBrains/kotlin/blob/master/core/builtins/native/kotlin/Array.kt
こっちは get
や set
や iterator
のようなArrayにありがちなメソッドが書いてある。
(flattenとかunzipはこっち
https://github.com/JetBrains/kotlin/blob/master/libraries/stdlib/src/kotlin/collections/Arrays.kt)
https://github.com/JetBrains/kotlin/blob/master/core/builtins/native/kotlin/Arrays.kt
の方は、 ByteArray
(→ byte[]
)だったり CharArray
(→ char[]
)だったりと表現されるものたちのあつまり。
この微妙なArray(s)の違いはRange(s)でも発生してた。
https://github.com/JetBrains/kotlin/blob/master/core/builtins/src/kotlin/Range.kt
https://github.com/JetBrains/kotlin/blob/master/core/builtins/src/kotlin/Ranges.kt
collectionについては
https://github.com/JetBrains/kotlin/tree/master/libraries/stdlib/src/kotlin/collections
を読むと楽しそう。
自動生成
上記
https://github.com/JetBrains/kotlin/blob/master/core/builtins/native/kotlin/Arrays.kt
のファイルは自動生成されたもので、
https://github.com/JetBrains/kotlin/blob/master/generators/src/org/jetbrains/kotlin/generators/builtins/arrays.kt
にそれらしきものが存在している。
Swiftではgybで配列回して生成してたが、こちらは BuiltInsSourceGenerator
なるものにテンプレを書くしくみらしい。Arraysはそこに enum class PrimitiveType
で列挙している型を突っ込んでまわすらしい。
感想
Scala(やゆかいなjvm言語)とくらべたら楽しそうだけど、言語に詳しく無いので難しい。