SModel language Modification operations
The most commonly used change operation in SModel is the act of changing a feature. In order to set a value of a property, or assign a child or reference node of 0..1 or 1 cardinality, you can use straight assignment (with =) or the set operation. In order to add a child to 0..n or 1..n children collection, you can either use the.add operation from the collection language or call add next-sibling/add prev-sibling operations on a node<> passing another node as a parameter.
classDef.name = "NewClassName";
myNode.condition = trueConstant;
node<InstanceMethodDeclaration> method = classDef.member.add new initialized(InstanceMethodDeclaration);
When setting a target to a reference link, there is no need to access a target node. Having a pointer to the target is enough. This is possible with the set ptr operation, which is applicable to reference link access expressions.
Similarly, to check that a node is a specific one, there is the "is" operation available.
New node creation
There are several ways to create a new node:
new operation: new node<Concept>()
new instance operation on a model: model.newInstance()
new instance operation on a concept: concept.newInstance()
add new(Concept) and set new(Concept) operations applied to feature expressions
replace with new(Concept) operation
new root node(Concept) operation applied to a model. In this case the concept should be rootable
new next-sibling<Concept>/new prev-sibling<Concept> operations adding new sibling to an existing node
To preserve the tree shape of the model, a node can only have at most one parent. As soon as you add a node as a child to a parent node, the node is detached automatically from any previous parent node that it may have had. Creating copies of nodes, including their sub-trees, may thus come handy. To create a copy of an existing node, you can use the copy operation. E.g., node<> yourNode = myNode.copy
To replace a node in the AST with an instance of another node, you can use the 'replace with' operation. If you want to replace and create at the same time, there is a shortcut operation 'replace with new(Concept)', which takes a concept as a parameter.
Delete and detach operations
If you want to delete a node from the model, you can use the detach operation. You can still add the detached node to the model later.
Properties can be assigned values directly using the assignment operation. The remove() operation on a property will delete its value from the model.