Help us understand the problem. What is going on with this article?

IntellijJの言語プラグインを作る方法

Kotlin開発で使うIDEと言えばIntelliJ。他の選択肢がそもそもありません(AndroidStudioもIntelliJ)。幸いなことに無料のCommunity Editionも存在します。その無料バージョンがなければ、Kotlinがそれほど使われてないでしょう。

他のIDEと同じく、IntelliJもプラグインで拡張できるIDEです。IntelliJのプラグインは誰でも作ることができます。それでは、今回はIntelliJの言語プラグインを作る方法を紹介したいと思います。

IntelliJの言語プラグイン

そもそもIntelliJの言語プラグインとはなんですか?

あるプログラミング言語を全般的に対応するとは簡単に言えますが、具体的に下記のいずれかの機能を追加することによってIntelliJの言語プラグインになります:

  • ファイルのパーサー
  • ファイルのシンタックスハイライター
  • オートコンプリーション機能
  • IntelliJ IDEならではの追加情報提供
    • 行数の隣に何かを出す(Line Marker)
    • アノテーション
    • ...
  • フォーマッター/リンター
  • ...

例えば、.jsonファイルのシンタックスハイライトするプラグインでも言語プラグインといいます。

対応できる機能はDocumentationで確認できます。

言語プラグインを作る

さあ、プラグインはどうやって作れるんでしょうか?

開発するため、IntelliJが色々なツールを提供しています。gradleプラグインを追加するとそのツールは使えます。

plugins {
    id 'org.jetbrains.intellij' version '0.4.15'
}
intellij {
    version '2019.3'
}

上記の記述だとIntelliJ 2019.3向けのプラグインになります。pluginsブロックで指定するバージョンはgradle plugin自体のバージョンであり、最新のものであればより良いでしょう。

機能の定義

プラグインの基本情報とプラグインは何ができるかを定義する必要があります。今回は前の記事に紹介したテンプレートエンジンKoreanderのシンタックスハイライターを作ります。

<idea-plugin>
    <id>de.cvguy.kotlin.koreander.intellij</id>
    <version>0.10</version>
    <name>Koreander Syntax Highlighter</name>
    <vendor email="lukas@cvguy.de" url="https://github.com/lukasjapan/koreander">Koreander</vendor>

    <description><![CDATA[
        Language Support for the Koreander Template Engine.

        Currently only Syntax highlighting is supported.
    ]]></description>

    <depends>org.jetbrains.kotlin</depends>

    <extensions defaultExtensionNs="com.intellij">
        <fileType implementationClass="de.cvguy.kotlin.koreander.intellij.KoreanderFileType" name="Koreander" language="Koreander" extensions="kor" />
        <lang.syntaxHighlighterFactory language="Koreander" implementationClass="de.cvguy.kotlin.koreander.intellij.KoreanderSyntaxHighlighterFactory"/>
    </extensions>
</idea-plugin>

見るだけで大体わかると思います。基本情報に関しては説明することは特にないと思います。プラグインの機能は<extensions>内で定義し、実装はどこにあるかはimplementationClassのattributeで書きます。具体的に説明すると<fileType>でプラグインが動作するファイル拡張子を定義し、<lang.syntaxHighligherFactor>でシンタックスハイライターの機能を定義します。どっちにもlanguage="Koreander"のattributeがあるので紐付けができています。

IntelliJプラグイン開発の約束としてはこのファイルをresources/META-INF/plugin.xmlに置きます。

他の機能を提供したい場合こちらを参照してください。

実装

implementationClassのattributeで定義したクラスを実装しなければなりません。それぞれの機能に応じて、特定なインターフェースを実装する必要があります。

例えば<fileType>ではcom.intellij.openapi.fileTypes.FileTypeのインターフェースを実装する必要があります。gradleが用意したIntelliJのSDKにも色々なヘルパークラスがあり、LanguageFileのクラスを使いました。

class KoreanderLanguage : Language("Koreander") {
    companion object {
        val INSTANCE = KoreanderLanguage()
    }
}

class KoreanderFileType : LanguageFileType(KoreanderLanguage.INSTANCE) {
    override fun getIcon() = IconLoader.getIcon("/koreander32.png");
    override fun getName() = "Koreander"
    override fun getDefaultExtension() = "kor"
    override fun getDescription() = "Koreander template"
}

このコードを見るとアイコンの画像も定義ができ、ファイル一覧などで使われています。

例)

image.png

シンタックスハイライター機能はcom.intellij.openapi.fileTypes.SyntaxHighlighterFactoryというabstract classの継承のよって実装できます。ここはFactory Patternでできているようです。機能によって、インターフェースの設計思想は違います。具体的な実装を紹介すると結構長くなるので省略します。

ですが、全般的な考えた方は前者の例と一緒です。Documentationを読んで、提供されているインターフェースを実装することによってIDEの拡張機能を提供します。

興味がある方はKoreanderプラグインのソースコードをGitHubで参照してください。

まとめ

抽象的で考えるとIntelliJのプラグインの開発は簡単です。

  • gradleでヘルパーをインストール
  • 提供したい機能をplugins.xmlで定義
  • 該当インターフェースを実装

それだけです。

しかし、インターフェースはやはり機能によって複雑になります。Documentationを慎重に読んで、実装するしかないです。でもそれがOSS開発の一つの楽しみであると思います。

dr-ubie
病気予測AIによる病院向け問診サービス、及び to C 向け病気予測サービスを運営するスタートアップ
https://ubie.life/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした