MPS 2023.3 ヘルプ

SModel 言語

SModel 言語の目的は、MPS モデルを照会および変更することです。これにより、モデルのノード、属性、プロパティ、リンク、その他の多くの重要な品質を調査できます。言語は、言語のいくつかの異なる側面(アクション、リファクタリング、ジェネレーター)をエンコードして、最も目立つものに名前を付けるために必要です。通常、jetbrains.mps.lang.smodel 言語を BaseLanguage と組み合わせて使用します。

null 値の扱い

SModel 言語は、null 値を非常に安全な方法で処理します。Java や C# などのオブジェクト指向言語では、コード全体に expr == null および expr!= null ステートメントの形式で null 値をチェックすることがよくあります。これらは、null ポインタの例外を防ぐために必要です。ただし、同時にコードが煩雑になり、コードが読みにくくなることがよくあります。この問題を軽減するために、MPS は null 値を自由な方法で処理します。例: プロパティの null ノードを要求すると、プロパティのタイプのデフォルト値が返されます。null ノードに子リストを要求すると、空のリストなどが表示されます。null ノードで動作メソッドを呼び出すと、呼び出されたメソッドの戻り値の型が ClassifierType または StringType である場合、null 値が返されます。PrimitiveType の場合、そのタイプのデフォルト値が返されます。これにより、言語デザイナーとしての生活が楽になります。

操作パラメーター

SModel 言語の操作の多くは、パラメーターを受け入れます。操作の最後に <を入力してパラメーターリストを開くと、パラメーターを指定できます。例: myNode.ancestors <concept = IfStatement、concept = ForStatement>

これらの操作のパラメーターとしての「+」記号は、「自分自身を含める」ことを意味します。つまり、操作が呼び出されるノードが条件に一致する場合、「+」により、返される結果にそのノードも含まれるようになります。たとえば、myNode.ancestors<concept = IfStatement, +> はIfStatement の場合、myNode を返すことがあります。

同時アクセスの管理

jetbrains.mps.lang.access 言語は、モデルアクセス API、特にその同時アクセス部分の使用を容易にします。この言語は、モデルアクセス API の構文糖衣と考えることができます。また、API に直接アクセスする対応する低レベルコードの例が提供されています。MPS モデルにアクセスするには、スレッドによって適切なロックを取得する必要があります。そうしないと、読み取りまたは書き込み操作が許可されません。これらのステートメントを使用できるようにするには、jetbrains.mps.lang.access 言語をインポートする必要があります。この言語には、次のコマンドが含まれています。

  • アクションを書く

  • アクションを読む

  • とのコマンド

  • EDT でコマンドを実行します

  • EDT で実行する

  • 元にすると透明なコマンド

Example of obtaining a lock

ある種のロックは EDT によってのみ取得できます。プラットフォームは、ApplicationManager クラスを通じて EDT のコンテキストで実行されるタスクをスケジュールするための API を提供します。

Example of scheduling a command on EDT

アクションを書く

同期モデルの書き込み:

モデルへの変更は、適切な書き込みロックを保持するマネージドアクション内からのみ実行できます。メソッドはそのようなロックを取得し、提供されたアクションを実行します。EDT(イベントディスパッチスレッド)から呼び出さないでください。呼び出さないと、UI がフリーズする可能性があります。ロックはアップグレードできません。読み取りロックを所有している場合、このコマンドを使用して書き込みロックを要求することはできません。

アクションを読む

同期モデルの読み取り:

モデルのプロパティのクエリは、適切な読み取りロックを保持するマネージドアクション内からのみ実行できます。メソッドはそのようなロックを取得し、提供されたアクションを実行します。

とのコマンド

同期モデルコマンド:

これは、プラットフォームの取り消しメカニズムに関して実行される書き込みアクションを表します。このメソッドは EDT スレッドからのみ呼び出す必要があります。EDT のコマンドの実行とは異なり、このメソッドは同期的に実行されます。

EDT でコマンドを実行します

コマンドを EDT から非同期で実行するようにスケジュールします。

これは、プラットフォームの元に戻すメカニズムに関して実行される書き込みアクションを表し、EDT スレッドから非同期で実行されます。このメソッドは、任意のスレッドから呼び出すことができます。

EDT で実行する

EDT から読み取られた非同期モデルをスケジュールします。

モデルのプロパティのクエリは、適切な読み取りロックを保持するマネージドアクション内からのみ実行できます。このメソッドはそのようなロックを取得し、EDTUI スレッドで提供されたアクションを非同期的に実行します。アクション内では、UI 要素に触れたり、IntelliJ プラットフォームの他の EDT バインドアクションを実行したりしても安全です。

元にすると透明なコマンド

Undo-transparent コマンド:

実行されたコードにはモデル書き込みアクセス権があり、コマンドとして扱われます。唯一の違いは、透過的なアクションからの変更が以前の元に戻すことができるコマンドの変更とマージされるため、このアクションを個別に元に戻すことができないことです。