MPS 2019.2ヘルプ

コンセプト機能

コンセプト機能を使用すると、言語設計者は自分の言語ユーザーのためにフックを残すことができ、それを介してユーザーは生成コードで活用するためのコードを提供できます。例:エディター制約インテンションなど、MPSが言語デザイン用に提供しているほとんどの言語は、コンセプト機能を利用しています。

cf1(英語)

インスペクターウィンドウでそれらの使用箇所を見つけることもできます。

cf2(英語)

コンセプト機能jetbrains.mps.baselanguageで定義されており、BaseLanguageコードが含まれています。生成されたBaseLanguageコードは、生成されたJavaコードの一部になります。このオプションはあなたのDSLに非常に大きな柔軟性を与えます。

サンプル

Robot Kajaサンプルプロジェクトを使ってコンセプト機能を試してみましょう。目的は、スクリプトの作者が、トレースメッセージをカスタマイズする機能を提供できるようにすることです。メッセージは、traceコマンドを介してユーザーに報告されます。

cf3(英語)
cf4(英語)

ユーザは、元のメッセージをパラメータとして受け取り、代わりに表示されるべき文字列を返す関数を通してトレースメッセージをカスタマイズすることができます。

cf5(英語)
cf6(英語)

概念関数conceptを定義する

まず、ConceptFunctionのサブコンセプトを作成する必要があります。

cf7(英語)

cf8(英語)

動作の側面はConceptFunctionから継承したいくつかのメソッドをオーバーライドします。

  • getExpectedReturnType() - 関数から返される型を宣言する

  • getParameterConcepts() - この関数のパラメータを表す概念をリストする

  • showName() - 関数の名前をパラメータリストおよび戻り型と一緒にエディターに表示するかどうかを示します

  • getName() - エディターに表示する関数の名前デフォルトでは概念別名が使用されているため、動的名が必要な場合は通常これをオーバーライドしたいだけです。

MyFunctionは元のトレースメッセージ値を保持するための引数を必要とするため、そのパラメータを表す概念を作成する必要があります。これはConceptFunctionParameterの概念を拡張し、オーバーライドされたgetType()動作メソッドを通じてその型を指定します。

cf9(英語)

cf10(英語)

スクリプトにMyFunctionを追加する

一度定義すると、MyFunctionの概念をスクリプトに追加することができます。

cf11(英語)

cf12(英語)

これにより、スクリプトエディターで関数を編集することができます。

cf16(英語)

エンターキーを押すと、エディターがコンセプト関数のシグネチャーを表示し、その本体を編集することができます。

cf17(英語)

概念関数シグネチャーにカーソルを合わせると、インスペクターに関数の説明メッセージとそのパラメータが表示されます。

ジェネレーター調整

残っている最後のステップは、トレースメッセージのカスタマイズが行われるようにジェネレータを変更することです。最初にKajaFrameクラスを修正する必要があります。これはRobot Kaja スクリプトから生成されるすべてのクラスのスーパークラスです。

cf15(英語)

元のトレースメッセージをカスタマイズするには、trace()メソッドで新しいcustomizeMessage()メソッドを呼び出す必要があります。customizeMessage()メソッドのデフォルト実装は、変更を加えずにメッセージを返します。

スクリプト用に生成されたクラスの外観を定義するジェネレータテンプレートは、KajaFramecustomizeMessage()メソッドをオーバーライドする追加のメソッドを生成する必要があります。

cf13(英語)

オーバーライドするメソッドは、概念関数がスクリプトに存在する場合にのみ生成されます。ジェネレータはmyFunctionの本体を、生成されたcustomizeMessage()メソッドの本体として使用します。

cf14(英語)

トレースメッセージをカスタマイズするための概念関数は完全に機能するはずです。

cf5(英語)

最終更新日: 2019年8月30日