blob: 62ef003b68f67532178b21afce3a8c9e680c1cd8 [file] [log] [blame]
import 'Tree.ecore'::tree;
import 'TallTree.ecore'::talltree;
import 'Tree2TallTree.ecore'::tree2talltree;
transformation Tree2TallTree {
check tree imports tree;
enforce talltree imports talltree;
tree2talltree imports tree2talltree;
}
map __root__ in Tree2TallTree {
buffer nodes := tree.objectsOfKind(Node)->sortedBy(name);
for node : tree::Node in nodes {
call Node2MiddleNode {
node iterates node;
}
}
for node : tree::Node in nodes {
call Edge2MiddleEdge {
node iterates node;
}
}
for node2tallNode : tree2talltree::Node2TallNode in tree2talltree.objectsOfKind(Node2TallNode)->sortedBy(name) {
call MiddleNode2TallNode {
node2tallNode iterates node2tallNode;
}
}
}
map Node2MiddleNode in Tree2TallTree {
guard:tree node : Node;
new:tree2talltree node2tallNode : Node2TallNode;
set node2tallNode.node := node;
set node2tallNode.name := node.name;
}
map Edge2MiddleEdge in Tree2TallTree {
guard:tree node : Node;
var node2tallNode : Node2TallNode := node.Node2TallNode;
check node.parent <> null;
notify set node2tallNode.parent := node.parent.Node2TallNode;
-- node2tallNode.name := node.name;
}
map MiddleNode2TallNode in Tree2TallTree {
guard:tree2talltree node2tallNode : Node2TallNode;
var tallNode_name : String := node2tallNode.name;
observe Node2TallNode::children, Node2TallNode::tallNode
var tallNode_children : Set(TallNode) := node2tallNode.children?.tallNode->asSet();
observe Node2TallNode::children, Node2TallNode::tallNode, TallNode::height
var tallNode_height : Integer := if node2tallNode.children->notEmpty() then node2tallNode.children.tallNode.height->max() + 1 else 0 endif;
new:talltree tallNode : TallNode;
notify set node2tallNode.tallNode := tallNode;
set tallNode.name := tallNode_name;
set tallNode.children := tallNode_children;
notify set tallNode.height := tallNode_height;
}