|
@@ -407,3 +407,31 @@ def read_type(a, b, **remainder):
|
|
|
yield [("RETURN", [{'value': ""}])]
|
|
|
else:
|
|
|
yield [("RETURN", [{'value': type_value}])]
|
|
|
+
|
|
|
+def retype(a, b, c, **remainder):
|
|
|
+ if "value" not in b:
|
|
|
+ b['value'], = yield [("RV", [b['id']])]
|
|
|
+ if "value" not in c:
|
|
|
+ c['value'], = yield [("RV", [c['id']])]
|
|
|
+
|
|
|
+ tm, = yield [("RD", [a["id"], "type_mapping"])]
|
|
|
+
|
|
|
+ # remove_type
|
|
|
+ root, = yield [("RD", [tm, "root"])]
|
|
|
+ val_edge, = yield [("RDE", [root, b["value"]])]
|
|
|
+ if val_edge is not None:
|
|
|
+ # Key exists, so remove
|
|
|
+ yield [("DE", [val_edge])]
|
|
|
+
|
|
|
+ # Create new type links
|
|
|
+ type_elem, instance_elem = yield [("CNV", [c['value']]), ("CNV", [b['value']])]
|
|
|
+ type_link, = yield [("CE", [root, type_elem])]
|
|
|
+ instance_link, = yield [("CE", [type_link, instance_elem])]
|
|
|
+
|
|
|
+ # Add them to the model
|
|
|
+ yield [("CD", [tm, str(type_elem), type_elem]),
|
|
|
+ ("CD", [tm, str(instance_elem), instance_elem]),
|
|
|
+ ("CD", [tm, str(type_link), type_link]),
|
|
|
+ ("CD", [tm, str(instance_link), instance_link])]
|
|
|
+
|
|
|
+ yield [("RETURN", [None])]
|