MPS 2020.1ヘルプ

変換メニュー言語

概要

変換メニュー言語は、サブメニューの階層構造とエディター内のさまざまな場所に表示されるアクションを記述する変換メニューを定義するために使用されます。現在、変換メニューが表示される場所はいくつかあります。サイド変換メニュー代替メニューコンテキストアシスタント、およびコンテキストアクションツールです変換メニュー言語の拡張で文書化されているように、言語デザイナーやプラグインの作者は追加の場所を定義し、各場所の必須またはオプションの機能 (アイコンやツールチップなど)を指定することができます。

メニューを定義する

変換メニューは、さまざまな場所に表示されるUIアクションを定義します。設計時に、メニューはセクションのリストとして指定され、各セクションには特定の場所のセットのメニューパーツのリストが含まれます。実行時には、メニュー部分と場所を使用してメニューの内容(メニュー項目)が生成されます。

メニュー定義には、デフォルト名前付きの 2つの種類があります。メニュー定義はメニューの貢献によっても拡張できます。

transformx1

デフォルトメニュー

各概念には、デフォルトの変換メニューが関連付けられています。言語設計者が明示的に指定していない場合は、最も近いスーパーコンセプト用に定義された変換メニューが想定されます。どのスーパーコンセプトにも指定されていない場合は、BaseConceptで定義されているものが使用されます。これには、その位置に適した代替アクションが含まれます(代替アクションのセクションを参照)。

デフォルトメニューは、言語設計者が表示するメニューを指定していない場合に使用されます。

tml1

名前付きメニュー

名前付きメニューは、概念の追加メニューです。デフォルトメニューのようにそれはまた適当な概念を指定しそしてセクションのリストを含んでいる。その用語が示すように、名前付きメニューは明示的に設定された名前を持ちます。名前付きメニューは、セルの変換メニューとして設定すること、またはメニューメニューを含めるを介して別のメニューに含めることを意味します。

tml2

名前付きメニューをエディターセルに添付する:

image2016 5 30 17 9 40

注:デフォルトの変換メニューは、メニューと同じ方法で個々のセルに添付することもできます。

メニューコントリビューションは、追加のメニューパーツを追加することによって、特定のメニューを拡張します。これは、拡張言語が拡張言語で定義されたメニューにエントリを追加する必要があるときに特に便利です。貢献は実際には貢献されているメニューのある言語以外の言語でしか定義できません。実行時にメニューが要求されると、元の定義とすべてのコントリビューションがマージされ、結合された定義を使用してメニューが作成されます。貢献についてのいくつかの重要なメモ:
  1. 個々の定義がマージされる順序は、現在のところ不明です。

  2. 寄付は、寄付するメニューからメニュー部分を削除することはできません。

  3. 概念の暗黙のデフォルトメニューへのコントリビュートを定義することは可能です。

tml3

セクションの場所

メニュー内のセクションの場所を指定することで、UIのどの部分にアクションを挿入するかを指定します。

Locations1

以下の標準メニューパーツが利用可能です。

  • action - 実行するアクション、それに対応するメニューテキスト、および適用範囲を指定する単純なメニュー項目。

  • group - a collection of menu items. Beyond these items a group may define one or more variables that are then shared by all actions within the group to avoid repetitive computation. Additionally, a group holds a condition that indicates when the actions in the group should be made available to the user.

  • include - 特定のデフォルトメニューまたは名前付きメニューを(存在する場合はその貢献とともに)含めます。実行時に包含サイクルが検出され、エラーメッセージが表示されます。

  • 代替メニューを含める - このメニューの一部として使用するデフォルトまたは名前付きの代替メニューを含めます。

  • parametrized - 複数の値でパラメータ化されているアクション。

  • サブメニュー - さらなる部分を含むサブメニュー。

  • superconcepts menu - デフォルトでは含まれないため、該当する概念のスーパーコンセプトのデフォルトメニューが含まれます。

  • 代用メニューの折り返し - 提供されたハンドラーを使用して指定された概念を折り返します。

言語 jetbrains.mps.lang.editor.menus.extras には、変換メニューからさまざまなアクションに似たエンティティを含めるためのアダプタが含まれています。

  • インテンション - インテンション( jetbrains.mps.lang.intentionsから BaseIntentionDeclaration のサブコンセプト)をラップします。

  • リファクタリング - jetbrains.mps.lang.refactoringからリファクタリング Refactoring をラップします。

  • plugin Action –プラグインアクション ActionDeclarationjetbrains.mps.lang.pluginからラップします。

Oprions5

サイド変換

テキストエディターでコードを編集するときは、左から右のいずれかに入力できます。

1_ press + 1+_ press 2 1+2_

または右から左へ

_1 press 2 2_1 press + 2+_1

この振る舞いをエミュレートするために、MPSには左右の変換という側面の変換アクションがあります。セルの左または右部分を入力したときに利用できるようになるアクションを作成できます。例:MPSでは次のことができます。

1_ press + (red cell with + inside appears) 1+_ press 2 (red cell disappear) 1+2_

また

_1 press + (red cell with + inside appears) +_1 press 2 (red cell disappear) 2_+1

最初のケースは右変換と呼ばれます。2番目のケースは左変換と呼ばれます。

セクションのサイド変換位置を選択して、変換メニューでサイド変換を定義します。

SideTransforms100

言語は、言語設計者が特定のセルの補完メニューにサイド変換メニューの項目を含めることも可能にします。これを行うには、補完セクションを含む変換メニューを目的のセルに添付します。その補完セクションはインクルードメニュー部分を保持し、サイド変換の位置を指定します。サイド変換メニューの項目が完成に含まれます。

cellmenu1

含まれるメニューの場所は、インテンションの「場所の指定」を使用して指定できます。

代替メニュー

代用アクションは、モデルの一部に対してユーザーが呼び出した変換を定義し、その間に1つのノードが別のノードに置き換えられます。これらの代替アクションのビジュアルUI要素(補完メニューなど)への実際のマッピングは、変換メニューを介して行われます(上記のセクションを参照)。

通常、代替アクションはエディターでCtrl + Spaceを押すことによってトリガーされます。表示される完了メニューには、ユーザーが選択したときにキャレットにあるノードを置き換えるオプションが含まれています。side-transformationsコンテキストアシスタント、またはコンテキストアクションツールとは異なり、置換にはデフォルトの動作があります。これは、言語の作成者が特に定義していない限り、有効になります。

コード補完のデフォルトの動作

言語作成者によって明示的に実装されたメニューがなくても、MPSは現在のノードの代わりとなる補完メニューを提供します。

  • カーソルがシングルセルエディターの前面にある

    transforms10
    transforms11

  • ユーザがノードのエディター全体を選択しました

    transforms12
    transforms13

このような場合、Control + Spaceを押すと、与えられたコンテキストで適用可能なインポートされた言語からのすべての概念を含むメニューが表示されます。これはモデル内の現在のノードを置き換えることができます。

MPSは次の手順でデフォルトの補完メニューを作成します。

  1. 選択が概念Aを許す位置の内側にあるなら、Aのすべての可能にされた副概念は完了メニューで利用可能になるでしょう。

  2. すべての抽象的な概念は除外されます

  3. 「子になることができる」という制約がfalseを返すすべての概念は除外されます

  4. 親ノードの「親になることができる」制約がfalseを返すすべての概念が除外されます

  5. 概念に1:1の参照が含まれている場合は、完了メニュー自体には追加されません。代わりに、その参照のスコープ内の各要素にアイテムが追加されます。そのようなアイテムには名前スマート参照を使用します。

ノード置換をカスタマイズするには、代替メニューが使用されます。

代替メニュー (デフォルト)

概念のデフォルトの代替メニューを定義することで、ユーザーがControl + Spaceを押したときに表示される完了メニューの内容をカスタマイズできます。これらのサブ概念が独自のデフォルトの代替メニューを定義していない限り、概念のサブ概念にも影響します。

Substitution menu 2

ただし、代替メニューをエディターの特定のセルに割り当てる場合は、変換メニューにしか追加できないため、代替メニューを変換メニューに含める必要があります。

IncludeDefaultSubstitute1

代替メニュー (名前)

名前付き代替メニューを使用すると、複数の代替メニューを作成してさまざまなコンテキストで使用することができます。名前を付けた代替メニューを有効にするには、最初に別の代替メニューまたは変換メニューに含める必要があります。

代替メニュー投稿

トランスフォームメニューと同様に、代替メニューの貢献は、新しい言語で定義された代替メニューへの新しいエントリを提供します。

オプション

  • 概念の追加 - メニューに単一の概念を追加する

  • 概念リスト - 概念のコレクションを追加する

  • グループ - 条件が満たされた場合、エントリのグループを追加する

  • 包含 - 指定されたメニューを含みます

  • パラメータ化 - パラメータ化された代替アクションを追加する

  • 参照アクション - 参照の可能なターゲットの外観を含めてカスタマイズする

  • サブコンセプトメニュー - コンセプトのすべてのサブコンセプトを含む

  • 代替アクション - 単一の代替アクションを追加する

  • 代用メニューの折り返し - 提供されたハンドラーを使用して指定された概念を折り返します

セルメニューとセル固有の変換メニューの相互作用

セルに "menu" と "transformation menu"の両方が指定されている場合は、両方のメニューから該当するエントリが結合されます。一部のセルメニューパーツ( CellMenuPart_PropertyPostfixHintsなどの CellMenuPart_Abstract の子孫)には、同等の変換/置換メニューパーツがまだありません。

プロパティ/参照用の変換メニューを含める

プロパティ/参照セルのメニューのカスタマイズはプロパティ/参照変換メニューパーツで行うことができます。参照/プロパティセルの補完メニューをカスタマイズしたいとします。以前は、インスペクタで「インラインメニュー」を定義することによって行われていました。今それは変換メニューによってもすることができます。プロパティと参照変換メニュー部分を導入しました。参照変換メニュー部分には、ターゲットノードを特定の参照に設定するアクションが含まれています。ターゲットノードはその参照のスコープから来ます。プロパティメニュー部分にも同じことが言えます。プロパティタイプの値を取り、値を特定のプロパティに設定するアクションを含みます。

参照例

参照セルの補完メニューを作成したいとします。メニューには、スコープ内にある参照の通常のターゲットとその他のカスタムアクションが含まれているはずです。これは、次の名前付き変換メニューを参照セルにアタッチすることによって実行できます。

ClassCreator CompletionMenu

それで、すべての標準的な参照アクションと私たちのカスタムアクションを完成時に受け取るでしょう:

Completion

見ることができるように参照メニュー部分は「インラインメニュー」の「一次選択参照メニュー」部分の類似物です、しかしさらにカスタマイズ可能です。また、セルにメニューが添付されていない場合は、その参照メニューがデフォルトで使用されます。

プロパティの例

もう一つの例-カーソルがそのプロパティのセルに次のラベルのセル上にあるとき、コンテキストアシスタントで特定のプロパティのためにすべての可能な値を参照するとします。Kaja言語のコードを見てみましょう。

kaja code

キャレットを見ているセルに移動したときに、見ている方向のすべてのバリエーションを確認したいと思います。そのため、このラベルセルに次のメニューを添付します。

looking direction


And get the result:
dir cont assist result

「インラインメニュー」に対するこれらのメニュー部分の利点は次のとおりです。

  1. これらは、参照/プロパティセルだけでなく、任意のセルにアタッチできます。

  2. 補完だけでなく、あらゆるメニューの場所(コンテキストアシスタント、コンテキストメニュー)で使用できます。

  3. 参照メニューはよりカスタマイズ可能です(プロパティメニューも間もなくカスタマイズ可能になるでしょう)。


メニュー発見アルゴリズム

MPSがどのように変換メニューを選択するかのプロセスを理解すると、メニューをより自信を持ってデザインできます。

変換メニューを発見するための組み込みの振る舞いは、現在の概念のスーパーコンセプトのメニューを含むことです。そのため、デフォルトではMPSは現在の概念の変換<現在のコンセプト> _TransformationMenuを探し、次にそのスーパーコンセプトのメニューとBaseConcept_TransformationMenuまで続きます。

代替メニューは変換メニューに似ていますが、その発見は反対方向に働きます。ここで、概念Aの変換メニューはそのスーパーコンセプトのメニュー(BaseConceptまで)を含みます。なぜなら、サブ概念だけがモデル内のAを安全に置き換えることができるからです。代替メニューは、既存のノードの概念に基づいて検索されるのではなく、リンクのターゲットの概念に基づいて検索されるため、変換メニューとは少し異なります。

アイテムトレースを表示する

To track, which transformation or substitute menu contributed a particular action to the completion menu or to the context assistant, users just press N/A on the completion menu entry and an interactive trace report will show up.

Sometimes it is hard to track how the action appeared in the completion or context assistant because of there are many substitute and transformation menus including each other. Now you may select some action in completion (by arrows) or in the context assistant (by pressing cmd/ctrl+alt+Enter) and then press cmd/ctrl+alt+B. You will see the trace in the project tool. This is the trace of the menu and menu part declaration which include each other starting from the top-level menu and ending with the action declaration. If the menu or the menu part declaration is explicit and is in the project, then it has bold style in tool and you can click on it and go to the declaration.
Here's how it looks like when we put the caret at a statement, show completion for the variable reference and then invoke "Show Item Trace":
ActionTrace
完成したものが、BaseConceptであるsuperconceptのメニューを含むStatementのデフォルトの変換メニューであることがわかります。それは今度はステートメントの代わりのメニューを含み、今度は式のメニューをラップします。それから、Expressionのサブコンセプトになります。その1つがVariableReferenceです。VariableReferenceは「スマートリファレンス」の概念であるため、Variable概念の目に見えるすべてのターゲットを見つけようとします。そのため、ステートメントのメニューに変数参照が表示されます。
最終更新日: 2020年6月18日

関連ページ:

エディター・アクション

MPSエディターには、完了アクション、ノード作成ポリシーにかなり実用的なデフォルトがあります。しかし、カスタマイズしたい場合は、アクション言語を使用しなければなりません。サイド変換アクションとノード代替アクションはMPS 3.4で非推奨になり、新しい変換メニュー言語に置き換えられました。ノードファク...

コンテキストアシスタント

概要:概要、説明、コンテキストアシスタントUIを使用する、コンテキストアシスタントフレームワークを使用する、プレースホルダセル、メニュー検索、プレースホルダ検索、MPSはコンテクストの中でアクションを実行するためのいくつかのメカニズムを提供します:完了、インテンション、リファクタリング、他の様々なポ...

コンテキストアクションツール

コンテキストアクションツールは一部のDSLユーザーのマウスナビゲーションへの好みに対応しています。指定されたコンテキストで適用可能なアクションが、階層的に整理されたサイドバーに一覧表示されます。サンプルロボットKaja言語のコンテキストアクションツールの使用と定義に関する短いビデオが利用可能です一般...

変換メニュー言語の拡張

概要:メニュー言語は、場所固有の機能を備えた新しい場所を追加するか、新しいメニューパーツタイプを追加することで拡張できます。場所と機能の追加:場所を追加するには、を拡張する概念を定義します。必須およびオプションの機能は、動作メソッドを使用して指定されます。をオーバーライドして、その場所で使用可能なす...