ScalaでIntelliJプラグインを作ってみる

IntelliJプラグインを作りたいなと思うものがあったのですが、Scala開発用のものだし、JetBrainsからScalaプラグインを開発するためのsbt-idea-pluginというsbtプラグインも提供されているようなので折角なのでScalaIntelliJプラグインを作る方法を調べてみました。

github.com

上記のsbtプラグインのREADMEに書かれているのですが、GitHub上でこのsbtプラグインを使用したサンプルプロジェクトのテンプレートが公開されています。

github.com

このテンプレートリポジトリからリポジトリを作成し、cloneしてきてIntelliJで開くとプラグインの開発を行うことができます。

が、このテンプレートリポジトリはあまりメンテされていないようで、sbtやIntelliJのバージョンなど色々古かったのでアップグレードするためのプルリクエストを出してみました。以降はこの修正を取り込んだものとして話を進めます。

github.com

プラグインの動作を確認するには sbt runIDE を実行します。すると以下のようにサンプルプラグインがインストールされたIntelliJが起動します。

このサンプルプラグインはToolsメニューに「Action Basics Plugin: Pop Dialog Action」というメニューアイテムを追加しており、クリックすると以下のようなダイアログが表示されます。

プラグインの配布用アーカイブを作成するには sbt packageArtifactZip を実行します。するとtargetディレクトリにMyAwesomeFramework-0.0.1-SNAPSHOT.zipというファイルが作成されますので、プラグインマネージャで「Install Plugin from Disk」を選択し、このファイルを選択することでプラグインをインストールできます。

sbt-idea-pluginはこの他にも作成したプラグインをJetBrainsのプラグインレジストリにpublishするためのタスクなど様々なタスクを提供しています。

プロジェクトの構造ですが、src/main/resources/META-INFにplugin.xmlというファイルがあり、このファイルでプラグインの拡張ポイントに対して拡張を宣言し、指定したクラスを実装していくという感じのようです。

<idea-plugin>
    <id>me.and.co.my.awesome.framework</id>
    <name>My Awesome Framework</name>
    <version>0.0.1-SNAPSHOT</version>
    <vendor>Me and Co</vendor>

    <description>A new plugin for IntelliJ platform written in Scala and built with SBT</description>

    <idea-version since-build="203.0"/>

    <depends>com.intellij.modules.platform</depends>
    <depends>com.intellij.properties</depends>

    <resource-bundle>messages.SamplePluginBundle</resource-bundle>

    <actions>
        <action id="org.jetbrains.scala.samples.actions.PopupDialogAction"
                class="org.jetbrains.scala.samples.actions.PopupDialogAction">
            <add-to-group group-id="ToolsMenu" anchor="first"/>
        </action>
    </actions>

    <applicationListeners>
        <listener class="org.jetbrains.scala.samples.listeners.FileOpenedListener" topic="com.intellij.openapi.fileEditor.FileEditorManagerListener"/>
    </applicationListeners>

    <extensions defaultExtensionNs="com.intellij">
        <notificationGroup displayType="BALLOON" id="My Plugin Notification" />
        <toolWindow factoryClass="org.jetbrains.scala.samples.ui.MyToolWindowFactory" id="MyToolWindow" anchor="bottom"/>
        <completion.contributor implementationClass="org.jetbrains.scala.samples.completion.SimpleCompletionContributor" language="Properties"/>
    </extensions>

</idea-plugin>

ScalaでのIntelliJプラグインの開発については英語でもあまり情報がありませんが、IntelliJScalaプラグインが参考になります。

github.com

また、ZIOでIntelliJプラグインを開発しており、こちらも参考になるかもしれません。

github.com