MPS 2020.3 ヘルプ

使用箇所の検索

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

In MPS, the Find Usages system is fully customizable - you can write your own entities, so-called finders, which represent algorithms for finding related nodes. For every type of relation there is a corresponding finder.

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

Findx1

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

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

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

Image2018 45

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

Image2018 11

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

スコープ - this lets you select where you want to search for usages - in concrete model, module, current project or everywhere.

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

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

ファインダー

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

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

Finders can be created in any model by importing findUsages language. However, MPS collects finders only from findUsages language aspects. So, if you want your finder to be used by the MPS Find Usages subsystem, it must be stored in the findUsages aspect of your language.

ファインダー構造

名前

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

概念のため

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

説明

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

長い説明

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

表示する

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

適用可能です

Finders that have passed for concept are tested for applicability to the current node. If this method returns true, the finder is shown in the list of available finders; otherwise it is not shown. The node argument of this method is guaranteed to be an instance of the concept specified in "for concept" or its subconcepts.
Please note the difference between is visible and is applicable. The first one is responsible only for viewing. The second one represents a "valid call" contract between the finder and its caller. This is important because we have an execute statement in findUsagesLanguage, which will be described later. See execute section below for details.

検索

This method should find given node usages in a given scope. For each found usage of a node, use the add result statement to register it. For data other than nodes that the Find Usages dialog is able to visualize use add raw result.

検索されたノード

This method returns nodes for which the finder searched. These nodes are shown in searched nodes subtree in the tool.
For each node to display, use the add node statement to register it.

カテゴリを取得

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

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

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

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

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

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

特定のステートメント

実行する

Finders can be reused thanks to the execute statement. The execution of this statement consists of 2 steps: validating the search query (checking for concept and isApplicable ), and executing the find method. That's where you can see the difference between isApplicable and isShown. If you use isApplicable for cases when the finder should be applicable, but not shown, you can get an error when using this finder in the execute statement.

非同期に実行する

Furthermore, in order to execute a finder asynchronously one needs to use a special OnEachNodeFoundByExpression, which represents a simple finder invocation with a callback which is executed for each found node.

Image2018 25

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

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