Kotlin 2.3.20-Beta1 の新機能
このドキュメントは Early Access Preview (EAP) リリースのすべての機能を網羅しているわけではありませんが、主要な改善点について詳しく説明します。
変更点の完全なリストについては、GitHub の変更履歴を参照してください。
Kotlin 2.3.20-Beta1 がリリースされました!この EAP リリースの主な内容は以下の通りです。
- 言語: コンテキストパラメータの Stable 化、明示的なバッキングフィールド、およびアノテーションの使用箇所ターゲット向けの複数の機能
- 標準ライブラリ: UUID の Stable 化 および ソート順を確認するためのサポート
- Kotlin/JVM: Java 26 のサポート および メタデータ内のアノテーションをデフォルトで有効化
- Kotlin/Native: 依存関係としての Swift パッケージのサポート、Swift export のアップデート、およびデフォルトの CMS GC
- Kotlin/Wasm: インクリメンタルコンパイルのデフォルト有効化と WebAssembly Component Model のサポート
- Kotlin/JS: バリュークラスのエクスポートのサポートと、JS コードインライン化における ES2015 機能のサポート
- Gradle: Gradle 9.4.1 との互換性
- Maven: Java と JVM ターゲットバージョンの自動調整
- Kotlin コンパイラ:
.klibコンパイル中のより一貫したインライン関数の動作
Kotlin のリリースサイクルに関する情報は、Kotlin のリリースプロセスを参照してください。
Kotlin 2.3.20-Beta1 へのアップデート
最新バージョンの Kotlin は、最新バージョンの IntelliJ IDEA および Android Studio に含まれています。
新しい Kotlin バージョンにアップデートするには、IDE が最新バージョンに更新されていることを確認し、ビルドスクリプト内の Kotlin バージョンを 2.3.20-Beta1 に変更してください。
新機能 {id=new-stable-features}
以前の Kotlin リリースでは、いくつかの新機能が実験的 (Experimental) として導入されました。以下の機能は、Kotlin 2.3.20-Beta1 で Stable (安定版) に昇格したため、使用するためにオプトインする必要はなくなりました。
- コンテキストパラメータ (Context parameters)(ただし、コンテキスト引数および 呼び出し可能参照を除く)
- プロパティ向けの
@allメインターゲット - 使用箇所アノテーションターゲット向けの新しいデフォルトルール
- 明示的なバッキングフィールド (Explicit backing fields)
- 共通の Kotlin 標準ライブラリにおける Stable な UUID
- ソート順を確認するためのサポート
- JVM 上で符号なし整数を
BigIntegerに変換するための新しい API - JavaScript/TypeScript へのバリュークラスのエクスポートのサポート
- JS コードをインライン化する際の ES2015 機能のサポート
- Maven: Java と JVM ターゲットバージョンの自動調整
新機能 {id=new-experimental-features}
- コンテキストパラメータ向けの明示的なコンテキスト引数
- コレクションリテラルのサポート
- 改善されたコンパイル時定数
- Swift パッケージのインポート
- Swift export: コルーチンの Flow をエクスポートするためのサポート
- WebAssembly Component Model のサポート
言語
Kotlin 2.3.20-Beta1 では、コンテキストパラメータ、明示的なバッキングフィールド、およびアノテーションの使用箇所ターゲット機能が Stable に昇格しました。また、このリリースではコンテキストパラメータ向けの明示的なコンテキスト引数が導入されています。
Stable な機能
Kotlin 2.2.0 では、いくつかの言語機能が 実験的 (Experimental) として導入されました。本リリースにおいて、以下の言語機能が Stable になったことをお知らせします。
- コンテキストパラメータ(ただし、コンテキスト引数および 呼び出し可能参照を除く)
- プロパティ向けの
@allメインターゲット - 使用箇所アノテーションターゲット向けの新しいデフォルトルール
- 明示的なバッキングフィールド
Kotlin の言語デザイン機能と提案の全リストについてはこちらをご覧ください。
コンテキストパラメータ向けの明示的なコンテキスト引数
Kotlin 2.3.20-Beta1 では、コンテキストパラメータに対して明示的なコンテキスト引数を渡せるようになりました。
Kotlin 2.3.20 では、コンテキストパラメータのオーバーロード解決が変更されました。その結果、コンテキストパラメータのみが異なるオーバーロードの呼び出しが曖昧になる可能性があります。
呼び出し側で明示的なコンテキスト引数を渡すことで、この曖昧さを解決できるようになりました。
例を以下に示します。
class EmailSender
class SmsSender
context(emailSender: EmailSender)
fun sendNotification() {
println("Sent email notification")
}
context(smsSender: SmsSender)
fun sendNotification() {
println("Sent SMS notification")
}
context(defaultEmailSender: EmailSender, defaultSmsSender: SmsSender)
fun notifyUser() {
// EmailSender コンテキストパラメータを持つオーバーロードを選択します
sendNotification(emailSender = defaultEmailSender)
// SmsSender コンテキストパラメータを持つオーバーロードを選択します
sendNotification(smsSender = defaultSmsSender)
}また、context() 関数の代わりに明示的なコンテキスト引数を使用して、ネストを減らし、一部の呼び出しを読みやすくすることもできます。複数の呼び出しで同じコンテキスト引数を使用する必要がある場合は、引き続き context() 関数を使用してください。
この機能は 実験的 (Experimental) です。オプトインするには、ビルドファイルに以下のコンパイラオプションを追加してください。
kotlin {
compilerOptions {
freeCompilerArgs.add("-Xexplicit-context-arguments")
}
}<build>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<configuration>
<args>
<arg>-Xexplicit-context-arguments</arg>
</args>
</configuration>
</plugin>
</plugins>
</build>詳細については、この機能の KEEP を参照してください。
コレクションリテラルのサポート
Kotlin 2.3.20-Beta1 では、コレクションリテラルの実験的なサポートが導入されました。角括弧 [] を使用して、よりシンプルかつ簡潔にコレクションを作成できるようになりました。
例を以下に示します。
fun main() {
// 明示的な型宣言を伴うミュータブルリスト
// val shapes: MutableList<String> = mutableListOf("triangle", "square", "circle")
// 角括弧構文を使用したミュータブルリスト
val shapes: MutableList<String> = ["triangle", "square", "circle"]
println(shapes)
// [triangle, square, circle]
}現在、コレクションリテラルを使用して Java で定義されたコレクションを構築することはできません。詳細については、KT-80494 を参照してください。
コンパイラがコレクションの型を推論するのに十分な情報を持っていない場合、デフォルトで List 型になります。
fun main() {
val fruit = ["apple", "banana", "cherry"]
println(fruit)
// [apple, banana, cherry]
}また、独自の型で角括弧構文を使用するために、カスタムの operator fun of 関数を宣言することもできます。例えば、以下のような DoubleMatrix クラスがある場合:
class DoubleMatrix(vararg val rows: Row) {
companion object {
operator fun of(vararg rows: Row) = DoubleMatrix(*rows)
}
class Row(vararg val elements: Double) {
companion object {
operator fun of(vararg elements: Double) = Row(*elements)
}
}
}以下のように identityMatrix クラスのインスタンスを作成できます。
fun main() {
val identityMatrix: DoubleMatrix = [
[1.0, 0.0, 0.0],
[0.0, 1.0, 0.0],
[0.0, 0.0, 1.0],
]
}この例では、コンパイラはネストされたコレクションリテラルを、対応する operator fun of 関数の呼び出しに変換します。コンパイラはこれらの呼び出しを再帰的に解決し、期待される型を使用して正しいオーバーロードを選択します。
この機能は 実験的 (Experimental) です。オプトインするには、ビルドファイルに以下のコンパイラオプションを追加してください。
kotlin {
compilerOptions {
freeCompilerArgs.add("-Xcollection-literals")
}
}<build>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<configuration>
<args>
<arg>-Xcollection-literals</arg>
</args>
</configuration>
</plugin>
</plugins>
</build>詳細については、この機能の KEEP を参照してください。
改善されたコンパイル時定数
Kotlin 2.3.20-Beta1 では、コンパイル時定数 (compile-time constants) に実験的な改善が加えられ、数値型と文字列型のサポートが一貫し、使いやすくなりました。これらの改善には以下のサポートが含まれます。
- 符号なし整数型の演算。
.lowercase()、.uppercase()、.trim()関数などの文字列用標準ライブラリ関数。- 列挙型定数 (enum constants) の
.nameプロパティおよびKCallableインターフェース の評価。
どの関数がコンパイル時に評価されるかを明確にするために、Kotlin 2.3.20-Beta1 では IntrinsicConstEvaluation アノテーションが導入されました。一部の関数はコンパイル時に評価されますが、まだアノテーションが付いていません。将来のリリースで残りの関数にもアノテーションが追加される予定です。サポートされている関数のリストについては、KEEP の 付録 (appendix) を参照してください。
この機能は 実験的 (Experimental) です。オプトインするには、ビルドファイルに以下のコンパイラオプションを追加してください。
kotlin {
compilerOptions {
freeCompilerArgs.add("-XXLanguage:+IntrinsicConstEvaluation")
}
}<build>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<configuration>
<args>
<arg>-XXLanguage:+IntrinsicConstEvaluation</arg>
</args>
</configuration>
</plugin>
</plugins>
</build>詳細については、この機能の KEEP を参照してください。
標準ライブラリ
Kotlin 2.3.20-Beta1 では、共通の Kotlin 標準ライブラリにおける UUID のサポートが Stable になりました。また、JVM 上で符号なし整数を BigInteger に変換するための新しい拡張関数と、ソート順のチェックのサポートも追加されています。
共通の Kotlin 標準ライブラリにおける Stable な UUID
Kotlin 2.0.20 では、UUID (universally unique identifiers) を生成するためのクラス が導入され、Kotlin と Java の UUID 間の変換サポートが追加されました。その後のリリースで、以下のようなサポートを追加することで、この実験的機能は段階的に改善されてきました。
Kotlin 2.3.20-Beta1 では、kotlin.uuid.Uuid API が Stable になりました。唯一の例外は V4 および V7 UUID を生成するための関数 で、これらは 実験的 (Experimental) のままであり、引き続きオプトインが必要です。
ソート順を確認するためのサポート
Kotlin 2.3.20-Beta1 では、iterable、配列、および sequence でソート順を確認するための新しい拡張関数が追加されました。
これには以下の拡張関数が含まれます。
.isSorted().isSortedDescending().isSortedWith(comparator).isSortedBy(selector).isSortedByDescending(selector)
これらの拡張関数を使用すると、要素を再度ソートしたり独自のヘルパー関数を作成したりすることなく、要素が既にソートされているかどうかを確認できます。要素が指定された順序である場合、または要素が 2 つ未満の場合は true を返し、それ以外の場合は false を返します。これらの関数は、順序どおりでないペアが見つかるとすぐに停止するため、大規模な入力に対して効率的です。
.isSorted() および .isSortedBy() 関数を使用してソート順を確認する例を以下に示します。
data class User(val name: String, val age: Int)
fun main() {
val numbers = listOf(1, 2, 3, 4)
println(numbers.isSorted())
// true
val users = listOf(
User("Alice", 24),
User("Bob", 31),
User("Charlie", 29),
)
println(users.isSortedBy(User::age))
// false
}フィードバックを YouTrack でお待ちしております。
JVM 上で符号なし整数を BigInteger に変換するための新しい API
Kotlin 2.3.20-Beta1 では、JVM 上に UInt.toBigInteger() および ULong.toBigInteger() 拡張関数が導入されました。
以前は、UInt や ULong の値を BigInteger に変換するには、文字列ベースのワークアラウンドやカスタムの変換ロジックが必要でした。Kotlin 2.3.20-Beta1 以降では、.toBigInteger() を使用して符号なし整数の値を直接 BigInteger に変換できます。
例を以下に示します。
fun main() {
val unsignedLong = Long.MAX_VALUE.toULong() + 1uL
val unsignedInt = UInt.MAX_VALUE
println(unsignedLong.toBigInteger())
// 9223372036854775808
println(unsignedInt.toBigInteger())
// 4294967295
}フィードバックを YouTrack でお待ちしております。
Kotlin/JVM
Kotlin 2.3.20-Beta1 では、新しい Java バージョンをサポートし、メタデータ内のアノテーションがデフォルトで有効になりました。
Java 26 のサポート
Kotlin 2.3.20-Beta1 以降、コンパイラは Java 26 バイトコードを含むクラスを生成できます。
メタデータ内のアノテーションをデフォルトで有効化
Kotlin 2.2.0 の Kotlin Metadata JVM ライブラリでは、Kotlin メタデータに保存されたアノテーションの読み取りサポートが導入されました。このサポートにより、Kotlin コンパイラは JVM バイトコードと並行してメタデータにアノテーションを書き込み、Kotlin Metadata JVM ライブラリからアクセスできるようにします。その結果、アノテーションプロセッサやその他のツールは、リフレクションを使用したりソースコードを変更したりすることなく、メタデータレベルでこれらのアノテーションを理解し操作できるようになります。
Kotlin 2.3.20-Beta1 では、このサポートがデフォルトで有効になっています。
Kotlin/Native
Kotlin 2.3.20-Beta1 では、Swift パッケージのインポートのサポート、Swift export を通じた相互運用の改善、およびガベージコレクタにおけるデフォルトの並行マーク(concurrent marking)が導入されました。
Swift パッケージのインポート
Kotlin Multiplatform プロジェクトにおいて、Gradle 構成で iOS アプリの依存関係として Swift パッケージ を宣言できるようになりました。
// build.gradle.kts
kotlin {
swiftPMDependencies {
swiftPackage(
url = url("https://github.com/firebase/firebase-ios-sdk.git"),
version = from("12.11.0"),
products = listOf(
product("FirebaseAI"),
product("FirebaseAnalytics"),
...
}動作するサンプルや詳細な情報については、SwiftPM インポート を参照してください。
プロジェクトが CocoaPods の依存関係に依存している場合は、現在のセットアップを Swift パッケージを使用するように移行できます。KMP ツールはこのユースケースを考慮しており、プロジェクトの自動再構成を支援します。詳細については、CocoaPods 移行ガイド を参照してください。
Swift export: コルーチンの Flow をエクスポートするためのサポート
Kotlin 2.3.20-Beta1 では、kotlinx.coroutines の Flow を Swift にエクスポートするサポートを追加することで、Swift export を通じた Swift との相互運用性をさらに向上させています。
kotlinx.coroutines の Flow は、並行して発行および消費できるデータの非同期ストリームを表します。これらは、データベースの更新、ネットワークリクエスト、または UI イベントのリスニングなどのリアクティブプログラミングパターンによく使用されます。
以前は、kotlinx.coroutines.flow の Flow インターフェースを Swift に公開する唯一の方法は、サードパーティのソリューションを使用することでした。今回のアップデートにより、標準機能として Swift の慣用的な対応物である AsyncSequence にエクスポートできるようになりました。
この機能はデフォルトで有効になっています。型情報を保持したまま、Flow 型を持つ任意のパブリック API を Swift にエクスポートできます。 例を以下に示します。
// Kotlin
// Flow をエクスポートする際、String 型が保持されます
fun flowOfStrings(): Flow<String> = flowOf("hello", "any", "world")// Swift
var actual: [String] = []
// String 型が Kotlin から正しく推論されます
for try await element in flowOfStrings().asAsyncSequence() {
actual.append(element)
}Swift export の詳細については、ドキュメント を参照してください。
ガベージコレクタのデフォルトの並行マーク
Kotlin 2.0.20 において、Kotlin チームは並行マークアンドスイープ ガベージコレクタ (CMS GC) の 実験的なサポートを導入しました。ユーザーからのフィードバックの処理とリグレッションの修正を経て、Kotlin 2.3.20-Beta1 以降、CMS をデフォルトで有効にする準備が整いました。
以前のガベージコレクタにおけるデフォルトの並行スイープを伴う並列マーク (PMCS) の設定では、GC がヒープ内のオブジェクトをマークする間、アプリケーションのスレッドを停止させる必要がありました。それに対し、CMS ではマークフェーズをアプリケーションスレッドと並行して実行できます。
これにより、GC の停止時間とアプリの応答性が大幅に向上します。これは、レイテンシが重要なアプリケーションのパフォーマンスにとって重要です。CMS は、Compose Multiplatform で構築された UI アプリケーションのベンチマークにおいて、すでにその有効性を実証しています。
問題が発生した場合は、PMCS に戻すことができます。その場合は、gradle.properties ファイルに以下の バイナリオプション を設定してください。
kotlin.native.binary.gc=pmcsKotlin/Native ガベージコレクタの詳細については、ドキュメント を参照してください。
Kotlin/Wasm
Kotlin 2.3.20-Beta1 では、Kotlin/Wasm のインクリメンタルコンパイルがデフォルトで有効になり、WebAssembly Component Model のサポートが導入されました。
インクリメンタルコンパイルのデフォルト有効化
Kotlin/Wasm は 2.1.0 でインクリメンタルコンパイルを導入しました。Kotlin 2.3.20-Beta1 以降、これは Stable となり、デフォルトで有効になっています。 この機能により、コンパイラは最近の変更によって影響を受けたファイルのみを再ビルドするため、ビルド時間が大幅に短縮されます。
インクリメンタルコンパイルを無効にするには、プロジェクトの local.properties または gradle.properties ファイルに以下の行を追加してください。
# gradle.properties
kotlin.incremental.wasm=false問題が発生した場合は、YouTrack で報告してください。
WebAssembly Component Model のサポート
Kotlin/Wasm は Kotlin 2.3.20-Beta1 でさらに一歩進み、WebAssembly Component Model の実験的なサポートを導入しました。 このプロポーザルは、標準化されたインターフェースと型を通じて Wasm モジュールからコンポーネントを構築する方法を定義しています。このアプローチは、Wasm を低レベルのバイナリ命令フォーマットから、再利用可能で言語に依存しないコンポーネントを構成するためのシステムへと進化させるのに役立ちます。これにより、Kotlin/Wasm がブラウザを超えて利用可能になります。例えば、Kotlin と WebAssembly は、FaaS (Function-as-a-Service) またはサーバーレスアプリケーションに非常に適しています。
この機能を試すには、wasi:http で構築されたシンプルなサーバー を確認してください。

フィードバックを YouTrack で共有してください。
Kotlin/JS
Kotlin 2.3.20-Beta1 では、JavaScript/TypeScript へのバリュークラスのエクスポートのサポートと、JS コードインライン化時の ES2015 機能のサポートが追加されました。
JavaScript/TypeScript へのバリュークラスのエクスポートのサポート
以前は、通常の Kotlin クラスのみが JavaScript/TypeScript にエクスポート可能でした。 Kotlin 2.3.20-Beta1 ではその制限が解除されました。Kotlin の インラインバリュークラス (inline value classes) を、通常の TypeScript クラスとしてエクスポートできるようになりました。
バリュークラスをエクスポートするには、Kotlin 側で @JsExport アノテーションを付けます。
// Kotlin
@JsExport
@JvmInline
value class Email(val address: String) {
init { require(address.contains("@")) { "Invalid email" } }
}
@JsExport
class AuthService {
suspend fun login(email: Email): String = ...
}TypeScript 側からは、通常のクラスのように見えます。
// TypeScript
import { AuthService, Email } from "..."
const auth = new AuthService();
console.log(await auth.login(new Email("[email protected]")));
// "Welcome, [email protected]!"
console.log(await auth.login(new Email("not-an-email")));
// "Invalid email"詳細については、@JsExport アノテーション を参照してください。
JS コードをインライン化する際の ES2015 機能のサポート
Kotlin 2.3.20-Beta1 以降、JavaScript コードのインライン化において ES2015 機能 がフルサポートされました。
これはサードパーティライブラリとの相互運用だけでなく、アプリケーションコードの自動生成を直接制御する場合にも役立ちます。
js() の呼び出し内で、以下を含む最新の JS 機能を使用できるようになりました。
- ラムダ (アロー関数)
- ES クラス
- テンプレート文字列
- スプレッド演算子
constおよびlet変数宣言- ジェネレータ
js() 関数のパラメータは、コンパイル時にパースされ JavaScript コードに「そのまま」変換されるため、文字列定数である必要があることに注意してください。 例えば、スプレッド演算子の場合は以下のように使用します。
fun spreadExample(): dynamic = js("""
const add = (a, b, c) => a + b + c;
const nums = [1, 2, 3];
const sum = add(...nums);
const a = [1, 2, 3];
const b = [...a, 4, 5, 6];
return { sum, b: b };
""")インライン JavaScript コードのインライン化の詳細については、ドキュメント を参照してください。
Gradle
Kotlin 2.3.20-Beta1 は、Gradle 7.6.3 から 9.4.1 と完全に互換性があります。最新の Gradle リリースまでのバージョンも使用可能ですが、その場合は非推奨の警告が表示されたり、一部の新しい Gradle 機能が動作しなかったりする可能性があることに注意してください。
Maven
Kotlin 2.3.20-Beta1 では、Java と JVM ターゲットバージョンの自動調整により、プロジェクト構成がさらに容易になりました。
Java と JVM ターゲットバージョンの自動調整
プロジェクト構成を簡素化し互換性の問題を防止するために、Kotlin Maven プラグインは、プロジェクトで構成された Java コンパイラバージョンに合わせて JVM ターゲットバージョンを自動的に調整するようになりました。
これにより、Kotlin と Maven のコンパイラが同じバイトコードバージョンをターゲットにすることが保証され、Kotlin が生成したバイトコードがプロジェクトの他の部分や意図したデプロイ環境と互換性がないという問題を回避できます。
<extensions> オプションを有効にすると、kotlin.compiler.jvmTarget プロパティは不要になります。まだ定義されていない場合、Kotlin Maven プラグインは以下の順序で JVM ターゲットバージョンを自動的に解決します。
プロジェクトプロパティとして、または
maven-compiler-plugin構成内で定義されたmaven.compiler.releaseバージョン。この場合、Kotlin コンパイラには
jvmTargetとjdkReleaseコンパイラオプションの両方が設定され、API は特定の JDK バージョンに制限されます。Maven のリリースバージョンが設定されていない場合は、
maven.compiler.targetバージョン。コンパイラターゲットは、プロジェクトプロパティとして、またはmaven-compiler-plugin構成内で定義できます。この場合、Kotlin の
jvmTargetのみが設定され、API は特定の JDK バージョンに制限されません。
これにより、Kotlin プロジェクトの構成が大幅に簡素化され、pom.xml ファイルは以下のようになります。
<properties>
<maven.compiler.release>17</maven.compiler.release>
<kotlin.version>2.3.0</kotlin.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<extensions>true</extensions>
</plugin>
</plugins>
</build>ビルド中、プラグインは以下のようなメッセージを出力します。
[INFO] Using jvmTarget=17 (derived from maven.compiler.release=17)
<extensions>オプションは、プロジェクトレベルのプロパティとグローバルなmaven-compiler-plugin構成のみをチェックします。 プラグインの<executions>セクション内で定義された構成はチェックしません。
プロジェクトの自動構成の詳細については、ドキュメント を参照してください。
Kotlin コンパイラ
Kotlin 2.3.20-Beta1 では、.klib コンパイル中に同じモジュール内で宣言されたインライン関数の一貫した動作が導入されました。
klib コンパイル中の一貫したモジュール内関数インライン化
以前は、関数インライン化 (function inlining) の動作は Kotlin のプラットフォームごとに異なっていました。JetBrains チームは、同じ互換性保証を確実にするために、サポートされているすべてのプラットフォームでこれを統一する作業を進めています。
Kotlin/JVM では、関数のインライン化はコンパイル時に発生します。そのため、Kotlin ソースが Kotlin/JVM コンパイラでコンパイルされる際、生成されたクラスファイルのバイトコードにはインライン関数の呼び出しは含まれません。インライン関数の本体が呼び出し側にインライン化されるため、その動作はコンパイル時に確定します。
それに対して、Kotlin/Native、Kotlin/JS、および Kotlin/Wasm では、ソースから klib へのコンパイル中には関数のインライン化は行われず、バイナリ生成時にのみ行われていました。その結果、インライン関数の動作は .klib コンパイル中に確定されず、.klib ライブラリは Kotlin/JVM が提供するようなインライン関数の互換性保証を提供していませんでした。
Kotlin 2.3.20-Beta1 では、.klib アーティファクトの生成時にモジュール内 (intra-module) のインライン化を有効にすることで、インライン関数の動作を統一するための第一歩を踏み出しました。
// 既存の logging.klib ライブラリ
inline fun logDebug(message: String) {
println("[DEBUG] $message")
}// 現在コンパイル中の App モジュール
inline fun greetUser(name: String) {
println("Hello, $name!")
}
fun main() {
logDebug("App started") // インライン化されない: 別のモジュールで宣言されている
greetUser("Alice") // インライン化される: 同じモジュールで宣言されている
}.klib にコンパイルされると、コードは以下のようになります。
// 疑似コード
fun main() {
logDebug("App started") // インライン化されない、別のモジュールで宣言されている
val tmp0 = "Alice"
println("Hello, $tmp0!") // greetUser() からインライン化された
}これは、.klib コンパイル中には同じモジュール内で宣言されたインライン関数のみがインライン化されることを意味します。この場合、他の関数はプラットフォーム固有のバイナリ生成中にインライン化されます。
有効にする方法
2.3.20-Beta1 以降、モジュール内のインライン化は Kotlin/Native、Kotlin/JS、および Kotlin/Wasm でデフォルトで有効になっています。
この機能で予期しない問題が発生した場合は、コマンドラインで以下のコンパイラオプションを使用して無効にすることができます。
-Xklib-ir-inliner=disabled次のステップは、プロジェクト内のすべてのインライン関数が一貫してインライン化されるように、モジュール間 (cross-module) のインライン化を有効にすることです。この変更は将来の Kotlin リリースで予定されていますが、コマンドラインで以下のコンパイラオプションを使用することで、既に試してみることができます。
-Xklib-ir-inliner=fullフィードバックの共有や問題の報告は、YouTrack でお願いします。
