json::serialization: intro services to get the class hierarchy from the engine
authorAlexis Laferrière <alexis.laf@xymus.net>
Fri, 14 Oct 2016 19:21:09 +0000 (15:21 -0400)
committerAlexis Laferrière <alexis.laf@xymus.net>
Fri, 14 Oct 2016 20:02:58 +0000 (16:02 -0400)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

lib/json/serialization_read.nit

index 7675c21..b9b1c37 100644 (file)
@@ -19,6 +19,7 @@ import ::serialization::caching
 private import ::serialization::engine_tools
 private import static
 private import string_parser
+import poset
 
 # Deserializer from a Json string.
 class JsonDeserializer
@@ -492,3 +493,43 @@ redef class Map[K, V]
                end
        end
 end
+
+# ---
+# Metamodel
+
+# Class inheritance graph as a `POSet[String]` serialized to JSON
+private fun class_inheritance_metamodel_json: NativeString is intern
+
+redef class Sys
+       # Class inheritance graph
+       #
+       # ~~~
+       # var hierarchy = class_inheritance_metamodel
+       # assert hierarchy.has_edge("String", "Object")
+       # assert not hierarchy.has_edge("Object", "String")
+       # ~~~
+       var class_inheritance_metamodel: POSet[String] is lazy do
+               var engine = new JsonDeserializer(class_inheritance_metamodel_json.to_s)
+               engine.whitelist.add_all(
+                       ["String", "POSet[String]", "POSetElement[String]", "HashSet[String]", "HashMap[String, POSetElement[String]]"])
+               var poset = engine.deserialize
+               if engine.errors.not_empty then
+                       print_error engine.errors.join("\n")
+                       return new POSet[String]
+               end
+               if poset isa POSet[String] then return poset
+               return new POSet[String]
+       end
+end
+
+redef class Deserializer
+       redef fun deserialize_class(name)
+       do
+               if name == "POSet[String]" then return new POSet[String].from_deserializer(self)
+               if name == "POSetElement[String]" then return new POSetElement[String].from_deserializer(self)
+               if name == "HashSet[String]" then return new HashSet[String].from_deserializer(self)
+               if name == "HashMap[String, POSetElement[String]]" then return new HashMap[String, POSetElement[String]].from_deserializer(self)
+
+               return super
+       end
+end