先日、ScalaのLSPサーバであるところのMetals v0.11.12がリリースされた。
このリリースで面白いLSPコードアクションが追加されたので紹介する。
sbt方式の依存性記述をScala Script方式に変換する
その機能とは依存性記述の変換機能である。といってもピンと来ないであろうから具体的に説明する。
Percent syntaxとColon syntax
普段われわれが慣れ親しんでいるScalaの依存性記述は、以下のようなスタイル(簡単のために、percent syntaxとこの記事では呼ぶことにする)ではないだろうか:
"org.typelevel" %% "cats-core" % "2.9.0"
他方、Scala ScriptやMillでは以下のように依存性を記述する(確信はないが、Mavenの完全修飾名に由来しているようだ*1。colon syntaxとこの記事では呼ぶことにする):
org.typelevel::cats-core:2.9.0
苦痛をともなう手作業syntax変換
今のところ、多くのサイトがその提供するライブラリの依存性を表現するためにpercent syntaxを使っているため、Scala Scriptを書くユーザは長らく以下のような手順を採らなければならなかった:
- Percent syntaxで依存性をコピーしてくる
- Scala Scriptにペーストする
- Colon syntaxに手で書き換える(苦痛!!)
依存性が1つや2つならいいが、これが増えるとScala Scriptの依存性記述は苦行と化してしまう。
依存性変換コードアクションの登場
この事に課題感を覚えていたユーザが多かったのか、今回Metalsには以下のような機能がLSPのコードアクションとして追加された。
- Scala Scriptの依存性記述でpercent syntaxを書いた場合、それをcolon syntaxに変換する。
LSPのコードアクションとして提供されるので、我々は以下の通りに作業ができるようになった:
- Percent syntaxで依存性をコピーしてくる
- Scala Scriptにペーストする
- コードアクションを起動してシンタックスを変換してもらう
具体的には以下のような航跡を辿ることになる:
Percent syntaxで依存性をコピーしてくる
例えば以下のような記述をコピーしてきたとしよう。
"org.typelevel" %% "cats-core" % "2.9.0"
Scala Scriptにペーストする
これをScala Scriptの冒頭のusing
句に貼り付ける。
//> using dep "org.typelevel" %% "cats-core" % "2.9.0"
当然ながらMetalsはシンタックスエラーを報告してくる。
コードアクションを起動する
慌てず騷がず落ち着いて、コードアクションを実行する。自分はEmacsでLSPを使っているので、M-x lsp-execute-code-action
を起動すればよい(普段はショートカットを割り当てている)。
すると自動的に以下のようなコードに変換される。
//> using dep "org.typelevel::cats-core:2.9.0"
便利すぎる!!! これによりScala Scriptの記述に要していた時間が大幅に短縮されることとなる。ユーザビリティに配慮したありがたい機能だ。Metals開発者の方々に感謝。
まとめ
今回は最新のMetalsに導入された痒いところに手が届く機能を紹介した。これ以外にも継続的にMetalsは改善されているので、公式Twitterなどをフォローするとよいだろう。
ちなみにEmacsではM-x update-lsp-server
を実行してmetals
を選択することで最新のMetalsをインストールすることができるのでぜひ試してみてほしい。
*1:ChatGPTくんに訊いた話。実際にMavenではそうしているので、そこそこ正しいのではないか