Dotty x Visual Studio Code によるお手軽な開発環境の構築

この記事は[Scala Advent Calendar 2017](https://qiita.com/advent-calendar/2017/scala)の5日目の記事です。前回はokapiesさんの[Akka HTTP クライアントを使う](http://okapies.hateblo.jp/entry/2017/12/03/051725) でした。


# はじめに
本日は、Dottyによる開発環境の構築とをVisual Studio Codeを使って行う方法についてご紹介したいと思います。
また、この記事はMacユーザーを対象にしていますので、Windowsでも可能ではありますが一部手順に違いがありますことご了承下さい。

# Dottyとは

物凄く簡単になりますが、将来のScalaの型システムの目標に Dependent Object Types（DOT) があり、Dottyでは、その新しい型システムを試行するために現在のScalaとの後方互換性の制約がない状態で試すことが出来る実験的なプラットフォームです。
現行のScalaの型システムにはパス依存型がありますが、Dottyではそれに加えてリファインメント、インターセクション型、ユニオン型（他にも、リテラルレベルのシングルトン型）が記述出来るようになります。
Dottyは今後、scala 3になる[ロードマップ](https://scala-lang.org/blog/2017/05/31/first-dotty-milestone-release.html)になっているので、今のうちから勉強してもいいかもしれません。
（PS: あまり勉強出来てないので強い人教えてくださいmm)

# Scala怖くないよ
Scala怖くないよを推奨していきたいので、初心者向けにVisual Studio CodeでDottyを書けるようになる手順を書いていきたいと思います。
また自分としてもScalaのコンパイルはどうしても時間がかかると思う部分があります。最近では [sbt-coursier](https://github.com/coursier/coursier)によってMaven / Ivyリポジトリから依存関係のfetchを高速化するものも出てきてはいますが、もっと気軽にscalaを扱いたい重いが強くなってきたので、調べてみようと思いました。

# なぜ Visual Studio Codeか
IDE vs テキストエディター の戦いもありますがテキストエディタだけでもVim, Emacs, Atom, SublimeText と多くの選択肢がある中悩んだのですが、とある勉強会で聞いた話Visual Studio Codeがよさそうだったのでこちらを選びました。

それでは手順に入りたいと思います。

# dotty のインストール

brew で入れてしまいます。[Homebrew](https://brew.sh/index_ja.html)がない方は、[ここ](https://brew.sh/index_ja.html)からインストールします。

```bash
brew install lampepfl/brew/dotty
```

もしも、エラーが出たら xcode関連で足りていない依存関係があるので、下記の通り実行します。

```
xcode-select --install
```

# sbtのインストール
```bash
brew install sbt@1
```
参考: [Mac への sbt のインストール - sbt](http://www.scala-sbt.org/1.x/docs/ja/Installing-sbt-on-Mac.html)

Javaのインストールが要求された場合はJavaもインストールします。


# Visual Studio Codeのインストール
[Visual Studio Codeの公式サイト](https://www.microsoft.com/ja-jp/dev/products/code-vs.aspx) からダウンロードとインストールを行います。
一度起動したら、 `~/.bash_profile` に 

```bash:~/.bash_profile
function vscode() {
    open -a /Applications/Visual\ Studio\ Code.app/ "$@"
}

```
と書いておくと、ターミナルから直接プロジェクトが開けて便利です。 （ `vscode .` で開く ）

続いて、
[公式](https://code.visualstudio.com/docs/setup/mac#_command-line)に書いてあるように、PATHを通します。

```
cat << EOF >> ~/.bash_profile
# Add Visual Studio Code (code)
export PATH="$PATH:/Applications/Visual Studio Code.app/Contents/Resources/app/bin"
EOF
```

で入ると思います。
`code` で実行できるようになるのでちょっと不安ですが、[Dotty Language Server](https://marketplace.visualstudio.com/items?itemName=lampepfl.dotty) によると必要な手順だそうです。 


# Dotty Language Server をインストール
[ここから](https://marketplace.visualstudio.com/items?itemName=lampepfl.dotty) インストールします。
Visual Studio Code の MerketPlaceが開くので、インストールボタンを押すことで直接インストールすることが出来ます。
Visual Studio CodeでScalaを実行する場合は、Ensimeに依存していたのでちょっと重かったのですが、どうやら必要なさそうなので地味に嬉しいです。

# Dottyプロジェクトの作成

これで一通りの準備が整ったので、`sbt new`で新規プロジェクトを作成します。`sbt new`は、 `0.13.13` から使えるようになっているのでsbtをアップデートする必要があります。

dottyのシンプルなテンプレートは二つあり、

```
sbt new lampepfl/dotty.g8
```

がおすすめで、もっと凝ったテンプレートを試したい方は、

```
git clone https://github.com/lampepfl/dotty-example-project
```

で落としてきます。


# dotty language serverの起動

一度 Visual Studio Codeを終了させてから（重要）

```
sbt launchIDE
```

を実行します。これで、Visual Studio Codeでの開発を行う準備が整い、
`code`によって自動的にVisual Studio Codeが立ち上がります。

`ps aux | grep dotty` すると、裏でdotty-compilerが起動していることが確認できました。

# タスクの作成

早くコードが書きたい気持ちを我慢しながら、ビルド用のタスクを作成します。
`cmd + shift + p` で出てきたコマンドボックスに `task` と入れて、 `タスクの構成` から作ると楽です。

```tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "run",
            "type": "shell",
            "command": "sbt run"
        },
        {
            "label": "test",
            "type": "shell",
            "command": "sbt test"
        }

    ]
}
```

# キーバインディングの設定

続いて、タスクを楽に実行できるように、ショートカットキーの設定を行います。

`cmd + K → cmd + S` を押して、キーボードショートカット画面を開きます。

そこに、 `高度なカスタマイズを行うには、次を開いて編集: keybindings.json` とあるのでそちらをクリックします。

```keybindings.json
[
    { "key": "ctrl+r",        "command": "workbench.action.tasks.runTask", "args": "run" },
    { "key": "ctrl+t",        "command": "workbench.action.tasks.runTask", "args": "test" }
]
```

これで、Ctrl+R と Ctrl+T で 実行とテスト実行が行えるようになりました。
以上で、DottyによるVisual Studio Codeの開発がお手軽にできるようになりました！


# Visual Studio Code でできること（一部）

### Cmd+Click による定義場所へのジャンプ

![12月-05-2017 02-00-50.gif](https://qiita-image-store.s3.amazonaws.com/0/210850/9354bb0b-115a-7d71-dfc0-fdc828488e40.gif)


### シンタックスエラーハイライト

![12月-05-2017 02-02-24.gif](https://qiita-image-store.s3.amazonaws.com/0/210850/315ec540-5678-d280-3d56-baa9bebc156a.gif)


### 戻り値にStringを期待しているのに、型が間違っているとエラー

![12月-05-2017 02-01-43.gif](https://qiita-image-store.s3.amazonaws.com/0/210850/e3de1cd8-8d82-65c9-c405-fde209762ce4.gif)

# 最後に

軽く触ってみた感じですがとても軽いです！
たまには軽い環境でScalaを触ってみたいな、という時におすすめです。Dotty自体も、もっと深掘りしていきたいと思います。