|
|
@@ -142,7 +142,7 @@ String function find_attribute_type(model : Element, elem : String, name : Strin
|
|
|
|
|
|
mm_elem = find_attribute_definer(model["metamodel"], direct_type, name)
|
|
|
|
|
|
- if (value_eq(mm_elem, "")):
|
|
|
+ if (mm_elem == ""):
|
|
|
// Couldn't find element, so is not allowed!
|
|
|
return ""!
|
|
|
else:
|
|
|
@@ -186,6 +186,7 @@ Element function get_superclasses(model : Element, name : String):
|
|
|
Element edge
|
|
|
String elem
|
|
|
Element nodes
|
|
|
+ String edge_name
|
|
|
|
|
|
nodes = set_create()
|
|
|
set_add(nodes, name)
|
|
|
@@ -202,8 +203,9 @@ Element function get_superclasses(model : Element, name : String):
|
|
|
j = 0
|
|
|
while (j < num_edges):
|
|
|
edge = read_out(model["model"][elem], j)
|
|
|
- if (dict_in(model["model"], reverseKeyLookup(model["model"], edge))):
|
|
|
- if (read_type(model, reverseKeyLookup(model["model"], edge)) == "Inheritance"):
|
|
|
+ edge_name = reverseKeyLookup(model["model"], edge)
|
|
|
+ if (edge_name != ""):
|
|
|
+ if (read_type(model, edge_name) == "Inheritance"):
|
|
|
set_add(nodes, reverseKeyLookup(model["model"], read_edge_dst(edge)))
|
|
|
j = j + 1
|
|
|
|
|
|
@@ -215,18 +217,22 @@ String function find_attribute_definer(model : Element, elem_name : String, name
|
|
|
Integer nr_out
|
|
|
Element out
|
|
|
String name_attr
|
|
|
+ String elem
|
|
|
|
|
|
superclasses = get_superclasses(model, elem_name)
|
|
|
while (set_len(superclasses) > 0):
|
|
|
current = set_pop(superclasses)
|
|
|
|
|
|
+ // TODO is it possible to use allOutgoingAssociationInstances here?
|
|
|
nr_out = read_nr_out(model["model"][current])
|
|
|
while (nr_out > 0):
|
|
|
nr_out = nr_out - 1
|
|
|
out = read_out(model["model"][current], nr_out)
|
|
|
- name_attr = read_attribute(model, reverseKeyLookup(model["model"], out), "name")
|
|
|
- if (name_attr == name):
|
|
|
- return current!
|
|
|
+ elem = reverseKeyLookup(model["model"], out)
|
|
|
+ if (elem != ""):
|
|
|
+ name_attr = read_attribute(model, elem, "name")
|
|
|
+ if (name_attr == name):
|
|
|
+ return current!
|
|
|
|
|
|
return ""!
|
|
|
|
|
|
@@ -242,9 +248,6 @@ Void function instantiate_attribute(model : Element, element : String, attribute
|
|
|
attr_type = find_attribute_type(model, element, attribute_name)
|
|
|
|
|
|
if (attr_type == ""):
|
|
|
- log("Could not find attribute " + cast_v2s(attribute_name))
|
|
|
- log("For element " + element)
|
|
|
- log("Type: " + read_type(model, element))
|
|
|
return!
|
|
|
|
|
|
if (has_value(value)):
|
|
|
@@ -384,7 +387,7 @@ Element function read_attribute(model : Element, element : String, attribute : S
|
|
|
Element edge
|
|
|
Element edge_type
|
|
|
Element elem
|
|
|
- Element name
|
|
|
+ String name
|
|
|
|
|
|
elem = model["model"][element]
|
|
|
count = read_nr_out(elem)
|
|
|
@@ -393,9 +396,10 @@ Element function read_attribute(model : Element, element : String, attribute : S
|
|
|
while (i < count):
|
|
|
edge = read_out(elem, i)
|
|
|
name = reverseKeyLookup(model["model"], edge)
|
|
|
- edge_type = model["metamodel"]["model"][read_type(model, name)]
|
|
|
- if (element_eq(edge_type, dict_read_edge(read_edge_src(edge_type), attribute))):
|
|
|
- return read_edge_dst(edge)!
|
|
|
+ if (name != ""):
|
|
|
+ edge_type = model["metamodel"]["model"][read_type(model, name)]
|
|
|
+ if (element_eq(edge_type, dict_read_edge(read_edge_src(edge_type), attribute))):
|
|
|
+ return read_edge_dst(edge)!
|
|
|
i = i + 1
|
|
|
|
|
|
else:
|