MPS 2024.3 ヘルプ

ジェネレーターユーザガイド Demo4

Generator ユーザーガイドデモ 4

このデモでは、demoLang3 ジェネレーター ( デモ 3 を参照) をさらに進化させ、パネルコンポーネントのサポートを追加します。ボタンラベルとは異なり、パネルには他のパネルを含む他のコンポーネントを含めることができます。ジェネレーターで再帰が発生します。削減がこの種の問題の解決にどのように役立つかを見ていきます。

新しい言語

demoLang4 の demoLang3 ジェネレーターの大部分を再利用します。

  • 新しい言語「generator_demo.demoLang4」を作成します

  • 言語プロパティダイアログで拡張言語を追加します:「jetbrains.mps.sampleXML」と「jetbrains.mps.baseLanguage」

  • この言語用の新しいジェネレーターが存在しない場合は作成します。詳細については、デモ 1 を参照してください。

  • demoLang4 ジェネレーターから(空の)マッピング構成 'main' を削除します (demoLang3 ジェネレーターから demoLang4 ジェネレーターに必要なすべてのパーツをコピーします)

  • demoLang3 ジェネレーターから demoLang4 ジェネレーターにすべてのノードをコピーして貼り付けます

パネル用テンプレート

ボタンとラベルの生成方法に合わせて、パネルのコードを生成するための新しいテンプレートを作成します -insert_Panelこのテンプレートは、たとえば insert_Label と非常によく似ているため、既存のテンプレートの 1 つのコピーとして新しいテンプレートを作成します。

  • ポップアップメニューのクローンルートコマンド demoLang4 発生器内との invoke insert_Label テンプレート(ツリー内)を選択

  • エディターで - 新しいテンプレートの名前を変更します: insert_Label- > insert_Panel

  • テンプレートコードで -JLabel を JPanel に置き換えます

  • 'setText(...)' ステートメントを削除 - パネルは 'text' プロパティをサポートしていません

Screen-Shot-2017-06-27-at-12-50-52-PM.png
  • switch_Element テンプレートスイッチで、パネルのエントリを追加します。

gdd2.png
  • ジェネレーターを再生成します

最初のテスト

新しいテストモデルを作成しましょう。

  • 'test_models' ソリューションに移動します

  • モデル「test3」をモデル「test4」に複製

  • モデルプロパティダイアログで、「生成中」言語の demoLang3 -> demoLang4 を置き換えます。詳細については、デモ 2 を参照してください。

  • モデル「test4」に、ルート要素「panel」を含む新しいドキュメント「Panel」を追加します

  • 属性を追加する: 'background' white' 'を' panel ' 要素に

  • いくつかの「ラベル」要素を「パネル」要素に追加します。

gdd3.png
  • 「test4」モデルのファイルを生成する

  • 生成されたファイルをプレビューする

gddy.png

生成された UI は、「Hello MPS!」ラベルは新しいパネル内にネストする必要があります。代わりに、フレームに直接追加されます。これは、私たちのジェネレーターが現在、ルート要素と非ルート要素との間に違いをもたらさず、単にすべてトップレベルの視覚コンポーネントに変えるためです。入力モデルの各要素について、ジェネレーターは静的メソッド宣言「createComponent()」を「DemoApp」クラスに挿入し(これはまったく問題ありません)、「DemoApp」クラスの「addContent()」メソッド内に対応するメソッド呼び出しを生成しますこれはルート要素に対してのみ行う必要があるため、変更する必要があります)。

現在の実装では、コンポーネント階層がフラット化されています(すべてのコンポーネントは、アプリケーションのコンテンツペインに直接追加されます)。

LOOP マクロをルート要素に制限する

攻撃する最初の問題は、DemoApp テンプレートの LOOP マクロです。これは、ルート要素を反復処理して、それらの container.add() 呼び出しを生成するだけです。パネル内にネストされた要素は、後で UI に追加するパネルを含む必要があるため、ループに含めないでください。

最初の LOOP マクロを変更してみましょう。また、各要素の 静的メソッド宣言を生成した 2 番目の LOOP マクロは変更されていないことに注意してください。

gdd6.png

現在、Elements ではなく Documents をループしているため、LOOP 内の参照マクロを変更する必要があります。

gdd7.png

言語を再構築して生成されたファイルを見ると、ネストされたコンポーネントを最上位のアプリケーションフレームに追加していないことに気付くでしょう。

gdd8.png

ただし、パネルに追加することもありません。これが、これから修正するものです。そのために COPY_SRC -macro を使用します。

COPY_SRC- マクロ

COPY_SRC マクロは、ラップされたダミーのテンプレートコードを入力モデルのノードに置き換えます。このノードに縮小ルールが定義されている場合、出力モデルに追加される前に縮小されます。この場合、パネルの視覚的表現に視覚的コンポーネントとして子要素を正しく追加するには、パネルが必要です。たとえば、具象パネル が JPanel に変換される場合、その 2 つの子ラベル を JLabel に変換する必要があり、これらの JLabel を JPanel に追加する必要があります。DemoApp テンプレートの 2 番目の LOOP マクロのおかげで、ネストに関係なく、すべての要素に対して変換部分がすでに正しく実行されています。追加部分は部分的にしか行われていないと思います。ネストされた要素の場合、追加するのはパネルである必要があります。

  • insert_Panel を開きます

  • コンポーネントに null を追加するコードを追加する

  • ステートメント全体(; 文字を含む)を、XML パネルコンテンツを反復処理する LOOP マクロでラップします。

明らかに、パネルに null を追加したくないのではないでしょうか。ここで、COPY_SRC マクロのトリック - 現在のノードを追加します。これは、LOOP マクロで現在反復している Panel の child_Element_ を参照します。COPY_SRC マクロは、コンポーネントに追加される前に、要素をスイングコンポーネントに変換します。

Screen-Shot-2017-06-27-at-12-55-46-PM.png

入力 xml 要素は、MPS ジェネレーターによって「コピー」された後、簡単に別のものになります。ここで、「何か他のもの」がどうなるかを定義します。

削減ルール

削減ルールは、ソース言語要素からターゲット言語要素への変換を定義します。例: Panel の子を表す XML 要素を、すでに生成された静的ファクトリメソッドによって作成された JavaSwing コンポーネントに変換したいとします。私たちの特定のケースでは、Panel の子を静的メソッドの呼び出しに置き換えたいと思います。幸い、検索する静的メソッドはメソッド マッピングラベルに保存されているため、正しいメソッドを簡単に取得できます。

  • demoLang4 ジェネレーターのマッピング構成に移動し、要素に適用可能な削減ルールを作成します

  • インテンションAlt+Enter)を適用して、このルールの新しいテンプレートを作成します

gdd11.png
  • エディターで「reduce_Element」テンプレートを開きます (Ctrl キーを押しながら参照をクリックします)

gdd12.png
gdd13.png
  • ルールコンテンツノードとして ClassConcept を選択します

  • このクラスに静的メソッドを追加します (名前は関係ありません)

  • このメソッドの呼び出し式を作成し、それをテンプレートフラグメントにしますCtrl-Shift + F):

gdd14.png
  • メソッド呼び出し式のメソッド名に参照マクロを追加します。メソッド マッピングラベルからメソッド宣言を取得します:

gdd15.png

最終テスト

ジェネレーターを再構築し、「test4」モデルの生成されたテキストをプレビューします。

gdd16.png

今回は、ラベル「Hello」と「MPS!」の両方コンテンツペインに正しく追加されます。終わったね !

関連ページ:

ジェネレーターユーザガイド Demo3

Generator ユーザーガイドデモ 3:デモ 2 では、次のような java ステートメントを生成していました。container.add(new JButton());Swing コンポーネントを作成してアプリケーションのコンテンツペインに追加します。デモ 3 では、コンポーネントプロパティのサポートを追加します。これには、コンストラクターの呼び出しだけでなく、より複雑な初期化コードの生成が必要になります。さらに、生成されるプロパティ初期化コードは、コンポーネントの種類によって異なります。...

ジェネレーターユーザガイド Demo1

Generator ユーザーガイドのデモ 1:このデモでは、入力 XML ドキュメントごとに java アプリケーションを生成するジェネレーターを作成します。以前に作成したソリューション「test_models」で「generator_demo.test1」モデルを再利用します。このモデルは「jetbrains.mps.sampleXML」言語を使用し、「ボタン」と「ラベル」の 2 つの XML ドキュメントを含みます。出力 java アプリケーションを生成するために、これらの各ドキュメントにル...

ジェネレーターユーザガイド Demo2

Generator ユーザーガイドデモ 2:このデモでは、Java Swing アプリケーションを再度生成しますが、前のデモ 1 とは異なり、今回は入力モデルごとに 1 つの Java アプリケーションになります(デモ 1 では、入力 XML ドキュメントごとに個別の Java アプリケーションを生成しました)。デモ 2 が作成する単一の Java アプリケーションには、入力モデルのすべての XML ドキュメントに記載されているすべてのコンポーネントが含まれます。新しい言語:最初に少し技術的な...

ジェネレーターユーザガイド Demo5

Generator ユーザーガイドデモ 5:このデモでは、生成スクリプトとユーティリティクラスの使用方法を学習します。生成スクリプトには、pre-processing スクリプトと post-processing スクリプトの 2 種類があります。前処理スクリプトは、ジェネレータールールを適用する前に呼び出され、通常、ルールによるさらなる処理を容易にする方法で入力モデルを変更します。後処理スクリプトは、すべてのジェネレータールールが終了した後に呼び出され、出力モデルに適用されます。さらに、ジェネレーター...