MPS 2019.2ヘルプ

使用箇所の検索

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

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

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

Findx1

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

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

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

Image2018 45

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

Image2018 11

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

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

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

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

ファインダー

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

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

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

ファインダー構造

名前

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

概念のため

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

説明

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

長い説明

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

表示する

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

適用可能です

概念に合格したファインダは、現在のノードへの適用性についてテストされます。このメソッドがtrueを返すと、そのファインダは利用可能なファインダのリストに表示されます。それ以外の場合は表示されません。このメソッドのノード引数は、"for concept"またはその下位概念で指定された概念のインスタンスであることが保証されています。
違いは目に見える当てはまる ことに注意してください。最初のものは見ることだけに責任があります。2番目のものはファインダーとその呼び出し元の間の「有効な電話」契約を表します。後で説明するfindUsagesLanguageにexecute文があるため、これは重要です。詳細は下記の実行セクションを参照してください。

検索

このメソッドは与えられたスコープ内の与えられたノード使用箇所を見つけなければなりません。見つかった使用箇所ごとに、add resultステートメントを使用して登録します。

検索されたノード

このメソッドは検索者が検索したノードを返します。これらのノードは、ツールの検索済みノードサブツリーに表示されます。
表示する各ノードに対して、add node文を使用して登録します。

カテゴリを取得

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

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

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

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

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

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

特定のステートメント

実行する

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

非同期に実行する

さらに、ファインダを非同期的に実行するためには、発見された各ノードに対して実行されるコールバックを伴う単純なファインダ呼び出しを表す特別なOnEachNodeFoundByExpressionを使用する必要があります。

Image2018 25

サンプル

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

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

最終更新日: 2019年8月30日