MPS 2020.3 ヘルプ

制約

The Structure Language may sometimes be insufficient to express advanced constraints on the language structure. The Constraints aspect gives you a way to define such additional constraints.

デフォルトの具体的な概念

For abstract concepts the Constraints aspect can be used to indicate, which concept should be used instead when a node of the abstract concept needs to be created.

Image2018 9 12 15 43 19

For example, if a child collection is supposed to hold AbstractCommands and the user hits enter to insert a new child into the collection, a node of the EmptyLine concept is created and inserted.

Similarly. the smodel commands that create new nodes and accept the <default> parameter will correctly create nodes of the concrete concept instead of the abstract one.

Image2018 9 12 15 50 5

子 / 親 / 祖先 / ルートにすることができます

These are the first knobs to turn when defining constraints for a concept. They determine whether instances of this concept can be hooked as children (parents, ancestors) nodes of other nodes or root nodes in models. You specify them as boolean-returning closures, which MPS invokes each time when evaluating allowed possition for a node in the AST.

Constraintsx1

インポートする言語

You will most likely need at least two languages imported in the constraints aspect in order to be able to define constraints - the j.m.baselanguage and j.m.lang.smodel languages.

子供になることができます

コンセプトのインスタンスが特定のノードの子になることが許可されていない場合、false を返します。

パラメーター

説明

operationContext

IOperationContext

ノード チェックしている子ノード (この概念の実例)

parentNode

チェックしている親ノード

childConcept

子ノードの概念 (この概念のサブコンセプトになることができます)

リンク

子ノードの LinkDeclaration (そこから子供のロールを果たすことができます)

親になることができます

概念のインスタンスが特定の概念ノード(特定のロール内)の親になることが許可されていない場合、false を返します。

パラメーター

説明

operationContext

IOperationContext

childNode

チェックしている子ノード

ノード

チェックしている親ノード (この概念の実例)

childConcept

チェックしている子ノードの概念

リンク

子ノードの LinkDeclaration

先祖になれます

コンセプトのインスタンスが特定のノードの祖先になることが許可されていない場合、false を返します。

パラメーター

説明

operationContext

IOperationContext

childNode

チェックしている子ノード

ノード

チェックしている先祖ノード (この概念の実例)

childConcept

子孫ノードの概念

ルートになることができます

This constraint is available only for rootable concepts (instance can be root is true in the concept structure description). Return false if instance of concept cannot be a root in the given model.

パラメーター

説明

operationContext

IOperationContext

モデル

ルートのモデル

プロパティの制約

Technically speaking, "pure" concept properties are not properties in its original meaning, but only public fields. Property constraints allow you to make them real properties. Using these constraints, the behavior of concept's properties can be customized. Each property constraint is applied to a single specified property.

property- the property to which this constraint is applied.

get- this method is executed to get property value every time property is accessed.

パラメーター

説明

ノード

プロパティを取得するノード

set- this method is executed to set property value on every write. The property value is guaranteed to be valid.

パラメーター

説明

ノード

プロパティを設定するノード

propertyValue

新しいプロパティ値

is valid- this method should determine whether the value of the property is valid. This method is executed every time before changing the value, and if it returns false, the set() method is not executed.

パラメーター

説明

ノード

プロパティをチェックするノード

propertyValue

チェックする値

例 - 補完メニューの説明のカスタマイズ

完了メニューには、利用可能なノードと追加の説明情報が一覧表示されます。

Sd1

In order to customize the additional information and provide more details on the individual options listed in the completion menu, you can override the getter of the shortDescription property of the target concept:

Sd2

Sd3

参照先の制約

このタイプの制約は、概念のリンクに動作を追加し、よりプロパティのように見えるようにできます。

referent set handler- if specified, this method is executed on every set of this link.

パラメーター

説明

referenceNode

リンクを含むノード。

oldReferentNode

参照の古い値

newReferentNode

参照の新しい値


scope- defines the set of nodes to which this link can point. The method returns a Scope instance. Please refer to the スコープドキュメント for more information on scoping. There are two types of scope referent constraint:

  • 継承

  • 参照

While inherited scope simply declares the target concept, the reference scope provides a function that calculates the scope on the fly from the parameters.

パラメーター

説明

referenceNode

実際のリンクを含むノードスマート参照を使用する概念のために新しいノードが作成されているときは null になる可能性があります。この状況では、enclosingNode のコンテキストで作成するノードの種類を決定するためにスマート参照が使用されるため、検索スコープメソッドは null referenceNode で呼び出されます。

contextNode

参照を持つノード、または最も近い非 null コンテキストノード

containmentLink

contextNode と作成中の存在しない子との親子関係を記述する SContainmentLink (referenceNode が存在する場合、このパラメーターは意味を持ちません。)

linkTarget

このリンクが参照できる概念通常それは参照の概念のため、静的に知られています。subconcept で参照を特殊化し、特殊化参照の検索範囲を定義しない場合は、linkTarget パラメーターを使用して、どの参照の特殊化が必要かを判断できます。

位置

contextRole のターゲットインデックス

範囲が参照に設定されていない場合は、参照されている概念のデフォルトの範囲が使用されます。デフォルトのスコープも設定されていない場合は、「グローバル」スコープが使用されます。インポートされたすべてのモデルからの参照概念のすべてのインスタンスです。


presentation(廃止予定 - エディターのアスペクトが参照の表示を指定するようになりました。エディターを参照してください )- here you specify how the reference will look like in the editor and in the completion list. Sometimes it is convenient to show reference differently depending on context. For example, in Java all references to an instance field f should be shown as this.f, if the field is being shadowed by the local variable declaration with the same name. By default, if no presentation is set, the name of the reference node will be used as its presentation (provided it is an INamedConcept).

パラメーター

説明

モデル 参照を含むノードのモデル

parameterNode

提示されるノード (referenceNode は linkTarget 型の parameterNode への参照を持っています)

位置 contextRole のターゲットインデックス
存在する 参照が作成されているときは false

見える

true - 既存ノードの表示、false - 新しいノード用 (完了メニューで選択した後に作成されます)

smartReference

true - ノードはスマートリファレンスに表示されます

inEditor

true - エディターへのプレゼンテーション、false - 補完メニュー

contextNode 参照を持つノード、または最も近い非 null コンテキストノード
contextRolecontextNode 内のターゲットロール
referenceNode
enclosingNode
linkTarget
containingLink
非推奨

デフォルトスコープ

Suppose we have a link pointing to an instance of concept C and we have no scope defined for this link in referent constraints. When you edit this link, all instances of concept C from all imported models are visible by default. If you want to restrict set of visible instances for all links to concept C you can set default scope for the concept. As in referent constraint you can set search scope, validator and presentation methods. All the parameters are the same.

スコープの詳細についてはスコープドキュメントを参照してください。

関連ページ:

スコープ

カスタム言語要素のスコープを定義する 2 つの方法、継承 (階層) と参照アプローチを見ていきます。実験用のテストベッドとして計算機のチュートリアル言語を選択しました。MPS ディストリビューションに付属のサンプルプロジェクトのセットに calculator-tutorial プロジェクトが含まれています。2 つの方法:すべての参照は許可されたターゲットのセットを知る必要があります。これにより、ユーザーが参照の値を入力しようとしているときはいつでも MPS が完了メニューに値を入力することができます...

エディター

言語のための構造が定義されたら、おそらく行って、開発者がそれを使って便利に AST を構築できるようにするための手段を作成するでしょう。AST を直接操作しても、直感的にも生産的にもなりません。AST を隠してユーザーに快適で直感的な対話を提供することは、言語エディターにとってのロールです。AST を直接操作する必要がある場合もあります。例: 利用可能なエディター定義でノードのすべてのプロパティにアクセスできない場合。リフレクティブエディターを使用すると、選択したノードのエディターを終了して代わ...

エディター言語生成 API

エディター言語は多くの MPS ユーザによって拡張されることになっているため、エディター言語用のジェネレーターを、使いやすいように設計しました - わかりやすいテンプレート、人間が読めるコード、実行時よりも生成時のメタ情報の使用 - 時間。新しいセルタイプを提供するために、いずれかの言語でエディターの言語を拡張している場合は、このドキュメントが役立ちます。API: EditorCell 契約 EditorCell.setBig()/。getBig() メソッドの規約が少し変更されました。詳細について...

振る舞い

構文木の操作中、タスクを単純化し機能を再利用するために、一般的な操作がユーティリティメソッドに抽出されることがよくあります。そのようなユーティリティを静的メソッドに抽出したり、仮想メソッド内にユーティリティコードを保持するノードラッパーを作成することが可能です。しかし、MPS ではより良い解決策が利用できます。振舞い言語の側面です。ノード上に仮想および非仮想インスタンスメソッド、静的メソッド、概念インスタンスコンストラクターを作成することが可能になります。Behavior アスペクトのメソッドは...