使用箇所の検索
MPSでは、どのモデルもノードで構成されています。ノードはさまざまな種類の関係を持つことができます。これらの関係はノード構造(たとえば、クラス上の「クラス子孫」関係)で表現されていてもいなくてもよい(たとえば、メソッド上の「オーバーライドメソッド」関係)。使用箇所の検索は与えられたノードに対していくつかの特別に関連したノードを表示するためのツールです。
MPSでは、使用箇所の検索システムは完全にカスタマイズ可能です - 独自の実体、いわゆるファインダーを書くことができます。そしてそれは関連するノードを見つけるためのアルゴリズムを表します。すべての種類の関係に対応するファインダーがあります。
これが「使用箇所の検索」の結果のようなものです。
使用箇所の検索サブシステムを使用する
ノード上でAlt + F7を押すと(エディター内またはプロジェクトツリー内のどの場所でも)、MPSがどのような使用箇所を検索できるかを確認できます。
ノードを右クリックして使用箇所の検索を選択して使用箇所の検索ウィンドウを開くこともできます。
使用状況の検索ウィンドウは、キャレットのノードに適用されます。たとえば振る舞いメソッドの場合は、オーバーライドメソッドとオーバーライドメソッドを選択できます。
ファインダー - 検索したい用法のカテゴリーを選択してください
スコープ - これにより、使用箇所を検索する場所 (具体的なモデル、モジュール、現在のプロジェクト、またはあらゆる場所)を選択できます。
表示オプション - 追加表示オプション
検索を調整したら、OKをクリックして実行します。結果は上記のように使用箇所の検索ツールに表示されます。
ファインダー
関連ノードを見つけるための独自のメカニズムを実装するには、Findersに慣れておく必要があります。すべての関係について、検索プロセスに関するすべての情報を提供する特定のFinderがあります。
ファインダーをどこに保管しますか?
findUsages言語をインポートすることで、どのモデルでもファインダを作成できます。ただし、MPSはfindUsages言語の側面からのみファインダーを収集します。そのため、MPS 使用箇所の検索サブシステムでファインダを使用したい場合は、それをあなたの言語のfindUsagesアスペクトに格納する必要があります。
ファインダー構造
名前 | ファインダーの名前望む任意の名前を選ぶことができます。唯一の明白な制約は名前がモデルの範囲内でユニークでなければならないということです。 |
---|---|
概念のため | Finderは、この概念のインスタンスであるノードとそのサブコンセプトへの適用性についてのみテストされます。 |
説明 | この文字列は、ファインダリスト内のファインダを表します。かなり短くするべきです。 |
長い説明 | 説明文字列からファインダが正確に何をするのか明確でない場合は、長い説明を追加できます。これは、ファインダのリストにファインダのツールチップとして表示されます。 |
表示する | 現在のノードに対してファインダが表示されるかどうかを決定します。例:あるクラスの先祖クラスを見つけるファインダは、このクラスが親を持たないときには見えないはずです。 |
適用可能です | 概念に合格したファインダは、現在のノードへの適用性についてテストされます。このメソッドがtrueを返すと、そのファインダは利用可能なファインダのリストに表示されます。それ以外の場合は表示されません。このメソッドのノード引数は、"for concept"またはその下位概念で指定された概念のインスタンスであることが保証されています。 |
検索 | このメソッドは与えられたスコープ内の与えられたノード使用箇所を見つけなければなりません。見つかった使用箇所ごとに、add resultステートメントを使用して登録します。 |
検索されたノード | このメソッドは検索者が検索したノードを返します。これらのノードは、ツールの検索済みノードサブツリーに表示されます。 |
カテゴリを取得 | ツール内で見つかったノードをグループ化するためのバリアントがいくつかあります。そのうちの1つはカテゴリによってグループ化されてい、それを見つけたファインダーによってすべての見つけられたノードに与えられます。このメソッドは、このファインダによって見つけられた各ノードにカテゴリを与えます。 |
MPS 使用箇所の検索サブシステムは自動的に何をしますか?
複数の呼び出し間およびMPS実行間の検索オプションを格納する
MPS実行間の検索結果を格納する
削除されたノードを自動的に処理する
見つかったノードを使った視覚化と操作はすべて、ファインダーではなくサブシステムによって行われます。
特定のステートメント
実行する
executeステートメントのおかげでファインダーは再利用できます。このステートメントの実行は、2つのステップで構成されています。検索クエリの検証( conceptとisApplicableの確認)、およびfindメソッドの実行です。それがisApplicableとisShownの違いを見ることができるところです。ファインダは適用可能であるが表示されない場合にisApplicableを使用すると、execute文でこのファインダを使用するときにエラーが発生する可能性があります。
非同期に実行する
さらに、ファインダを非同期的に実行するためには、発見された各ノードに対して実行されるコールバックを伴う単純なファインダ呼び出しを表す特別なOnEachNodeFoundByExpressionを使用する必要があります。
サンプル
jetbrains.mps.baseLanguage.findUsagesでいくつかのより良い例を見ることができます
また、FinderDeclarationの概念(Ctrl + N、「FinderDeclaration」と入力してEnterキーを押す)に移動し、この概念のすべてのインスタンスを検索する(Alt + F7、インスタンスの確認、グローバルスコープの確認)と、すべてのファインダーを検索できます。
関連ページ:

エクステンションサポート
拡張機能は、標準的な言語の側面やプラグインのメカニズムではカバーされていない、ソリューションや言語の特定の側面を拡張する可能性を提供します。通常、ディストリビューションモデル(MPSプラグイン、IntelliJ IDEAプラグイン、またはスタンドアロンIDE)に応じて、言語の動作をわずかに変更する必...

実行設定
導入、設定、永続的なプロパティー、構成を互いに統合する、テンプレート・パラメーター、コマンド、実行コマンドセクション、ProcessBuilder式、デバッガ統合、構成、執行者、デバッガ統合、生産者、便利な例、パーソンエディター、実行コマンド、タスクの前にgccでコンパイルする、Javaエグゼキュー...