IntelliJ IDEAプラグイン開発。 パート3

プロジェクトとVFSについての少しの理論。 前の部分はこちらです。


プロジェクト構造



IntelliJ IDEAでは、プロジェクトはすべてのソースコード、ライブラリ、ビルドスクリプトを単一の組織単位にカプセル化します。 IDEAのすべてのアクションは、プロジェクトのコンテキストで実行されます。 プロジェクトには、モジュールとライブラリのコレクションが含まれる場合があります。 論理的または機能的な要件に応じて、単一モジュールまたは複数モジュールのプロジェクトを作成できます。



モジュール


モジュールは、独立して起動、テスト、およびデバッグできる機能の独立したエンティティです。

モジュールには、ソースコード、ビルドスクリプト、単体テストなどが含まれます。 プロジェクトの各モジュールは、特定のSDKを使用するか、プロジェクトSDKを継承できます。 モジュールは、プロジェクト内の他のモジュールに依存する場合があります。



図書館


ライブラリは、モジュールが依存するアーカイブ(JARファイルなど)のコンパイル済みコードです。

IntelliJ IDEA Community Editionは、3種類のライブラリをサポートしています。



SDK


各プロジェクトは、ソフトウェア開発キット(SDK)を使用します。 Javaプロジェクトには、JDK(Java Development Kit)と呼ばれる特別なタイプのSDKがあります。 SDKは、プロジェクトのビルドに使用されるAPIを決定します。 マルチモジュールプロジェクトでは、デフォルトでSDKはすべてのモジュールに継承されますが、各モジュールに個別のSDKを定義することもできます。



ファセット


ファセットは、モジュールのコンテンツと対話する方法を指示するモジュールに関連付けられた機能です。 モジュールには複数のファセットを含めることができます。

IntelliJ IDEA Ultimate Editionのプロジェクト設定には、ファセットの割り当てがAPIからのみ使用可能なCommunity Editionとは異なり、ファセットを割り当てることができる設定があります。



プロジェクト構造


プラグイン開発者の観点から見ると、プロジェクト構造は次の図に示すようになります。

プロジェクトには1つ以上のモジュールが含まれます。 各モジュールにはプラグインのソースコードが含まれ、SDKおよびライブラリに関連するエンティティの順序付けられたセットを呼び出します。 モジュールには、ファセットキットが含まれている場合があります。





プロジェクトファイル、モジュール、ライブラリを操作する


IntelliJ IDEAは、構成データをXMLファイルに保存します。 これらのファイルのリストは、プロジェクトの形式によって異なります。

ファイルベースのプロジェクト形式の場合、情報はプロジェクトファイル自体「plugin-name.ipr」に保存されます。 モジュールに関する情報は、モジュールごとに作成される「module-name.iml」ファイルに保存されます。

ディレクトリベースのプロジェクト形式の場合、プロジェクト設定は.ideaサブディレクトリ内のいくつかのXMLファイルに保存されます。 各ファイルは、独自の設定セットを担当し、対応する名前を持っています:projectCodeStyle.xml、encodings.xml、vcs.xmlなど。 モジュールデータは* .imlファイルに保存されます。

プロジェクトとプロジェクトファイルを操作するために、いくつかのインターフェイスとクラスがあります。



IntelliJ IDEAは、モジュールを操作するために次のクラスを提供します。



ライブラリのリストを取得するには、モジュールのすべてのエンティティをリストし、LibraryOrderEntryインターフェイスのインスタンスを選択します。 ライブラリに含まれるクラスを取得するには、Library.ModifiableModel.getUrlsメソッドを使用できます。

ファセットを操作するために、DefaultFacetsProviderクラスとFacetクラスがあります。



IntelliJ IDEA仮想ファイルシステム


仮想ファイルシステム(VFS)は、ファイルを操作するためのほとんどの機能をカプセル化するIntelliJ IDEAコンポーネントです。 次の目的に役立ちます。



最後の2つの機能を提供するために、VFSはハードドライブ上のコンテンツのスナップショット(スナップショット)を作成します。 VFSプログラミングインターフェイスを介して少なくとも1回要求され、ディスクで発生した変更に従って非同期に更新されたファイルのみがスナップショットに含まれます。



スナップショットはアプリケーションレベルで機能するため、さまざまなプロジェクトからの複数のリンクがあっても、データは単一のコピーに保存されます。

すべてのアクセス操作はスナップショットを通過し、要求された情報が利用できない場合、ディスクからロードされます。 ディレクトリのファイルの内容とファイルのリストは、特定の情報が要求された場合にのみ保存され、他の場合ではメタ情報のみが保存されます(名前、サイズなど)。



すべての記録操作は同期的です。 データはすぐにディスクに書き込まれます。

IntelliJ IDEAは非同期操作を実行して、起動時にコンテンツを完全に更新します。 また、デフォルトでは、別のアプリケーションから切り替えるときに更新が行われますが、この動作は「設定| ファイルを同期します。」

同期操作はタイムスタンプに基づいています;変更日が変更されていない場合、IDEAはファイルの内容を更新しません。 IntelliJ IDEAは、可能な限り、オペレーティングシステムに組み込まれているファイルオブザーバー(inotify、epollなど)を使用します。



仮想ファイルシステムイベント


更新操作の結果として、またはユーザーのアクションによって仮想ファイルシステムで発生するすべての変更は、仮想ファイルシステムイベントと呼ばれます。

VFSイベントを監視する最も効率的な方法は、BulkFileListenerインターフェイスを実装し、VirtualFileManager.VFS_CHANGESをサブスクライブすることです。 このAPIは、更新操作中に発生したすべての変更のリストを提供し、バッチ処理を可能にします。 別の方法は、VirtualFileListenerインターフェースを実装し、VirtualFileManager.addFileListener()を使用して登録することです。 このオプションを使用すると、変更を1つずつ処理できます。



ハンドラーはアプリケーションレベルで動作することを忘れないでください。したがって、ユーザーが開いているすべてのプロジェクトからイベントを受け取ります。 したがって、まず、アクティブなプロジェクトに関連するイベントのみを除外する価値があります。

更新中、スナップショットにアップロードされたファイルに対してのみイベントが生成されます。 そのため、VirtualFile.findChild()を介して単一のファイルがアップロードされた場合、そのファイルで発生した変更は監視されますが、ディレクトリ内の近隣では監視されません。



次の部分では、字句解析、解析、PSI、スタブインデックス。



サイクルのすべての記事: 1、2、3、4、5、6、7



All Articles