|
@@ -204,13 +204,48 @@ def set_overlap(a, b, **remainder):
|
|
|
|
|
|
def get_superclasses(a, b, **remainder):
|
|
|
model, name = a, b
|
|
|
- model_dict, name_value = yield [("RD", [a, "model"]),
|
|
|
- ("RV", [b])]
|
|
|
- elem, = yield [("RD", [model_dict, name_value])]
|
|
|
+ model_dict, tm_dict, name_value = yield [("RD", [a, "model"]),
|
|
|
+ ("RD", [a, "type_mapping"]),
|
|
|
+ ("RV", [b])]
|
|
|
|
|
|
- worklist = set([elem])
|
|
|
+ worklist = set([name_value])
|
|
|
found = set([])
|
|
|
|
|
|
while worklist:
|
|
|
- elem = worklist.pop()
|
|
|
- found.add(elem)
|
|
|
+ name = worklist.pop()
|
|
|
+ if name in found:
|
|
|
+ continue
|
|
|
+ elem, = yield [("RD", [model_dict, name])]
|
|
|
+ found.add(name)
|
|
|
+
|
|
|
+ # Iterate over all outgoing links
|
|
|
+ outgoing, = yield [("RO", [elem])]
|
|
|
+ outgoing = set(outgoing)
|
|
|
+ while (outgoing):
|
|
|
+ link = outgoing.pop()
|
|
|
+
|
|
|
+ # If the link is typed by "Inheritance", we add its destination
|
|
|
+ link_name_node, = yield [("CALL_ARGS", [reverseKeyLookup, [model_dict, link]])]
|
|
|
+ link_name, = yield [("RV", [link_name_node])]
|
|
|
+ t_edge, = yield [("RD", [tm_dict, link_name])]
|
|
|
+ t_edge, = yield [("RV", [t_edge])]
|
|
|
+ if t_edge == "Inheritance":
|
|
|
+ edge, = yield [("RE", [link])]
|
|
|
+ src, dst = edge
|
|
|
+ # Look up dst's name and add it
|
|
|
+ dst_name, = yield [("CALL_ARGS", [reverseKeyLookup, [model_dict, dst]])]
|
|
|
+ dst_name_value, = yield [("RV", [dst_name])]
|
|
|
+ worklist.add(dst_name_value)
|
|
|
+
|
|
|
+ result, = yield [("CN", [])]
|
|
|
+ yield [("CD", [result, i, result]) for i in found]
|
|
|
+
|
|
|
+ raise PrimitiveFinished(result)
|
|
|
+
|
|
|
+def list_pop_final(a, **remainder):
|
|
|
+ lst, = yield [("RO", [a])]
|
|
|
+ length = len(lst)
|
|
|
+ result, result_edge = yield [("RD", [a, length - 1]),
|
|
|
+ ("RDE", [a, length -1])]
|
|
|
+ _, = yield [("DE", [result_edge])]
|
|
|
+ raise PrimitiveFinished(result)
|