VSCode で Kotlinx Coroutines を動かすまでの手順

https://github.com/Kotlin/kotlinx.coroutines

## はじめに

気軽に Kotlin のコードを試す環境として3通りの方法を試しましたが、[Kotlin Playground](https://play.kotlinlang.org/#eyJ2ZXJzaW9uIjoiMS4zLjMwIiwiY29kZSI6ImltcG9ydCBrb3RsaW54LmNvcm91dGluZXMuKlxuaW1wb3J0IGtvdGxpbnguY29yb3V0aW5lcy5mbG93LipcblxuZnVuIGYoKTogRmxvdzxJbnQ+ID0gZmxvdyB7IGVtaXQoMSk7IGVtaXQoMik7IGVtaXQoMyk7IH1cblxuZnVuIG1haW4oKSB7XG4gICAgdmFsIHYgPSBmKClcbiAgICBydW5CbG9ja2luZyB7XG4gICAgICAgIHYuY29sbGVjdCB7IHByaW50bG4oaXQpIH1cbiAgICB9XG59IiwicGxhdGZvcm0iOiJqYXZhIiwiYXJncyI6IiJ9) はコード補完が効かなかったり実行するためのショートカットが用意されていなかったりで使いづらく、Android Studio はコンソールアプリケーションの構築方法がわからないという欠点があり、現段階では VSCode 上で動かすのが最も簡単です。

ということで、VSCode で Kotlin コードを実行するまでの手順を書いていきます。

## 環境

```
$ gradle --version

------------------------------------------------------------
Gradle 7.2
------------------------------------------------------------

Build time:   2021-08-17 09:59:03 UTC
Revision:     a773786b58bb28710e3dc96c4d1a7063628952ad

Kotlin:       1.5.21
Groovy:       3.0.8
Ant:          Apache Ant(TM) version 1.10.9 compiled on September 27 2020
JVM:          16.0.2 (Homebrew 16.0.2+0)
OS:           Mac OS X 11.5.2 x86_64
```

## 手順

### Hello World! を表示する

まず作業用ディレクトリを作成し、コマンドライン上でそのディレクトリに移動します。
そして以下のコマンドを実行します。

```
$ gradle init
```

すると色々と質問されるので、以下のように答えていきます。

```
$ gradle init

Select type of project to generate:
  1: basic
  2: application
  3: library
  4: Gradle plugin
Enter selection (default: basic) [1..4] 2

Select implementation language:
  1: C++
  2: Groovy
  3: Java
  4: Kotlin
  5: Scala
  6: Swift
Enter selection (default: Java) [1..6] 4

Split functionality across multiple subprojects?:
  1: no - only one application project
  2: yes - application and library projects
Enter selection (default: no - only one application project) [1..2] 1

Select build script DSL:
  1: Groovy
  2: Kotlin
Enter selection (default: Kotlin) [1..2] 1

Project name (default: asdf): 
Source package (default: asdf): 

> Task :init
Get more help with your project: https://docs.gradle.org/7.2/samples/sample_building_kotlin_applications.html

BUILD SUCCESSFUL in 39s
2 actionable tasks: 2 executed
```

すべての質問に答え終わるとプロジェクトの作成が完了します。`gradle run` で Kotlin が正しく実行されることを確認します。

```
$ gradle run

> Task :app:run
Hello World!

BUILD SUCCESSFUL in 812ms
2 actionable tasks: 1 executed, 1 up-to-date
```

### Kotlinx Coroutines ライブラリを追加する

./app/build.gradle を開き、dependencies ブロック内に次の一行を追加します。

```groovy
// https://github.com/Kotlin/kotlinx.coroutines
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2'
```

追加し終わった後、./app/src/main/kotlin/[パッケージ名]/App.kt を開いて次のコードに修正します。

```kotlin
package asdf    // 適切なパッケージ名

import kotlinx.coroutines.*

fun main() {
    runBlocking {
        launch {
            delay(1000)
            println("World")
        }
        println("Hello")
    }
}
```

再度 `gradle run` を実行すると次のように出力されます。

```
$ gradle run

> Task :app:run
Hello
World

BUILD SUCCESSFUL in 1s
2 actionable tasks: 1 executed, 1 up-to-date
```

画面上は正しく出力されているように見えますが、この出力はすべて一瞬で表示されます。 `delay(1000)` と書いているにも関わらず、「Hello が出力されてから1秒後に World が出力される」ということが確認できません。

`gradle run -q` を実行することで上記の動作が確認できます（`-q` オプションは最低限の出力に留めるオプションですが、今回はこのオプションがうまくいきます）。

```
$ gradle run -q
Hello
World   # Hello が出力されてから1秒後に出力される
```

### VSCode 拡張機能をインストールする

[Kotlin Language](https://marketplace.visualstudio.com/items?itemName=mathiasfrohlich.Kotlin) をインストールすると、シンタックスハイライトが効きます。コード補完や lint の機能を利用したい場合は [Kotlin](https://marketplace.visualstudio.com/items?itemName=fwcd.kotlin) をインストールします。

## まとめ

これで Kotlinx Coroutines のハンズオンが捗るはずです。

https://kotlinlang.org/docs/coroutines-guide.html