MPS 2019.1ヘルプ

コンセプト機能

コンセプト機能を使用すると、言語設計者は自分の言語ユーザーのためにフックを残すことができ、それを介してユーザーは生成コードで活用するためのコードを提供できます。例:エディター制約インテンションなど、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年7月5日