MPS 2019.1ヘルプ

変換メニュー言語

概要

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

メニューを定義する

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

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

transformx1

デフォルトメニュー

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

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

tml1

名前付きメニュー

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

tml2

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

image2016 5 30 17 9 40

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

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

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

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

tml3

セクションの場所

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

Locations1

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

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

  • group - メニュー項目のコレクション

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

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

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

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

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

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

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

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

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

  • plugin Action - プラグインアクション( jetbrains.mps.lang.pluginからActionDeclaration )をラップします。

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 の子孫)には、同等の変換/置換メニューパーツがまだありません。

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

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

参照例

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

ClassCreator CompletionMenu

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

Completion

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

プロパティーの例

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

kaja code

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

looking direction


そして結果を得る:
dir cont assist result

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

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

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

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


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

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

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

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

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

どの変換または代替メニューが特定のアクションを完了メニューまたはコンテキストアシスタントに提供したかを追跡するには、ユーザーは完了メニューのエントリでControl/Cmd + Alt + Bを押すだけで、対話型のトレースレポートが表示されます。

互いに補完メニューや変換メニューが多数あるため、アクションが補完アシスタントまたはコンテキストアシスタントにどのように表示されたかを追跡するのが難しい場合があります。これで、完了(矢印による)またはコンテキストアシスタント(cmd / ctrl + alt + Enterを押すこと)で何らかのアクションを選択してから、cmd / ctrl + alt + Bを押すことができます。プロジェクトツールにトレースが表示されます。これは、最上位メニューから開始してアクション宣言で終わる、メニューとメニュー部分の宣言のトレースです。メニューまたはメニュー部分の宣言が明示的でプロジェクト内にある場合は、ツール内で太字のスタイルになっているため、それをクリックして宣言に進むことができます。
ステートメントにキャレットを置いて変数参照の補完を表示してから[Show Item Trace]を呼び出すと、次のようになります。
ActionTrace
完成したものが、BaseConceptであるsuperconceptのメニューを含むStatementのデフォルトの変換メニューであることがわかります。それは今度はステートメントの代わりのメニューを含み、今度は式のメニューをラップします。それから、Expressionのサブコンセプトになります。その1つがVariableReferenceです。VariableReferenceは「スマートリファレンス」の概念であるため、Variable概念の目に見えるすべてのターゲットを見つけようとします。そのため、ステートメントのメニューに変数参照が表示されます。
最終更新日: 2019年6月7日