Jelajahi Sumber

Add new code for typing, but still rely on old code (new one seems bugged)

Yentl Van Tendeloo 8 tahun lalu
induk
melakukan
442ca4fca2
1 mengubah file dengan 115 tambahan dan 15 penghapusan
  1. 115 15
      bootstrap/typing.alc

+ 115 - 15
bootstrap/typing.alc

@@ -2,18 +2,127 @@ include "primitives.alh"
 include "utils.alh"
 
 Element function get_type_mapping_as_dict(model : Element):
+	return OLD_get_type_mapping_as_dict(model)!
+
+String function read_type(model : Element, name : String):
+	return OLD_read_type(model, name)!
+
+Void function retype(model : Element, element : String, type : String):
+	OLD_retype(model, element, type)
+	return!
+
+Void function new_type_mapping(model : Element):
+	OLD_new_type_mapping(model)
+	return!
+
+Void function remove_type(model : Element, name : String):
+	OLD_remove_type(model, name)
+	return!
+
+Element function get_type_mapping(model : Element):
+	return model["type_mapping"]!
+
+Void function set_type_mapping(model : Element, type_mapping : Element):
+	dict_overwrite(model, "type_mapping", type_mapping)
+	return!
+
+Element function NEW_get_type_mapping_as_dict(model : Element):
+	Element dict
+	Element keys
+	String key
+
+	dict = dict_create()
+	keys = dict_keys(model["type_mapping"])
+
+	Element rev_model
+	Element rev_metamodel
+	rev_model = make_reverse_dictionary(model["model"])
+	rev_metamodel = make_reverse_dictionary(model["metamodel"]["model"])
+
+	while (set_len(keys) > 0):
+		key = set_pop(key)
+		if (bool_not(bool_or(dict_in_node(rev_model, model["type_mapping"][key]), dict_in_node(rev_metamodel, model["type_mapping"][key])))):
+			// Element is in neither model or metamodel
+			// Must be a typing link!
+			// So add it
+			dict_add_fast(dict, rev_model[model["type_mapping"][key]], rev_metamodel[model["type_mapping"][key]])
+
+	return dict!
+
+String function NEW_read_type(model : Element, name : String):
+	Element m_element
+	Element link
+	Integer nr
+	Element mm_element
+
+	if (dict_in(model["model"], name)):
+		m_element = model["model"][name]
+		nr = read_nr_out(m_element) - 1
+		while (nr >= 0):
+			link = read_out(m_element, nr)
+			if (dict_in(model["type_mapping"], cast_id2s(link))):
+				// Link is in our mapping, so we probably found it...
+				// But ONLY if it is NOT in the model itself
+				if (reverseKeyLookup(model["model"], link) == ""):
+					// It is not, so we actually got it!
+					// Now follow the edge to the type
+					mm_element = read_edge_dst(link)
+
+					return reverseKeyLookup(model["metamodel"]["model"], mm_element)!
+			nr = nr - 1
+
+	// Nothing found, so it must not be typed at all
+	return ""!
+
+Void function NEW_retype(model : Element, element : String, type : String):
+	// Remove previous type
+	remove_type(model, element)
+
+	// Add element of the model
+	dict_add_fast(model["type_mapping"], cast_id2s(model["model"][element]), model["model"][element])
+
+	// Add element of metamodel if not yet there
+	Element type_entry
+	type_entry = model["metamodel"]["model"][type]
+	if (bool_not(dict_in(model["type_mapping"], cast_id2s(type_entry)))):
+		dict_add_fast(model["type_mapping"], cast_id2s(type_entry), type_entry)
+
+	// Draw a link between them: the typing link
+	Element new_edge
+	new_edge = create_edge(model["model"][element], type_entry)
+	dict_add_fast(model["type_mapping"], cast_id2s(new_edge), new_edge)
+
+	return!
+
+Void function NEW_new_type_mapping(model : Element):
+	if (dict_in(model, "type_mapping")):
+		dict_delete(model, "type_mapping")
+
+	dict_add_fast(model, "type_mapping", dict_create())
+
+	return !
+
+Void function NEW_remove_type(model : Element, name : String):
+	String elem
+
+	elem = cast_id2s(model["model"][name])
+	if (dict_in(model["type_mapping"], elem)):
+		dict_delete(model["type_mapping"], elem)
+
+	return !
+
+Element function OLD_get_type_mapping_as_dict(model : Element):
 	return model["type_mapping"]!
 
-Element function get_elements_typed_by(model : Element, type : String):
+Element function OLD_get_elements_typed_by(model : Element, type : String):
 	return reverseKeyLookupMulti(model["type_mapping"], type)!
 
-String function read_type(model : Element, name : String):
+String function OLD_read_type(model : Element, name : String):
 	String result
 	Element tm
 	if (dict_in(model["model"], name)):
 		if (dict_in(model["type_mapping"], name)):
 			result = model["type_mapping"][name]
-
 			if (dict_in(model["metamodel"]["model"], result)):
 				return result!
 			else:
@@ -23,29 +132,20 @@ String function read_type(model : Element, name : String):
 	else:
 		return ""!
 
-Void function retype(model : Element, element : String, type : String):
+Void function OLD_retype(model : Element, element : String, type : String):
 	// Retype a model, deleting any previous type the element had
 	// The type string is evaluated in the metamodel previously specified
-
 	if (dict_in(model["type_mapping"], element)):
 		dict_delete(model["type_mapping"], element)
-
 	dict_add_fast(model["type_mapping"], element, type)
 	return!
 
-Void function new_type_mapping(model : Element):
+Void function OLD_new_type_mapping(model : Element):
 	if (dict_in(model, "type_mapping")):
 		dict_delete(model, "type_mapping")
 	dict_add_fast(model, "type_mapping", dict_create())
 	return !
 
-Void function remove_type(model : Element, name : String):
+Void function OLD_remove_type(model : Element, name : String):
 	dict_delete(model["type_mapping"], name)
 	return !
-
-Void function set_type_mapping(model : Element, type_mapping : Element):
-	dict_overwrite(model, "type_mapping", type_mapping)
-	return!
-
-Element function get_type_mapping(model : Element):
-	return model["type_mapping"]!