IDEA 202 0.1に基づくJAVAコード提示プラグインの開発例


以前はプロジェクトグループに独自のコード仕様があり、通常の開発仕様を制約するため、209.1.3バージョンに基づいてコード提示プラグインを開発しました。しかし、IDEAを200.1バージョンに切り替えたところ、狂ったようなエラーが発生しました。しかし、インターネット上のIDEAプラグインの開発に関する記事はまだ多くなく、自分で解決するしかないです。そこで公式のSDK文書に基づいて、Gradeleを使ってプロジェクトを再構築し、コードを引いてきました。以下、200.1バージョンに従って、コード異常のヒントプラグインを簡単に開発します。踏みやすいところを教えてください。
1、まずIDEAプラグインに基づいて公式文書を開発し、Graadleでプロジェクトを新規作成する。file -> new -> Project...を選択すると、ポップアップウィンドウの左側にGradleを選択し、次のインターフェースがイジェクトされます。

デフォルトのチェックはJavaを選択しました。これはIDEAプラグインプロジェクトであることを示すために追加のチェックが必要です。また、IntelliJ Platform Pluginにチェックを付ける必要があります。なぜこの項目をチェックしますか?公式サイトではこのように紹介しています。
To include support for the Ktling langage in the plugin、check the Kotlin/JVM box(circled in green below.)This option can be selected with or without the Java lagge.
つまり、私たちが開発したプラグインがJAVAコードをサポートする必要があるなら、この項目をチェックします。すべてのプラグインがJAVAコードに基づいてチェックされている場合、このオプションをチェックする必要があります。
チェックが終わったら、nextをクリックして、その後の情報は自分の実際の必要に応じて記入すればいいです。そしてfinishをクリックして、黙々としてGrade構築プロジェクトを待っています。できれば梯子をかけて、カバンをダウンロードするなどはまだ遅いです。
構築されたプロジェクトのディレクトリ構造と各ディレクトリの役割は、公式文書を直接見ることができます。
https://www.jetbrains.org/intellij/sdk/docs/tutorials/build_system/prerequisites.
2、プロジェクトを構築し終わったら、ブリーチ.gradleの部分的な配置を修正する必要があります。
構築後、デフォルトではKotlin/JVMファイルが開かれます。内容は以下の通りです。

plugins {
  id 'java'
  id 'org.jetbrains.intellij' version '0.4.19'
  id 'org.jetbrains.kotlin.jvm' version '1.3.71'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
  mavenCentral()
}

dependencies {
  implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
  testCompile group: 'junit', name: 'junit', version: '4.12'
}

// See https://github.com/JetBrains/gradle-intellij-plugin/
intellij {
  version '2020.1'
}
compileKotlin {
  kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
  kotlinOptions.jvmTarget = "1.8"
}
patchPluginXml {
  changeNotes """
   Add change notes here.<br>
   <em>most HTML tags may be used</em>"""
}
ここに穴があります。構築後、以前のコードをコピーして、一部の種類が見つからなかったということです。つまり、対応のjarパッケージを導入していません。その後、公式サイトの例でbuild.gradleファイルは私のbuildファイルとちょっと違っています。具体的には次のようなところがあります。

// See https://github.com/JetBrains/gradle-intellij-plugin/
intellij {
 version = '2020.1'
 plugins = ['java']
 sameSinceUntilBuild = true
}
これはintellijの中で、build.gradleのオプションが多くなりました。もしこのオプションがないと、plugins = ['java']などのJAVAコードのサポートがないjarカバンが不足してしまい、いくつかの種類や方法が使えなくなります。したがって、JAVAコードのサポートであれば、java-api.jarファイルにbuild.gradle行を追加する必要があります。
3、plugin.xmlファイルの変更plugins = ['java']ファイルは、このプラグインの役割についてのいくつかの説明であり、また、いくつかの依存関係のリレーションであり、構築済みのplugin.xmlファイルの内容は以下の通りである。

<idea-plugin>
  <id>org.example.new-plugin-for-java</id>
  <name>Plugin display name here</name>
  <vendor email="[email protected]" url="http://www.yourcompany.com">YourCompany</vendor>

  <description><![CDATA[
  Enter short description for your plugin here.<br>
  <em>most HTML tags may be used</em>
  ]]></description>

  <!-- please see https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
     on how to target different products -->
  <depends>com.intellij.java</depends>

  <extensions defaultExtensionNs="com.intellij">
    <!-- Add your extensions here -->
    <localInspection
        language="JAVA"
        displayName="test displayer"
        groupPath="Java"
        groupBundle="messages.InspectionsBundle"
        groupKey="group.names.probable.bugs"
        enabledByDefault="true"
        level="ERROR"
        implementationClass="com.nw.TestInsepction"/>
  </extensions>

  <actions>
    <!-- Add your actions here -->
  </actions>
</idea-plugin>
ここに穴があります。IDEA 209.2以前のバージョンなら、このファイルは他のものを使わず、直接にネット上のプラグイン開発教程を参考にして、コードを書いたら正常に運行できます。しかし、IDEA 209.2のバージョンであれば、運行時には狂ったようにエラーが発生します。最初はなぜか分かりませんでした。また公式の例を調べてみます。みんなで違いを探してみました。結果、公式サイトの例は以下の配置情報とデフォルトで構築されたものとは違います。

 <!-- Evaluates java PSI -->
 <depends>com.intellij.modules.java</depends>
もとはここの依存はまだ変えなければならなくて、上のように変えて、どうしてこの依存に変えますか?この時、私はやっとデフォルトの構築のplugin.xmlの中を発見して、dependsの上で1段の注釈があって、大体の意味は、注釈の中のウェブサイトに行ってどのように製品によって対応するdependsを選択しますか?中にはたくさん紹介されていますが、様々なdependsは何ですか?ホームページの中にこんな話があります。
(2)The Java langage functionity was extraccted as a plugin in version 209.2 of the IntelliJ Platform.This refactoring separated the Java implement the other,non-lagge portageJava dependencies are expresed differently in plugin.xml depending on the version of the IntelliJ Platform being tageted:
Syntax required for releass pror to 209.2、allowable in all releases:
  • plugin.xml include plugin.xml
  • Syntax for 209.2 and later releases:
  • com.intellij.modules.java allowable alternative include plugin.xml
  • com.intellij.java required to include build.gradle
  • 大体の意味は、209.2バージョンからJavaコードに関するサポートがプラグインになり、デフォルトで構築されたパッケージには含まれていないので、209.2バージョンからintellij.plugins 'java'plugin.xmlは関連する構成に変更する必要があります。これもなぜ私たちの第二のステップがbuild.gradleに変更されたのですか?
    4、ネット上の例を参考にして、最初のコード提示プラグインを作成する。
    新しいjavaクラスを作成します。これはテスト用のヒントプラグインです。すべての変数の上に「this is error」と表示されます。
    
    package com;
    
    import com.intellij.codeInspection.AbstractBaseJavaLocalInspectionTool;
    import com.intellij.codeInspection.ProblemsHolder;
    import com.intellij.psi.JavaElementVisitor;
    import com.intellij.psi.PsiElementVisitor;
    import com.intellij.psi.PsiField;
    import org.jetbrains.annotations.NotNull;
    
    /**
     *             ,         "this is an error"
     * @author LiuYeFeng
     * @date 2020/5/5
     * @e-mail [email protected]
     */
    public class TestInspectionTool extends AbstractBaseJavaLocalInspectionTool {
    
      @NotNull
      @Override
      public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) {
        //     java      ,          ,      
        return new JavaElementVisitor() {
          @Override
          public void visitField(PsiField field) {
            super.visitField(field);
            //     ,                 ,   "this is an error"
         		//       ,                 
            holder.registerProblem(field, "this is an error");
          }
        };
      }
    }
    次に、build.gradleの中のplugin.xmlに、上記で作成されたプラグインを追加する。
    
     <extensions defaultExtensionNs="com.intellij">
        <!-- Add your extensions here -->
        <localInspection
            language="JAVA"
            displayName="Test field error"
            groupPath="Java"
            groupBundle="messages.InspectionsBundle"
            groupKey="group.names.probable.bugs"
            enabledByDefault="true"
            level="ERROR"
            implementationClass="com.TestInspectionTool"/>
      </extensions>
    上記の構成は大体コード提示コンポーネントを登録しています。中のパラメータはIDEAのどのカテゴリーにヒントが配置されていますか?また、提示されたレベルです。例はERRORレベルで表示できる簡単な点です。
    5、コードヒントプラグインの効果を見始めます。
    右上のdebugをクリックしてコンパイルの実行を待ちます。運転後は新しいIDEAが表示されます。このIDEAは私達が作成したプラグインをロードします。また、私達が元に作成したプラグインIDEAでログ出力などが見られます。断点もできます。新しいIDEAはブラウザであり、ウェブページでバックエンドインターフェースを調整しています。
    私たちが作成したプラグインは変数を書き換えたので、321であればエラーが発生します。extensionsにヒントを与えます。効果は以下の通りです。

    ここで、完了したコード異常ヒントプラグインが簡単に完成しました。
    6、コードヒントプラグインはまだできます。
    私達が作成したこのプラグインは、実は比較的簡単で、論理分析をしていません。私たちは実際の必要に応じて、いくつかのプロジェクトグループの固有の機能を作成することができます。例えば、特別なクラスから継承されたすべてのフィールドには、コメントが必要です。Service内の方法では、異常が戻る前にログを記録しなければなりません。または他の操作などは全部できます。また、フィールドにコメントがないなどのクイック修復もできます。
    これはIDEA構文ツリーに関する理解が必要であり、IDEAはコードをPsi構文ツリーに抽象化し、異なるコード機能に応じて異なるthis is an errorに分割し、例えば注釈はPsiElement、フィールドはPsiComment、方法はPsiField、クラスはPsiMethodである。IDEA自体もかなり多くのツールクラスを提供しており、例えばPsiClassはクラスまたは方法の参照点を見つけることができ、ReferencesSearchはコード文法ツリーの上のいくつかの動作を処理してもよい。例えば変数の所在を取得する方法、PsiTreeUtilはコードを解析することができるなど、ControlFlowUtilPsiClassUtilといった様々な関連性のあるツール類は様々な便利な操作を提供することができる。これはプラグイン開発者自身が模索する必要があります。問題があったらIDEA公式クイズフォーラムで探してみてもいいです。他の人が解決してくれるかもしれません。
    追加:
    IntelliJ Platform SDK公式サイトPsiFieldUtilIntelliJプラグイン開発交流コミュニティhttps://www.jetbrains.org/intellij/sdk/docs/intro/welcome.htmlここではIDEA 200.1に基づくJAVAコード提示プラグインの開発例についての記事を紹介します。IDEA 200.1 JAVAコードのヒントプラグインの内容は以前の文章を検索してください。または下記の関連記事を引き続きご覧ください。これからもよろしくお願いします。