MPS 2019.2ヘルプ

制約

The 構造言語 may sometimes be insufficient to express advanced constraints on the language structure. The 制約 aspect gives you a way to define such additional constraints.

Default concrete concept

For abstract concepts the 制約 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 <デフォルト> parameter will correctly create nodes of the concrete concept instead of the abstract one.

image2018 9 12 15 50 5

Can be child/parent/ancestor/root

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

Languages to import

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.

can be child

Return false if an instance of the concept is not allowed to be a child of specific nodes.

パラメーター

説明

operationContext

IOperationContext

ノード

the child node we are checking (この概念の実例)

parentNode

the parent node we are checking

childConcept

concept of the child node (この概念のサブコンセプトになることができます)

link

LinkDeclaration of the child node (そこから子供のロールを果たすことができます)

can be parent

Return false if an instance of concept is not allowed to be a parent of specific concept node (in a given role).

パラメーター

説明

operationContext

IOperationContext

childNode

the child node we are checking

ノード

the parent node we are checking (この概念の実例)

childConcept

the concept of the child node we are checking

link

LinkDeclaration of the child node

can be ancestor

Return false if an instance of the concept is not allowed to be an ancestor of specific nodes.

パラメーター

説明

operationContext

IOperationContext

childNode

the child node we are checking

ノード

the ancestor node we are checking (この概念の実例)

childConcept

the concept of the descendant node

can be root

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

モデル

model of the root

Property constraints

Technically speaking, 「純粋」 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.

パラメーター

説明

ノード

node to get property from

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

パラメーター

説明

ノード

node to set property

propertyValue

new property value

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.

パラメーター

説明

ノード

node to check property

propertyValue

value to be checked

サンプル - customizing the description in the completion menu

The completion menu lists available nodes together with some additional descriptive information:

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 constraints

Constraints of this type help to add behavior to concept's links and make them look more properties-like.

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

パラメーター

説明

referenceNode

node that contains link.

oldReferentNode

参照の古い値

newReferentNode

参照の新しい値


scope - このリンクが指すことができるノードのセットを定義します。メソッドはスコープインスタンスを返します。スコープの詳細についてはスコープドキュメントを参照してください。スコープ参照制約には2つのタイプがあります。

  • 継承

  • 参照

継承スコープは単にターゲット概念を宣言するだけですが、参照スコープはパラメータからその場でスコープを計算する関数を提供します。

パラメーター

説明

referenceNode

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

contextNode

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

containmentLink

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

linkTarget

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

位置

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

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


presentation(廃止予定 - エディターのアスペクトが参照の表示を指定するようになりました: エディターを参照してください) - ここでは、エディターと補完リストでの参照の外観を指定します。状況に応じて参照を異なるように表示すると便利なことがあります。例:Javaでは、フィールドが同じ名前のローカル変数宣言によって隠されている場合、インスタンスフィールドfへの参照はすべてthis.fとして表示されます。デフォルトでは、プレゼンテーションが設定されていない場合、参照ノードの名前がそのプレゼンテーションとして使用されます(INamedConceptである場合)。

パラメーター

説明

モデル

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

parameterNode

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

位置

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

存在する

参照が作成されているときはfalse

見える

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

smartReference

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

inEditor

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

contextNode

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

contextRole

contextNode内のターゲットロール

referenceNode
enclosingNode
linkTarget
containingLink

非推奨

デフォルト・スコープ

概念Cのインスタンスを指すリンクがあり、参照制約内でこのリンクに対して定義された範囲がないとします。このリンクを編集すると、インポートされたすべてのモデルからの概念Cのすべてのインスタンスがデフォルトで表示されます。すべてのリンクの可視インスタンスのセットを概念Cに制限したい場合は、その概念のデフォルトの範囲を設定できます。参照制約と同様に、検索範囲バリデータ、および表示方法を設定できます。すべてのパラメータは同じです。

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

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