MPS 2020.1 ヘルプ

説明コメント

ノードに属性を追加する機能を活用する方法を学びます。この機能は、構造の章の属性のセクションで詳しく説明されています。このクックブックでは、計算機チュートリアル言語に簡単な追加機能を作成して、電卓定義の入力フィールドと出力フィールドに説明的なコメントを付けることができます。これらの説明コメントは、入力フィールドと出力フィールドに対応する Swing テキストフィールドに添付された「ポップアップツールチップ」の形式で、生成された Java コードに伝達されます。

計算機の言語

実験用のテストベッドとして計算機のチュートリアル言語を選択しました。MPS ディストリビューションに付属のサンプルプロジェクトのセットに calculator-tutorial プロジェクトが含まれています。続行する前に、チュートリアルをよく読んで言語に慣れることをお勧めします。

フィールドへの変更

入力フィールドと出力フィールドに説明的なコメントを追加するための機構の構築を始めましょう。私たちのアプローチは、生成されたコードだけでなくノードに追加されたときにそれらの外観に影響を与える注釈に基づいています。私たちの望む機能を可能にするいくつかの重要な要素があります。

  • どのノードが説明コメントを保持できるかを示すマーカーインターフェース

  • ノードが説明コメントを保持しているかどうか、および説明が何であるかを示すための注釈自体

  • キャレット配下のノードに説明コメントをすばやく追加および削除するためのキーボードショートカットを提供するアクション

  • 記述されたコンポーネントの視覚的な「ツールチップ」を生成するためにコード生成プロセスを更新する

すべてのコメント可能なノードをマークするための新しいインターフェースから始めます。

Marking the nodes

InputField および OutputField 概念は両方新しい ICanHaveDescription インターフェースを実行しなければなりません。

Implementing the ICanHaveDescription interface

DescriptionAnnotation のコンセプト

パズルの核心部分、つまり説明のコメントを指定するための入力フィールドと出力フィールドに起因する実際の注釈はまだ欠落しています。今それを作成しましょう:

Creating the description


Once you make the concept extend NodeAttribute , MPS will hint you to provide further information detailing the attribution: Invoking a quick-fix through Alt+Enter will add the necessary information for you to customize:

Invoking a quick-fix


You need to specify additional qualities of the new annotation by setting values for role as well as attributed concepts. We set the role for the annotation as descriptionComment. This is the name to use in queries in order to find out, whether a node has been annotated with DescriptionAnnotation or not: We also indicate that the annotation can only be attributed to nodes implementing ICanHaveDescription , which in our case is InputField and OutputField .

Specifying additional qualities

DescriptionAnnotation は説明の実際のテキストも格納する必要があります - これには文字列プロパティ descriptionText を使用します

Adding the description text

The editor of DescriptionAnnotation is the key element in defining the visual behavior of nodes with description comments attached to them: We prepend the annotated node with a 「説明」 constant and append the actual description text wrapped in parentheses: The attributed node cell represents the editor of the actual node - the node that the attribute is attached to.

Attaching to a node

さらなるエディターの機能強化

ノードの説明コメントのオンとオフを切り替えるために、新しい KeyMap を作成します。

Creating a new key map

To edit the code we will use concepts from BaseLanguage and smodel, which should be available by default: If not, import them through Ctrl+L . We will also need the actions language in order to create initialized nodes easily: This one will most likely need to be imported explicitly ( Control + L ).

Adding an import statement

これでアクションを完了できます。


Completing the action

ICanHaveDescription を実装しているノードで Control + Alt + Shift + D が押されたときはいつでも、アクションは DescriptionAnnotation をノードに追加するか、またはノードから削除する

KeyMap は、Control + Alt + Shift + D に反応するはずのすべてのフィールドに追加される必要があります。これは InputFieldOutputField の場合です。Control + Alt + Shift + D キーの組み合わせに反応すべきエディターセルは、キーキャッププロパティで指定されたキーマップを持っている必要があります。

Adding the key map to all fields

これまでどのようにしていますか?

コンパイル後、入力フィールドと出力フィールドの両方に Control + Alt + Shift + D を使用して、説明コメントを切り替えることができます。

Toggling the description comment


ジェネレーターを更新する

DescriptionAnnotation は現在生成プロセス中に失われています。代わりに、コメント付きの入力フィールドと出力フィールドを表すテキストフィールドに対して Swing の「ツールチップ」を生成します。

Updating the generator

コードを生成するときは、現在電卓のすべての入力フィールドまたは出力フィールドを受け取り、それらのフィールドの JTextField を生成します。コンストラクターでは、生成された JTextField ごとに初期化コードも生成します。これが、説明コメント付きの入力フィールドまたは出力フィールドを表す JTextField に Swing "tooltip" をアタッチできる場所です。

Creating JTextFields

$IF$ ノードマクロは、"tooltip" が DescriptionComment 注釈が添付されたノードに対してのみ生成されることを保証する

Adding a macro

「ツールチップ」のテキストのプロパティマクロは、現在のノードにアタッチされている DescriptionAnnotationdescriptionText を設定する

Property macro

言語とサンドボックスソリューションを再構築した後、生成された電卓フォームには、DescriptionAnnotation でマークされているフィールドに「ツールチップ」が添付されます。

Resulting tooltip

概要

ここでツアーを終えることができます。入力フィールドと出力フィールドの両方を DescriptionAnnotation で記述することができます。生成されたコードには、そのような記述ごとに「ツールチップ」が含まれています。

関連ページ:

構造

MPS はあなたの意図した言語のための文法を定義することからあなたを解放するため、明らかにあなたの言語の構造を指定するための異なる方法を必要とします。これは構造言語が便利になるところです。それはあなたに言語構造を定義するためのすべての手段を与えます。前に説明したように、MPS でコーディングするとき...

汎用プレースホルダーと汎用コメント

汎用プレースホルダー :汎用プレースホルダーは、2 つのノード間の空白を表し、任意のノードコレクションに追加できます。 キーの組み合わせは、コレクション内の現在の位置にプレースホルダーを挿入します。プレースホルダーは透過的に動作します。プレースホルダーノードの補完メニューを呼び出してノードを置き換え...

MPS 電卓言語チュートリアル

このチュートリアル導入、テンプレートの実装、導入このチュートリアルでは、MPS での言語デザインのさまざまな分野について説明します。単純なスタンドアロン言語の抽象的な構造を定義し、そのためのエディターを設計し、タイプを制限し、スコープを作成し、最後に Java コードを生成するジェネレータを準備しま...

要求追跡言語

このクックブックでは、要件追跡サンプルプロジェクトについて説明します。このサンプルプロジェクトは、言語にとらわれない要求追跡を実装しています。その過程で、いくつかの便利な言語構成要素が例示されています。異なる言語のノードに注釈を付けるノード属性、コンセプトごとの複数のエディター(プレゼンテーション)...

スコープ

カスタム言語要素のスコープを定義する 2 つの方法、継承 (階層)と参照アプローチを見ていきます。実験用のテストベッドとして計算機のチュートリアル言語を選択しました。MPS ディストリビューションに付属のサンプルプロジェクトのセットにcalculator-tutorialプロジェクトが含まれています...