MPS 2023.3 ヘルプ

使用箇所の検索

MPS では、どのモデルもノードで構成されています。ノードはさまざまな種類の関係を持つことができます。これらの関係はノード構造(たとえば、クラス上の「クラス子孫」関係)で表現されていてもいなくてもよい(たとえば、メソッド上の「オーバーライドメソッド」関係)。使用箇所の検索は与えられたノードに対していくつかの特別に関連したノードを表示するためのツールです。

MPS では、使用箇所の検索システムは完全にカスタマイズ可能です - 独自の実体、いわゆるファインダーを書くことができます。そしてそれは関連するノードを見つけるためのアルゴリズムを表します。すべての種類の関係に対応するファインダーがあります。

これが「使用箇所の検索」の結果のようなものです。

Findx1.png

使用箇所の検索サブシステムを使用する

ノード上で Alt + F7 を押すと(エディター内またはプロジェクトツリー内のどの場所でも)、MPS がどのような使用箇所を検索できるかを確認できます。

ノードを右クリックして使用箇所の検索を選択して使用箇所の検索ウィンドウを開くこともできます。

Image2018_45.png

使用箇所の検索ウィンドウは、キャレットのノードに適用されます。たとえば振る舞いメソッドの場合は、オーバーライドメソッドとオーバーライドメソッドを選択できます。

Image2018_11.png

ファインダー - 検索したい用法のカテゴリを選択してください

スコープ - これにより、具体的なモデル、モジュール、現在のプロジェクト、あらゆる場所で、使用箇所を検索する場所を選択できます。

表示オプション - 追加表示オプション

検索を調整したら、OK をクリックして実行します。結果は上記のように使用箇所の検索ツールに表示されます。

ファインダー

関連ノードを見つけるための独自のメカニズムを実装するには、Finders に慣れておく必要があります。すべての関係について、検索プロセスに関するすべての情報を提供する特定の Finder があります。

ファインダーをどこに保管しますか?

findUsages 言語をインポートすることで、どのモデルでもファインダを作成できます。ただし、MPS は findUsages 言語の側面からのみファインダーを収集します。そのため、MPS 使用箇所の検索サブシステムでファインダを使用したい場合は、それをあなたの言語の findUsages アスペクトに格納する必要があります。

ファインダー構造

名前

ファインダーの名前望む任意の名前を選ぶことができます。唯一の明白な制約は名前がモデルの範囲内でユニークでなければならないということです。

概念のため

Finder は、この概念のインスタンスであるノードとそのサブコンセプトへの適用性についてのみテストされます。

説明

この文字列は、ファインダリスト内のファインダを表します。かなり短くするべきです。

長い説明

説明文字列からファインダが正確に何をするのか明確でない場合は、長い説明を追加できます。これは、ファインダのリストにファインダのツールチップとして表示されます。

表示する

現在のノードに対してファインダが表示されるかどうかを決定します。例: あるクラスの先祖クラスを見つけるファインダは、このクラスが親を持たないときには見えないはずです。

適用可能です

for concept に合格したファインダーは、現在のノードへの適用性がテストされます。このメソッドが true を返す場合、ファインダーは使用可能なファインダーのリストに表示されます。それ以外の場合は表示されません。このメソッドのノード引数は、「for concept」で指定されたコンセプトまたはそのサブコンセプトのインスタンスであることが保証されます。

is visibleis applied の違いに注意してください。前者は表示のみを担当します。後者はファインダーとその呼び出し元間の「有効な呼び出し」契約を表します。これは、後で説明する findUsagesLanguage に execute ステートメントがあるため重要です。詳細については、次の実行セクションを参照してください。

検索

このメソッドは、指定されたスコープ内の指定されたノードの使用を見つける必要があります。見つかったノードの使用箇所ごとに、add result ステートメントを使用して登録します。使用箇所の検索ダイアログが視覚化できるノード以外のデータの場合は、生の結果を追加します。

検索されたノード

このメソッドは、ファインダーが検索したノードを返します。これらのノードは、ツールの検索されたノードのサブツリーに表示されます。

表示するノードごとに、addnode ステートメントを使用してノードを登録します。

カテゴリを取得

ツール内で見つかったノードをグループ化するためのバリアントがいくつかあります。そのうちの 1 つはカテゴリによってグループ化されてい、それを見つけたファインダーによってすべての見つけられたノードに与えられます。このメソッドは、このファインダによって見つけられた各ノードにカテゴリを与えます。

MPS 使用箇所の検索サブシステムは自動的に何をしますか?

  • 複数の呼び出し間および MPS 実行間の検索オプションを格納します

  • MPS 実行間の検索結果を格納します

  • 削除されたノードを自動的に処理します

  • 見つかったノードを使った視覚化と操作はすべて、ファインダーではなくサブシステムによって行われます。

特定のステートメント

実行する

execute ステートメントのおかげでファインダーは再利用できます。このステートメントの実行は、2 つのステップで構成されています。検索クエリの検証(conceptisApplicable の確認)、および find メソッドの実行です。それが isApplicableisShown の違いを見ることができるところです。ファインダは適用可能であるが表示されない場合に isApplicable を使用すると、execute 文でこのファインダを使用するときにエラーが発生する可能性があります。

非同期に実行する

さらに、ファインダーを非同期で実行するには、特別な OnEachNodeFoundByExpression を使用する必要があります。これは、見つかったノードごとに実行されるコールバックを使用した単純なファインダー呼び出しを表します。

Image2018_25.png

サンプル

jetbrains.mps.baseLanguage.findUsages でいくつかのより良い例を見ることができます

また、FinderDeclaration の概念(Ctrl + N、「FinderDeclaration」と入力して Enter キーを押す)に移動し、この概念のすべてのインスタンスを検索する(Alt + F7、インスタンスの確認、グローバルスコープの確認)と、すべてのファインダーを検索できます。