Browse Source

Added language fuse operation

Yentl Van Tendeloo 8 years ago
parent
commit
08d958ed7b
2 changed files with 45 additions and 0 deletions
  1. BIN
      bootstrap/bootstrap.m.gz
  2. 45 0
      bootstrap/modelling.alc

BIN
bootstrap/bootstrap.m.gz


+ 45 - 0
bootstrap/modelling.alc

@@ -455,3 +455,48 @@ Void function construct_model():
 				dict_add(global_models, input(), m)
 		else:
 			log("Modelling error: did not understand command " + command)
+
+Element function model_fuse(models : Element):
+	Element new_model
+	Element tagged_model
+	String model_name
+	Element model
+	Element keys
+	String key
+	Element selected_MM
+	String type
+
+	// Read out some data first
+	tagged_model = set_pop(models)
+	set_add(models, tagged_model)
+	model = list_read(tagged_model, 1)
+	selected_MM = model["metamodel"]
+	new_model = instantiate_model(selected_MM)
+
+	models = set_copy(models)
+	while (read_nr_out(models)):
+		tagged_model = set_pop(models)
+		model_name = list_read(tagged_model, 0)
+		model = list_read(tagged_model, 1)
+
+		// Add all elements from 'model', but prepend it with the 'model_name'
+		keys = set_to_list(dict_keys(model["model"]))
+		while (read_nr_out(keys) > 0):
+			key = list_pop(keys, 0)
+			type = reverseKeyLookup(model["metamodel"]["model"], dict_read_node(model["type_mapping"], model["model"][key]))
+
+			if (is_edge(model["model"][key])):
+				String src
+				String dst
+				src = (model_name + "/") + reverseKeyLookup(model["model"], read_edge_src(model["model"][key]))
+				dst = (model_name + "/") + reverseKeyLookup(model["model"], read_edge_dst(model["model"][key]))
+				if (bool_and(dict_in(new_model["model"], src), dict_in(new_model["model"], dst))):
+					instantiate_link(new_model, type, (model_name + "/") + key, (model_name + "/") + src, (model_name + "/") + dst)
+				else:
+					list_append(keys, key)
+			elif (has_value(model["model"][key])):
+				instantiate_value(new_model, type, (model_name + "/") + key, model["model"][key])
+			else:
+				instantiate_node(new_model, type, (model_name + "/") + key)
+
+	return new_model!