model: add nitunit for model_json
authorAlexandre Terrasa <alexandre@moz-code.org>
Wed, 23 Nov 2016 21:32:08 +0000 (16:32 -0500)
committerAlexandre Terrasa <alexandre@moz-code.org>
Sat, 3 Dec 2016 02:36:11 +0000 (21:36 -0500)
Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

src/model/test_model_json.nit [new file with mode: 0644]
src/model/test_model_json.sav/test_classdefs_to_full_json.res [new file with mode: 0644]
src/model/test_model_json.sav/test_classes_to_full_json.res [new file with mode: 0644]
src/model/test_model_json.sav/test_groups_to_full_json.res [new file with mode: 0644]
src/model/test_model_json.sav/test_modules_to_full_json.res [new file with mode: 0644]
src/model/test_model_json.sav/test_packages_to_full_json.res [new file with mode: 0644]
src/model/test_model_json.sav/test_propdefs_to_full_json.res [new file with mode: 0644]
src/model/test_model_json.sav/test_props_to_full_json.res [new file with mode: 0644]
src/model/test_model_json.sav/test_refs_to_full_json.res [new file with mode: 0644]

diff --git a/src/model/test_model_json.nit b/src/model/test_model_json.nit
new file mode 100644 (file)
index 0000000..105c493
--- /dev/null
@@ -0,0 +1,111 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+module test_model_json is test_suite
+
+import test_suite
+import model_json
+import frontend
+
+class TestModelSerialization
+       super TestSuite
+
+       var suite_path: String = "NIT_TESTING_PATH".environ
+       var lib_path: String = "{suite_path.dirname}/../../tests/test_prog"
+
+       private var model: Model do
+               var toolcontext = new ToolContext
+               var model = new Model
+               var mbuilder = new ModelBuilder(model, toolcontext)
+               var mmodules = mbuilder.parse_full([lib_path])
+               if mmodules.is_empty then return model
+               mbuilder.run_phases
+               toolcontext.run_global_phases(mmodules)
+               return model
+       end
+
+       fun test_refs_to_full_json do
+               var mentities = new Array[MEntity]
+               mentities.add model.mpackages.first
+               mentities.add model.mmodules.first
+               mentities.add model.mclasses.first
+               for mentity in mentities do
+                       print ((new MEntityRef(mentity)).to_pretty_full_json)
+               end
+       end
+
+       fun test_packages_to_full_json do
+               for mentity in model.mpackages do
+                       print mentity.to_pretty_full_json
+               end
+       end
+
+       fun test_groups_to_full_json do
+               for mpackage in model.mpackages do
+                       for mentity in mpackage.mgroups do
+                               print mentity.to_pretty_full_json
+                       end
+               end
+       end
+
+       fun test_modules_to_full_json do
+               for mentity in model.mmodules do
+                       print mentity.to_pretty_full_json
+               end
+       end
+
+       fun test_classes_to_full_json do
+               for mentity in model.mclasses do
+                       print mentity.to_pretty_full_json
+               end
+       end
+
+       fun test_classdefs_to_full_json do
+               for mclass in model.mclasses do
+                       for mentity in mclass.mclassdefs do
+                               print mentity.to_pretty_full_json
+                       end
+               end
+       end
+
+       fun test_props_to_full_json do
+               for mentity in model.mproperties do
+                       print mentity.to_pretty_full_json
+               end
+       end
+
+       fun test_propdefs_to_full_json do
+               for mprop in model.mproperties do
+                       for mentity in mprop.mpropdefs do
+                               print mentity.to_pretty_full_json
+                       end
+               end
+       end
+end
+
+redef class Location
+       serialize
+
+       # Avoid diff on location absolute path
+       redef fun core_serialize_to(v) do
+               v.serialize_attribute("column_end", column_end)
+               v.serialize_attribute("column_start", column_start)
+               v.serialize_attribute("line_end", line_end)
+               v.serialize_attribute("line_start", line_start)
+               var file = self.file
+               if file != null then
+                       v.serialize_attribute("file", "test_location")
+               end
+       end
+end
diff --git a/src/model/test_model_json.sav/test_classdefs_to_full_json.res b/src/model/test_model_json.sav/test_classdefs_to_full_json.res
new file mode 100644 (file)
index 0000000..2dd320b
--- /dev/null
@@ -0,0 +1,1376 @@
+{
+       "name": "Object",
+       "class_name": "MClassDef",
+       "full_name": "test_prog$Object",
+       "mdoc": {
+               "content": "Root of everything.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 21,
+                       "line_start": 20,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "interface"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 30,
+               "line_start": 20,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mclass": {
+               "full_name": "test_prog::Object"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Object$OTHER"
+       }, {
+               "full_name": "test_prog$Object$=="
+       }, {
+               "full_name": "test_prog$Object$!="
+       }, {
+               "full_name": "test_prog$Object$init"
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }, {
+               "full_name": "test_prog::Object::init"
+       }],
+       "intro": {
+               "full_name": "test_prog$Object"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [{
+               "full_name": "test_prog$Object$OTHER"
+       }, {
+               "full_name": "test_prog$Object$=="
+       }, {
+               "full_name": "test_prog$Object$!="
+       }, {
+               "full_name": "test_prog$Object$init"
+       }],
+       "redef_mpropdefs": []
+}
+{
+       "name": "Int",
+       "class_name": "MClassDef",
+       "full_name": "test_prog$Int",
+       "mdoc": {
+               "content": "Some services about Integers.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 33,
+                       "line_start": 32,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 41,
+               "line_start": 32,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mclass": {
+               "full_name": "test_prog::Int"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Int$unary -"
+       }, {
+               "full_name": "test_prog$Int$+"
+       }, {
+               "full_name": "test_prog$Int$-"
+       }, {
+               "full_name": "test_prog$Int$*"
+       }, {
+               "full_name": "test_prog$Int$/"
+       }, {
+               "full_name": "test_prog$Int$>"
+       }, {
+               "full_name": "test_prog$Int$to_f"
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::Int::unary -"
+       }, {
+               "full_name": "test_prog::Int::+"
+       }, {
+               "full_name": "test_prog::Int::-"
+       }, {
+               "full_name": "test_prog::Int::*"
+       }, {
+               "full_name": "test_prog::Int::/"
+       }, {
+               "full_name": "test_prog::Int::>"
+       }, {
+               "full_name": "test_prog::Int::to_f"
+       }],
+       "intro": {
+               "full_name": "test_prog$Int"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [{
+               "full_name": "test_prog$Int$unary -"
+       }, {
+               "full_name": "test_prog$Int$+"
+       }, {
+               "full_name": "test_prog$Int$-"
+       }, {
+               "full_name": "test_prog$Int$*"
+       }, {
+               "full_name": "test_prog$Int$/"
+       }, {
+               "full_name": "test_prog$Int$>"
+       }, {
+               "full_name": "test_prog$Int$to_f"
+       }],
+       "redef_mpropdefs": []
+}
+{
+       "name": "Float",
+       "class_name": "MClassDef",
+       "full_name": "test_prog$Float",
+       "mdoc": {
+               "content": "Some services about Floats.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 44,
+                       "line_start": 43,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 50,
+               "line_start": 43,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mclass": {
+               "full_name": "test_prog::Float"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Float$+"
+       }, {
+               "full_name": "test_prog$Float$-"
+       }, {
+               "full_name": "test_prog$Float$*"
+       }, {
+               "full_name": "test_prog$Float$/"
+       }, {
+               "full_name": "test_prog$Float$>"
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::Float::+"
+       }, {
+               "full_name": "test_prog::Float::-"
+       }, {
+               "full_name": "test_prog::Float::*"
+       }, {
+               "full_name": "test_prog::Float::/"
+       }, {
+               "full_name": "test_prog::Float::>"
+       }],
+       "intro": {
+               "full_name": "test_prog$Float"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [{
+               "full_name": "test_prog$Float$+"
+       }, {
+               "full_name": "test_prog$Float$-"
+       }, {
+               "full_name": "test_prog$Float$*"
+       }, {
+               "full_name": "test_prog$Float$/"
+       }, {
+               "full_name": "test_prog$Float$>"
+       }],
+       "redef_mpropdefs": []
+}
+{
+       "name": "Bool",
+       "class_name": "MClassDef",
+       "full_name": "test_prog$Bool",
+       "mdoc": {
+               "content": "Booleans, `true` or `false`.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 53,
+                       "line_start": 52,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 14,
+               "column_start": 1,
+               "line_end": 53,
+               "line_start": 52,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mclass": {
+               "full_name": "test_prog::Bool"
+       },
+       "mpropdefs": [],
+       "intro_mproperties": [],
+       "intro": {
+               "full_name": "test_prog$Bool"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [],
+       "redef_mpropdefs": []
+}
+{
+       "name": "String",
+       "class_name": "MClassDef",
+       "full_name": "test_prog$String",
+       "mdoc": {
+               "content": "Strings (there is no chars...).",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 56,
+                       "line_start": 55,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 16,
+               "column_start": 1,
+               "line_end": 56,
+               "line_start": 55,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mclass": {
+               "full_name": "test_prog::String"
+       },
+       "mpropdefs": [],
+       "intro_mproperties": [],
+       "intro": {
+               "full_name": "test_prog$String"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [],
+       "redef_mpropdefs": []
+}
+{
+       "name": "List",
+       "class_name": "MClassDef",
+       "full_name": "test_prog$List",
+       "mdoc": {
+               "content": "List of things.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 59,
+                       "line_start": 58,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 17,
+               "column_start": 1,
+               "line_end": 59,
+               "line_start": 58,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mparameters": [{
+               "name": "E",
+               "rank": 0,
+               "mtype": {
+                       "full_name": "nullable test_prog::Object"
+               }
+       }],
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mclass": {
+               "full_name": "test_prog::List"
+       },
+       "mpropdefs": [],
+       "intro_mproperties": [],
+       "intro": {
+               "full_name": "test_prog$List"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [],
+       "redef_mpropdefs": []
+}
+{
+       "name": "Career",
+       "class_name": "MClassDef",
+       "full_name": "test_prog$Career",
+       "mdoc": {
+               "content": "A `Career` gives a characteristic bonus or malus to the character.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 30,
+                       "line_start": 29,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 36,
+               "line_start": 29,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mclass": {
+               "full_name": "test_prog::Career"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Career$_strength_bonus"
+       }, {
+               "full_name": "test_prog$Career$strength_bonus"
+       }, {
+               "full_name": "test_prog$Career$strength_bonus="
+       }, {
+               "full_name": "test_prog$Career$_endurance_bonus"
+       }, {
+               "full_name": "test_prog$Career$endurance_bonus"
+       }, {
+               "full_name": "test_prog$Career$endurance_bonus="
+       }, {
+               "full_name": "test_prog$Career$_intelligence_bonus"
+       }, {
+               "full_name": "test_prog$Career$intelligence_bonus"
+       }, {
+               "full_name": "test_prog$Career$intelligence_bonus="
+       }, {
+               "full_name": "test_prog$Career$Object::init"
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::careers::Career::_strength_bonus"
+       }, {
+               "full_name": "test_prog::Career::strength_bonus"
+       }, {
+               "full_name": "test_prog::Career::strength_bonus="
+       }, {
+               "full_name": "test_prog::careers::Career::_endurance_bonus"
+       }, {
+               "full_name": "test_prog::Career::endurance_bonus"
+       }, {
+               "full_name": "test_prog::Career::endurance_bonus="
+       }, {
+               "full_name": "test_prog::careers::Career::_intelligence_bonus"
+       }, {
+               "full_name": "test_prog::Career::intelligence_bonus"
+       }, {
+               "full_name": "test_prog::Career::intelligence_bonus="
+       }],
+       "intro": {
+               "full_name": "test_prog$Career"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [{
+               "full_name": "test_prog$Career$_strength_bonus"
+       }, {
+               "full_name": "test_prog$Career$strength_bonus"
+       }, {
+               "full_name": "test_prog$Career$strength_bonus="
+       }, {
+               "full_name": "test_prog$Career$_endurance_bonus"
+       }, {
+               "full_name": "test_prog$Career$endurance_bonus"
+       }, {
+               "full_name": "test_prog$Career$endurance_bonus="
+       }, {
+               "full_name": "test_prog$Career$_intelligence_bonus"
+       }, {
+               "full_name": "test_prog$Career$intelligence_bonus"
+       }, {
+               "full_name": "test_prog$Career$intelligence_bonus="
+       }],
+       "redef_mpropdefs": [{
+               "full_name": "test_prog$Career$Object::init"
+       }]
+}
+{
+       "name": "Warrior",
+       "class_name": "MClassDef",
+       "full_name": "test_prog$Warrior",
+       "mdoc": {
+               "content": "Warriors are good for fighting.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 39,
+                       "line_start": 38,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 47,
+               "line_start": 38,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mclass": {
+               "full_name": "test_prog::Warrior"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Warrior$Object::init"
+       }],
+       "intro_mproperties": [],
+       "intro": {
+               "full_name": "test_prog$Warrior"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [],
+       "redef_mpropdefs": [{
+               "full_name": "test_prog$Warrior$Object::init"
+       }]
+}
+{
+       "name": "Magician",
+       "class_name": "MClassDef",
+       "full_name": "test_prog$Magician",
+       "mdoc": {
+               "content": "Magicians know magic and how to use it.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 50,
+                       "line_start": 49,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 58,
+               "line_start": 49,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mclass": {
+               "full_name": "test_prog::Magician"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Magician$Object::init"
+       }],
+       "intro_mproperties": [],
+       "intro": {
+               "full_name": "test_prog$Magician"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [],
+       "redef_mpropdefs": [{
+               "full_name": "test_prog$Magician$Object::init"
+       }]
+}
+{
+       "name": "Alcoholic",
+       "class_name": "MClassDef",
+       "full_name": "test_prog$Alcoholic",
+       "mdoc": {
+               "content": "Alcoholics are good to nothing escept taking punches.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 61,
+                       "line_start": 60,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 69,
+               "line_start": 60,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mclass": {
+               "full_name": "test_prog::Alcoholic"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Alcoholic$Object::init"
+       }],
+       "intro_mproperties": [],
+       "intro": {
+               "full_name": "test_prog$Alcoholic"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [],
+       "redef_mpropdefs": [{
+               "full_name": "test_prog$Alcoholic$Object::init"
+       }]
+}
+{
+       "name": "Race",
+       "class_name": "MClassDef",
+       "full_name": "test_prog$Race",
+       "mdoc": {
+               "content": "Race determines basic characteristics and what the character will be able to do in life.\n\nThese are base characteristics, they cannot be changed\nbut you can add new ones if needed using refinement.\nObjects and spells cannot change those characteristics.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 33,
+                       "line_start": 28,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 45,
+               "line_start": 28,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mclass": {
+               "full_name": "test_prog::Race"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Race$_base_strength"
+       }, {
+               "full_name": "test_prog$Race$base_strength"
+       }, {
+               "full_name": "test_prog$Race$base_strength="
+       }, {
+               "full_name": "test_prog$Race$_base_endurance"
+       }, {
+               "full_name": "test_prog$Race$base_endurance"
+       }, {
+               "full_name": "test_prog$Race$base_endurance="
+       }, {
+               "full_name": "test_prog$Race$_base_intelligence"
+       }, {
+               "full_name": "test_prog$Race$base_intelligence"
+       }, {
+               "full_name": "test_prog$Race$base_intelligence="
+       }, {
+               "full_name": "test_prog$Race$Object::init"
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::races::Race::_base_strength"
+       }, {
+               "full_name": "test_prog::Race::base_strength"
+       }, {
+               "full_name": "test_prog::Race::base_strength="
+       }, {
+               "full_name": "test_prog::races::Race::_base_endurance"
+       }, {
+               "full_name": "test_prog::Race::base_endurance"
+       }, {
+               "full_name": "test_prog::Race::base_endurance="
+       }, {
+               "full_name": "test_prog::races::Race::_base_intelligence"
+       }, {
+               "full_name": "test_prog::Race::base_intelligence"
+       }, {
+               "full_name": "test_prog::Race::base_intelligence="
+       }],
+       "intro": {
+               "full_name": "test_prog$Race"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [{
+               "full_name": "test_prog$Race$_base_strength"
+       }, {
+               "full_name": "test_prog$Race$base_strength"
+       }, {
+               "full_name": "test_prog$Race$base_strength="
+       }, {
+               "full_name": "test_prog$Race$_base_endurance"
+       }, {
+               "full_name": "test_prog$Race$base_endurance"
+       }, {
+               "full_name": "test_prog$Race$base_endurance="
+       }, {
+               "full_name": "test_prog$Race$_base_intelligence"
+       }, {
+               "full_name": "test_prog$Race$base_intelligence"
+       }, {
+               "full_name": "test_prog$Race$base_intelligence="
+       }],
+       "redef_mpropdefs": [{
+               "full_name": "test_prog$Race$Object::init"
+       }]
+}
+{
+       "name": "Human",
+       "class_name": "MClassDef",
+       "full_name": "test_prog$Human",
+       "mdoc": {
+               "content": "Humans are able to do everithing.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 48,
+                       "line_start": 47,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 56,
+               "line_start": 47,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mclass": {
+               "full_name": "test_prog::Human"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Human$Object::init"
+       }],
+       "intro_mproperties": [],
+       "intro": {
+               "full_name": "test_prog$Human"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [],
+       "redef_mpropdefs": [{
+               "full_name": "test_prog$Human$Object::init"
+       }]
+}
+{
+       "name": "Dwarf",
+       "class_name": "MClassDef",
+       "full_name": "test_prog$Dwarf",
+       "mdoc": {
+               "content": "Dwarves make strong warriors.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 59,
+                       "line_start": 58,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 67,
+               "line_start": 58,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mclass": {
+               "full_name": "test_prog::Dwarf"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Dwarf$Object::init"
+       }],
+       "intro_mproperties": [],
+       "intro": {
+               "full_name": "test_prog$Dwarf"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [],
+       "redef_mpropdefs": [{
+               "full_name": "test_prog$Dwarf$Object::init"
+       }]
+}
+{
+       "name": "Dwarf",
+       "class_name": "MClassDef",
+       "full_name": "test_prog::combat$Dwarf",
+       "mdoc": {
+               "content": "Dwarves can be used as weapons.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 62,
+                       "line_start": 61,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["redef", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 67,
+               "line_start": 61,
+               "file": "test_location"
+       },
+       "is_intro": false,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::combat"
+       },
+       "mclass": {
+               "full_name": "test_prog::Dwarf"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog::combat$Dwarf$Weapon::dps"
+       }],
+       "intro_mproperties": [],
+       "intro": {
+               "full_name": "test_prog$Dwarf"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [],
+       "redef_mpropdefs": [{
+               "full_name": "test_prog::combat$Dwarf$Weapon::dps"
+       }]
+}
+{
+       "name": "Elf",
+       "class_name": "MClassDef",
+       "full_name": "test_prog$Elf",
+       "mdoc": {
+               "content": "Elves make good magicians.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 70,
+                       "line_start": 69,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 78,
+               "line_start": 69,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mclass": {
+               "full_name": "test_prog::Elf"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Elf$Object::init"
+       }],
+       "intro_mproperties": [],
+       "intro": {
+               "full_name": "test_prog$Elf"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [],
+       "redef_mpropdefs": [{
+               "full_name": "test_prog$Elf$Object::init"
+       }]
+}
+{
+       "name": "Character",
+       "class_name": "MClassDef",
+       "full_name": "test_prog$Character",
+       "mdoc": {
+               "content": "Characters can be played by both the human or the machine.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 22,
+                       "line_start": 21,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 68,
+               "line_start": 21,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$_race"
+       }, {
+               "full_name": "test_prog$Character$race"
+       }, {
+               "full_name": "test_prog$Character$race="
+       }, {
+               "full_name": "test_prog$Character$_career"
+       }, {
+               "full_name": "test_prog$Character$career"
+       }, {
+               "full_name": "test_prog$Character$career="
+       }, {
+               "full_name": "test_prog$Character$quit"
+       }, {
+               "full_name": "test_prog$Character$_name"
+       }, {
+               "full_name": "test_prog$Character$name"
+       }, {
+               "full_name": "test_prog$Character$name="
+       }, {
+               "full_name": "test_prog$Character$_age"
+       }, {
+               "full_name": "test_prog$Character$age"
+       }, {
+               "full_name": "test_prog$Character$age="
+       }, {
+               "full_name": "test_prog$Character$_sex"
+       }, {
+               "full_name": "test_prog$Character$sex"
+       }, {
+               "full_name": "test_prog$Character$sex="
+       }, {
+               "full_name": "test_prog$Character$total_strengh"
+       }, {
+               "full_name": "test_prog$Character$total_endurance"
+       }, {
+               "full_name": "test_prog$Character$total_intelligence"
+       }, {
+               "full_name": "test_prog$Character$max_health"
+       }, {
+               "full_name": "test_prog$Character$_health"
+       }, {
+               "full_name": "test_prog$Character$health"
+       }, {
+               "full_name": "test_prog$Character$health="
+       }, {
+               "full_name": "test_prog$Character$Object::init"
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::character::Character::_race"
+       }, {
+               "full_name": "test_prog::Character::race"
+       }, {
+               "full_name": "test_prog::Character::race="
+       }, {
+               "full_name": "test_prog::character::Character::_career"
+       }, {
+               "full_name": "test_prog::Character::career"
+       }, {
+               "full_name": "test_prog::Character::career="
+       }, {
+               "full_name": "test_prog::Character::quit"
+       }, {
+               "full_name": "test_prog::character::Character::_name"
+       }, {
+               "full_name": "test_prog::Character::name"
+       }, {
+               "full_name": "test_prog::Character::name="
+       }, {
+               "full_name": "test_prog::character::Character::_age"
+       }, {
+               "full_name": "test_prog::Character::age"
+       }, {
+               "full_name": "test_prog::Character::age="
+       }, {
+               "full_name": "test_prog::character::Character::_sex"
+       }, {
+               "full_name": "test_prog::Character::sex"
+       }, {
+               "full_name": "test_prog::Character::sex="
+       }, {
+               "full_name": "test_prog::Character::total_strengh"
+       }, {
+               "full_name": "test_prog::Character::total_endurance"
+       }, {
+               "full_name": "test_prog::Character::total_intelligence"
+       }, {
+               "full_name": "test_prog::Character::max_health"
+       }, {
+               "full_name": "test_prog::character::Character::_health"
+       }, {
+               "full_name": "test_prog::Character::health"
+       }, {
+               "full_name": "test_prog::Character::health="
+       }],
+       "intro": {
+               "full_name": "test_prog$Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [{
+               "full_name": "test_prog$Character$_race"
+       }, {
+               "full_name": "test_prog$Character$race"
+       }, {
+               "full_name": "test_prog$Character$race="
+       }, {
+               "full_name": "test_prog$Character$_career"
+       }, {
+               "full_name": "test_prog$Character$career"
+       }, {
+               "full_name": "test_prog$Character$career="
+       }, {
+               "full_name": "test_prog$Character$quit"
+       }, {
+               "full_name": "test_prog$Character$_name"
+       }, {
+               "full_name": "test_prog$Character$name"
+       }, {
+               "full_name": "test_prog$Character$name="
+       }, {
+               "full_name": "test_prog$Character$_age"
+       }, {
+               "full_name": "test_prog$Character$age"
+       }, {
+               "full_name": "test_prog$Character$age="
+       }, {
+               "full_name": "test_prog$Character$_sex"
+       }, {
+               "full_name": "test_prog$Character$sex"
+       }, {
+               "full_name": "test_prog$Character$sex="
+       }, {
+               "full_name": "test_prog$Character$total_strengh"
+       }, {
+               "full_name": "test_prog$Character$total_endurance"
+       }, {
+               "full_name": "test_prog$Character$total_intelligence"
+       }, {
+               "full_name": "test_prog$Character$max_health"
+       }, {
+               "full_name": "test_prog$Character$_health"
+       }, {
+               "full_name": "test_prog$Character$health"
+       }, {
+               "full_name": "test_prog$Character$health="
+       }],
+       "redef_mpropdefs": [{
+               "full_name": "test_prog$Character$Object::init"
+       }]
+}
+{
+       "name": "Character",
+       "class_name": "MClassDef",
+       "full_name": "test_prog::combat$Character",
+       "mdoc": {
+               "content": "Characters are now `Comabatable`",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 54,
+                       "line_start": 53,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["redef", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 59,
+               "line_start": 53,
+               "file": "test_location"
+       },
+       "is_intro": false,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::combat"
+       },
+       "mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog::combat$Character$Combatable::hit_points"
+       }],
+       "intro_mproperties": [],
+       "intro": {
+               "full_name": "test_prog$Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [],
+       "redef_mpropdefs": [{
+               "full_name": "test_prog::combat$Character$Combatable::hit_points"
+       }]
+}
+{
+       "name": "Weapon",
+       "class_name": "MClassDef",
+       "full_name": "test_prog$Weapon",
+       "mdoc": {
+               "content": "Something that can be used to attack someone and inflict damage.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 21,
+                       "line_start": 20,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "interface"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 24,
+               "line_start": 20,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::combat"
+       },
+       "mclass": {
+               "full_name": "test_prog::Weapon"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Weapon$dps"
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::Weapon::dps"
+       }],
+       "intro": {
+               "full_name": "test_prog$Weapon"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [{
+               "full_name": "test_prog$Weapon$dps"
+       }],
+       "redef_mpropdefs": []
+}
+{
+       "name": "Combatable",
+       "class_name": "MClassDef",
+       "full_name": "test_prog$Combatable",
+       "mdoc": {
+               "content": "Something that can be combatted, it can `attack` and `defend`.\n\nWorld items can also be `Combatable`.\n`defend` method is then used to determines how the object react to an attack\nSome magical items can even `attack`.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 31,
+                       "line_start": 26,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "interface"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 51,
+               "line_start": 26,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::combat"
+       },
+       "mclass": {
+               "full_name": "test_prog::Combatable"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Combatable$hit_points"
+       }, {
+               "full_name": "test_prog$Combatable$attack"
+       }, {
+               "full_name": "test_prog$Combatable$direct_attack"
+       }, {
+               "full_name": "test_prog$Combatable$defend"
+       }, {
+               "full_name": "test_prog$Combatable$is_dead"
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::Combatable::hit_points"
+       }, {
+               "full_name": "test_prog::Combatable::attack"
+       }, {
+               "full_name": "test_prog::Combatable::direct_attack"
+       }, {
+               "full_name": "test_prog::Combatable::defend"
+       }, {
+               "full_name": "test_prog::Combatable::is_dead"
+       }],
+       "intro": {
+               "full_name": "test_prog$Combatable"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [{
+               "full_name": "test_prog$Combatable$hit_points"
+       }, {
+               "full_name": "test_prog$Combatable$attack"
+       }, {
+               "full_name": "test_prog$Combatable$direct_attack"
+       }, {
+               "full_name": "test_prog$Combatable$defend"
+       }, {
+               "full_name": "test_prog$Combatable$is_dead"
+       }],
+       "redef_mpropdefs": []
+}
+{
+       "name": "Game",
+       "class_name": "MClassDef",
+       "full_name": "test_prog$Game",
+       "mdoc": {
+               "content": "This is the interface you have to implement to use ure gaming platform.\n\nsee http://our.platform.com",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 23,
+                       "line_start": 20,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "interface"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 45,
+               "line_start": 20,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::game"
+       },
+       "mclass": {
+               "full_name": "test_prog::Game"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Game$player_characters"
+       }, {
+               "full_name": "test_prog$Game$computer_characters"
+       }, {
+               "full_name": "test_prog$Game$start_game"
+       }, {
+               "full_name": "test_prog$Game$pause_game"
+       }, {
+               "full_name": "test_prog$Game$stop_game"
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::Game::player_characters"
+       }, {
+               "full_name": "test_prog::Game::computer_characters"
+       }, {
+               "full_name": "test_prog::Game::start_game"
+       }, {
+               "full_name": "test_prog::Game::pause_game"
+       }, {
+               "full_name": "test_prog::Game::stop_game"
+       }],
+       "intro": {
+               "full_name": "test_prog$Game"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [{
+               "full_name": "test_prog$Game$player_characters"
+       }, {
+               "full_name": "test_prog$Game$computer_characters"
+       }, {
+               "full_name": "test_prog$Game$start_game"
+       }, {
+               "full_name": "test_prog$Game$pause_game"
+       }, {
+               "full_name": "test_prog$Game$stop_game"
+       }],
+       "redef_mpropdefs": []
+}
+{
+       "name": "Starter",
+       "class_name": "MClassDef",
+       "full_name": "test_prog$Starter",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 23,
+               "line_start": 21,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::test_prog"
+       },
+       "mclass": {
+               "full_name": "test_prog::Starter"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Starter$start"
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::Starter::start"
+       }],
+       "intro": {
+               "full_name": "test_prog$Starter"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [{
+               "full_name": "test_prog$Starter$start"
+       }],
+       "redef_mpropdefs": []
+}
+{
+       "name": "Sys",
+       "class_name": "MClassDef",
+       "full_name": "test_prog$Sys",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 13,
+               "column_start": 1,
+               "line_end": 26,
+               "line_start": 25,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mparameters": [],
+       "mmodule": {
+               "full_name": "test_prog::test_prog"
+       },
+       "mclass": {
+               "full_name": "test_prog::Sys"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Sys$main"
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::Sys::main"
+       }],
+       "intro": {
+               "full_name": "test_prog$Sys"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "intro_mpropdefs": [{
+               "full_name": "test_prog$Sys$main"
+       }],
+       "redef_mpropdefs": []
+}
diff --git a/src/model/test_model_json.sav/test_classes_to_full_json.res b/src/model/test_model_json.sav/test_classes_to_full_json.res
new file mode 100644 (file)
index 0000000..2fc7104
--- /dev/null
@@ -0,0 +1,1428 @@
+{
+       "name": "Object",
+       "class_name": "MClass",
+       "full_name": "test_prog::Object",
+       "mdoc": {
+               "content": "Root of everything.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 21,
+                       "line_start": 20,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "interface"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 30,
+               "line_start": 20,
+               "file": "test_location"
+       },
+       "mparameters": [],
+       "intro": {
+               "full_name": "test_prog$Object"
+       },
+       "intro_mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mclassdefs": [{
+               "full_name": "test_prog$Object"
+       }],
+       "all_mproperties": [{
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }, {
+               "full_name": "test_prog::Object::init"
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }, {
+               "full_name": "test_prog::Object::init"
+       }],
+       "redef_mproperties": [],
+       "parents": []
+}
+{
+       "name": "Int",
+       "class_name": "MClass",
+       "full_name": "test_prog::Int",
+       "mdoc": {
+               "content": "Some services about Integers.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 33,
+                       "line_start": 32,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 41,
+               "line_start": 32,
+               "file": "test_location"
+       },
+       "mparameters": [],
+       "intro": {
+               "full_name": "test_prog$Int"
+       },
+       "intro_mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mclassdefs": [{
+               "full_name": "test_prog$Int"
+       }],
+       "all_mproperties": [{
+               "full_name": "test_prog::Int::unary -"
+       }, {
+               "full_name": "test_prog::Int::+"
+       }, {
+               "full_name": "test_prog::Int::-"
+       }, {
+               "full_name": "test_prog::Int::*"
+       }, {
+               "full_name": "test_prog::Int::/"
+       }, {
+               "full_name": "test_prog::Int::>"
+       }, {
+               "full_name": "test_prog::Int::to_f"
+       }, {
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }, {
+               "full_name": "test_prog::Object::init"
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::Int::unary -"
+       }, {
+               "full_name": "test_prog::Int::+"
+       }, {
+               "full_name": "test_prog::Int::-"
+       }, {
+               "full_name": "test_prog::Int::*"
+       }, {
+               "full_name": "test_prog::Int::/"
+       }, {
+               "full_name": "test_prog::Int::>"
+       }, {
+               "full_name": "test_prog::Int::to_f"
+       }],
+       "redef_mproperties": [],
+       "parents": [{
+               "full_name": "test_prog::Object"
+       }]
+}
+{
+       "name": "Float",
+       "class_name": "MClass",
+       "full_name": "test_prog::Float",
+       "mdoc": {
+               "content": "Some services about Floats.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 44,
+                       "line_start": 43,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 50,
+               "line_start": 43,
+               "file": "test_location"
+       },
+       "mparameters": [],
+       "intro": {
+               "full_name": "test_prog$Float"
+       },
+       "intro_mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mclassdefs": [{
+               "full_name": "test_prog$Float"
+       }],
+       "all_mproperties": [{
+               "full_name": "test_prog::Float::+"
+       }, {
+               "full_name": "test_prog::Float::-"
+       }, {
+               "full_name": "test_prog::Float::*"
+       }, {
+               "full_name": "test_prog::Float::/"
+       }, {
+               "full_name": "test_prog::Float::>"
+       }, {
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }, {
+               "full_name": "test_prog::Object::init"
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::Float::+"
+       }, {
+               "full_name": "test_prog::Float::-"
+       }, {
+               "full_name": "test_prog::Float::*"
+       }, {
+               "full_name": "test_prog::Float::/"
+       }, {
+               "full_name": "test_prog::Float::>"
+       }],
+       "redef_mproperties": [],
+       "parents": [{
+               "full_name": "test_prog::Object"
+       }]
+}
+{
+       "name": "Bool",
+       "class_name": "MClass",
+       "full_name": "test_prog::Bool",
+       "mdoc": {
+               "content": "Booleans, `true` or `false`.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 53,
+                       "line_start": 52,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 14,
+               "column_start": 1,
+               "line_end": 53,
+               "line_start": 52,
+               "file": "test_location"
+       },
+       "mparameters": [],
+       "intro": {
+               "full_name": "test_prog$Bool"
+       },
+       "intro_mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mclassdefs": [{
+               "full_name": "test_prog$Bool"
+       }],
+       "all_mproperties": [{
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }, {
+               "full_name": "test_prog::Object::init"
+       }],
+       "intro_mproperties": [],
+       "redef_mproperties": [],
+       "parents": [{
+               "full_name": "test_prog::Object"
+       }]
+}
+{
+       "name": "String",
+       "class_name": "MClass",
+       "full_name": "test_prog::String",
+       "mdoc": {
+               "content": "Strings (there is no chars...).",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 56,
+                       "line_start": 55,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 16,
+               "column_start": 1,
+               "line_end": 56,
+               "line_start": 55,
+               "file": "test_location"
+       },
+       "mparameters": [],
+       "intro": {
+               "full_name": "test_prog$String"
+       },
+       "intro_mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mclassdefs": [{
+               "full_name": "test_prog$String"
+       }],
+       "all_mproperties": [{
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }, {
+               "full_name": "test_prog::Object::init"
+       }],
+       "intro_mproperties": [],
+       "redef_mproperties": [],
+       "parents": [{
+               "full_name": "test_prog::Object"
+       }]
+}
+{
+       "name": "List",
+       "class_name": "MClass",
+       "full_name": "test_prog::List",
+       "mdoc": {
+               "content": "List of things.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 59,
+                       "line_start": 58,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 17,
+               "column_start": 1,
+               "line_end": 59,
+               "line_start": 58,
+               "file": "test_location"
+       },
+       "mparameters": [{
+               "name": "E",
+               "rank": 0,
+               "mtype": {
+                       "full_name": "nullable test_prog::Object"
+               }
+       }],
+       "intro": {
+               "full_name": "test_prog$List"
+       },
+       "intro_mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mclassdefs": [{
+               "full_name": "test_prog$List"
+       }],
+       "all_mproperties": [{
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }, {
+               "full_name": "test_prog::Object::init"
+       }],
+       "intro_mproperties": [],
+       "redef_mproperties": [],
+       "parents": [{
+               "full_name": "test_prog::Object"
+       }]
+}
+{
+       "name": "Career",
+       "class_name": "MClass",
+       "full_name": "test_prog::Career",
+       "mdoc": {
+               "content": "A `Career` gives a characteristic bonus or malus to the character.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 30,
+                       "line_start": 29,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 36,
+               "line_start": 29,
+               "file": "test_location"
+       },
+       "mparameters": [],
+       "intro": {
+               "full_name": "test_prog$Career"
+       },
+       "intro_mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mclassdefs": [{
+               "full_name": "test_prog$Career"
+       }],
+       "all_mproperties": [{
+               "full_name": "test_prog::careers::Career::_strength_bonus"
+       }, {
+               "full_name": "test_prog::Career::strength_bonus"
+       }, {
+               "full_name": "test_prog::Career::strength_bonus="
+       }, {
+               "full_name": "test_prog::careers::Career::_endurance_bonus"
+       }, {
+               "full_name": "test_prog::Career::endurance_bonus"
+       }, {
+               "full_name": "test_prog::Career::endurance_bonus="
+       }, {
+               "full_name": "test_prog::careers::Career::_intelligence_bonus"
+       }, {
+               "full_name": "test_prog::Career::intelligence_bonus"
+       }, {
+               "full_name": "test_prog::Career::intelligence_bonus="
+       }, {
+               "full_name": "test_prog::Object::init"
+       }, {
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::careers::Career::_strength_bonus"
+       }, {
+               "full_name": "test_prog::Career::strength_bonus"
+       }, {
+               "full_name": "test_prog::Career::strength_bonus="
+       }, {
+               "full_name": "test_prog::careers::Career::_endurance_bonus"
+       }, {
+               "full_name": "test_prog::Career::endurance_bonus"
+       }, {
+               "full_name": "test_prog::Career::endurance_bonus="
+       }, {
+               "full_name": "test_prog::careers::Career::_intelligence_bonus"
+       }, {
+               "full_name": "test_prog::Career::intelligence_bonus"
+       }, {
+               "full_name": "test_prog::Career::intelligence_bonus="
+       }],
+       "redef_mproperties": [{
+               "full_name": "test_prog::Object::init"
+       }],
+       "parents": [{
+               "full_name": "test_prog::Object"
+       }]
+}
+{
+       "name": "Warrior",
+       "class_name": "MClass",
+       "full_name": "test_prog::Warrior",
+       "mdoc": {
+               "content": "Warriors are good for fighting.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 39,
+                       "line_start": 38,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 47,
+               "line_start": 38,
+               "file": "test_location"
+       },
+       "mparameters": [],
+       "intro": {
+               "full_name": "test_prog$Warrior"
+       },
+       "intro_mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mclassdefs": [{
+               "full_name": "test_prog$Warrior"
+       }],
+       "all_mproperties": [{
+               "full_name": "test_prog::Object::init"
+       }, {
+               "full_name": "test_prog::careers::Career::_strength_bonus"
+       }, {
+               "full_name": "test_prog::Career::strength_bonus"
+       }, {
+               "full_name": "test_prog::Career::strength_bonus="
+       }, {
+               "full_name": "test_prog::careers::Career::_endurance_bonus"
+       }, {
+               "full_name": "test_prog::Career::endurance_bonus"
+       }, {
+               "full_name": "test_prog::Career::endurance_bonus="
+       }, {
+               "full_name": "test_prog::careers::Career::_intelligence_bonus"
+       }, {
+               "full_name": "test_prog::Career::intelligence_bonus"
+       }, {
+               "full_name": "test_prog::Career::intelligence_bonus="
+       }, {
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }],
+       "intro_mproperties": [],
+       "redef_mproperties": [{
+               "full_name": "test_prog::Object::init"
+       }],
+       "parents": [{
+               "full_name": "test_prog::Career"
+       }]
+}
+{
+       "name": "Magician",
+       "class_name": "MClass",
+       "full_name": "test_prog::Magician",
+       "mdoc": {
+               "content": "Magicians know magic and how to use it.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 50,
+                       "line_start": 49,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 58,
+               "line_start": 49,
+               "file": "test_location"
+       },
+       "mparameters": [],
+       "intro": {
+               "full_name": "test_prog$Magician"
+       },
+       "intro_mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mclassdefs": [{
+               "full_name": "test_prog$Magician"
+       }],
+       "all_mproperties": [{
+               "full_name": "test_prog::Object::init"
+       }, {
+               "full_name": "test_prog::careers::Career::_strength_bonus"
+       }, {
+               "full_name": "test_prog::Career::strength_bonus"
+       }, {
+               "full_name": "test_prog::Career::strength_bonus="
+       }, {
+               "full_name": "test_prog::careers::Career::_endurance_bonus"
+       }, {
+               "full_name": "test_prog::Career::endurance_bonus"
+       }, {
+               "full_name": "test_prog::Career::endurance_bonus="
+       }, {
+               "full_name": "test_prog::careers::Career::_intelligence_bonus"
+       }, {
+               "full_name": "test_prog::Career::intelligence_bonus"
+       }, {
+               "full_name": "test_prog::Career::intelligence_bonus="
+       }, {
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }],
+       "intro_mproperties": [],
+       "redef_mproperties": [{
+               "full_name": "test_prog::Object::init"
+       }],
+       "parents": [{
+               "full_name": "test_prog::Career"
+       }]
+}
+{
+       "name": "Alcoholic",
+       "class_name": "MClass",
+       "full_name": "test_prog::Alcoholic",
+       "mdoc": {
+               "content": "Alcoholics are good to nothing escept taking punches.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 61,
+                       "line_start": 60,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 69,
+               "line_start": 60,
+               "file": "test_location"
+       },
+       "mparameters": [],
+       "intro": {
+               "full_name": "test_prog$Alcoholic"
+       },
+       "intro_mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mclassdefs": [{
+               "full_name": "test_prog$Alcoholic"
+       }],
+       "all_mproperties": [{
+               "full_name": "test_prog::Object::init"
+       }, {
+               "full_name": "test_prog::careers::Career::_strength_bonus"
+       }, {
+               "full_name": "test_prog::Career::strength_bonus"
+       }, {
+               "full_name": "test_prog::Career::strength_bonus="
+       }, {
+               "full_name": "test_prog::careers::Career::_endurance_bonus"
+       }, {
+               "full_name": "test_prog::Career::endurance_bonus"
+       }, {
+               "full_name": "test_prog::Career::endurance_bonus="
+       }, {
+               "full_name": "test_prog::careers::Career::_intelligence_bonus"
+       }, {
+               "full_name": "test_prog::Career::intelligence_bonus"
+       }, {
+               "full_name": "test_prog::Career::intelligence_bonus="
+       }, {
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }],
+       "intro_mproperties": [],
+       "redef_mproperties": [{
+               "full_name": "test_prog::Object::init"
+       }],
+       "parents": [{
+               "full_name": "test_prog::Career"
+       }]
+}
+{
+       "name": "Race",
+       "class_name": "MClass",
+       "full_name": "test_prog::Race",
+       "mdoc": {
+               "content": "Race determines basic characteristics and what the character will be able to do in life.\n\nThese are base characteristics, they cannot be changed\nbut you can add new ones if needed using refinement.\nObjects and spells cannot change those characteristics.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 33,
+                       "line_start": 28,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 45,
+               "line_start": 28,
+               "file": "test_location"
+       },
+       "mparameters": [],
+       "intro": {
+               "full_name": "test_prog$Race"
+       },
+       "intro_mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mclassdefs": [{
+               "full_name": "test_prog$Race"
+       }],
+       "all_mproperties": [{
+               "full_name": "test_prog::races::Race::_base_strength"
+       }, {
+               "full_name": "test_prog::Race::base_strength"
+       }, {
+               "full_name": "test_prog::Race::base_strength="
+       }, {
+               "full_name": "test_prog::races::Race::_base_endurance"
+       }, {
+               "full_name": "test_prog::Race::base_endurance"
+       }, {
+               "full_name": "test_prog::Race::base_endurance="
+       }, {
+               "full_name": "test_prog::races::Race::_base_intelligence"
+       }, {
+               "full_name": "test_prog::Race::base_intelligence"
+       }, {
+               "full_name": "test_prog::Race::base_intelligence="
+       }, {
+               "full_name": "test_prog::Object::init"
+       }, {
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::races::Race::_base_strength"
+       }, {
+               "full_name": "test_prog::Race::base_strength"
+       }, {
+               "full_name": "test_prog::Race::base_strength="
+       }, {
+               "full_name": "test_prog::races::Race::_base_endurance"
+       }, {
+               "full_name": "test_prog::Race::base_endurance"
+       }, {
+               "full_name": "test_prog::Race::base_endurance="
+       }, {
+               "full_name": "test_prog::races::Race::_base_intelligence"
+       }, {
+               "full_name": "test_prog::Race::base_intelligence"
+       }, {
+               "full_name": "test_prog::Race::base_intelligence="
+       }],
+       "redef_mproperties": [{
+               "full_name": "test_prog::Object::init"
+       }],
+       "parents": [{
+               "full_name": "test_prog::Object"
+       }]
+}
+{
+       "name": "Human",
+       "class_name": "MClass",
+       "full_name": "test_prog::Human",
+       "mdoc": {
+               "content": "Humans are able to do everithing.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 48,
+                       "line_start": 47,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 56,
+               "line_start": 47,
+               "file": "test_location"
+       },
+       "mparameters": [],
+       "intro": {
+               "full_name": "test_prog$Human"
+       },
+       "intro_mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mclassdefs": [{
+               "full_name": "test_prog$Human"
+       }],
+       "all_mproperties": [{
+               "full_name": "test_prog::Object::init"
+       }, {
+               "full_name": "test_prog::races::Race::_base_strength"
+       }, {
+               "full_name": "test_prog::Race::base_strength"
+       }, {
+               "full_name": "test_prog::Race::base_strength="
+       }, {
+               "full_name": "test_prog::races::Race::_base_endurance"
+       }, {
+               "full_name": "test_prog::Race::base_endurance"
+       }, {
+               "full_name": "test_prog::Race::base_endurance="
+       }, {
+               "full_name": "test_prog::races::Race::_base_intelligence"
+       }, {
+               "full_name": "test_prog::Race::base_intelligence"
+       }, {
+               "full_name": "test_prog::Race::base_intelligence="
+       }, {
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }],
+       "intro_mproperties": [],
+       "redef_mproperties": [{
+               "full_name": "test_prog::Object::init"
+       }],
+       "parents": [{
+               "full_name": "test_prog::Race"
+       }]
+}
+{
+       "name": "Dwarf",
+       "class_name": "MClass",
+       "full_name": "test_prog::Dwarf",
+       "mdoc": {
+               "content": "Dwarves make strong warriors.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 59,
+                       "line_start": 58,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 67,
+               "line_start": 58,
+               "file": "test_location"
+       },
+       "mparameters": [],
+       "intro": {
+               "full_name": "test_prog$Dwarf"
+       },
+       "intro_mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mclassdefs": [{
+               "full_name": "test_prog$Dwarf"
+       }, {
+               "full_name": "test_prog::combat$Dwarf"
+       }],
+       "all_mproperties": [{
+               "full_name": "test_prog::Object::init"
+       }, {
+               "full_name": "test_prog::Weapon::dps"
+       }, {
+               "full_name": "test_prog::races::Race::_base_strength"
+       }, {
+               "full_name": "test_prog::Race::base_strength"
+       }, {
+               "full_name": "test_prog::Race::base_strength="
+       }, {
+               "full_name": "test_prog::races::Race::_base_endurance"
+       }, {
+               "full_name": "test_prog::Race::base_endurance"
+       }, {
+               "full_name": "test_prog::Race::base_endurance="
+       }, {
+               "full_name": "test_prog::races::Race::_base_intelligence"
+       }, {
+               "full_name": "test_prog::Race::base_intelligence"
+       }, {
+               "full_name": "test_prog::Race::base_intelligence="
+       }, {
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }],
+       "intro_mproperties": [],
+       "redef_mproperties": [{
+               "full_name": "test_prog::Object::init"
+       }, {
+               "full_name": "test_prog::Weapon::dps"
+       }],
+       "parents": [{
+               "full_name": "test_prog::Race"
+       }, {
+               "full_name": "test_prog::Weapon"
+       }]
+}
+{
+       "name": "Elf",
+       "class_name": "MClass",
+       "full_name": "test_prog::Elf",
+       "mdoc": {
+               "content": "Elves make good magicians.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 70,
+                       "line_start": 69,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 78,
+               "line_start": 69,
+               "file": "test_location"
+       },
+       "mparameters": [],
+       "intro": {
+               "full_name": "test_prog$Elf"
+       },
+       "intro_mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mclassdefs": [{
+               "full_name": "test_prog$Elf"
+       }],
+       "all_mproperties": [{
+               "full_name": "test_prog::Object::init"
+       }, {
+               "full_name": "test_prog::races::Race::_base_strength"
+       }, {
+               "full_name": "test_prog::Race::base_strength"
+       }, {
+               "full_name": "test_prog::Race::base_strength="
+       }, {
+               "full_name": "test_prog::races::Race::_base_endurance"
+       }, {
+               "full_name": "test_prog::Race::base_endurance"
+       }, {
+               "full_name": "test_prog::Race::base_endurance="
+       }, {
+               "full_name": "test_prog::races::Race::_base_intelligence"
+       }, {
+               "full_name": "test_prog::Race::base_intelligence"
+       }, {
+               "full_name": "test_prog::Race::base_intelligence="
+       }, {
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }],
+       "intro_mproperties": [],
+       "redef_mproperties": [{
+               "full_name": "test_prog::Object::init"
+       }],
+       "parents": [{
+               "full_name": "test_prog::Race"
+       }]
+}
+{
+       "name": "Character",
+       "class_name": "MClass",
+       "full_name": "test_prog::Character",
+       "mdoc": {
+               "content": "Characters can be played by both the human or the machine.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 22,
+                       "line_start": 21,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 68,
+               "line_start": 21,
+               "file": "test_location"
+       },
+       "mparameters": [],
+       "intro": {
+               "full_name": "test_prog$Character"
+       },
+       "intro_mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mclassdefs": [{
+               "full_name": "test_prog$Character"
+       }, {
+               "full_name": "test_prog::combat$Character"
+       }],
+       "all_mproperties": [{
+               "full_name": "test_prog::character::Character::_race"
+       }, {
+               "full_name": "test_prog::Character::race"
+       }, {
+               "full_name": "test_prog::Character::race="
+       }, {
+               "full_name": "test_prog::character::Character::_career"
+       }, {
+               "full_name": "test_prog::Character::career"
+       }, {
+               "full_name": "test_prog::Character::career="
+       }, {
+               "full_name": "test_prog::Character::quit"
+       }, {
+               "full_name": "test_prog::character::Character::_name"
+       }, {
+               "full_name": "test_prog::Character::name"
+       }, {
+               "full_name": "test_prog::Character::name="
+       }, {
+               "full_name": "test_prog::character::Character::_age"
+       }, {
+               "full_name": "test_prog::Character::age"
+       }, {
+               "full_name": "test_prog::Character::age="
+       }, {
+               "full_name": "test_prog::character::Character::_sex"
+       }, {
+               "full_name": "test_prog::Character::sex"
+       }, {
+               "full_name": "test_prog::Character::sex="
+       }, {
+               "full_name": "test_prog::Character::total_strengh"
+       }, {
+               "full_name": "test_prog::Character::total_endurance"
+       }, {
+               "full_name": "test_prog::Character::total_intelligence"
+       }, {
+               "full_name": "test_prog::Character::max_health"
+       }, {
+               "full_name": "test_prog::character::Character::_health"
+       }, {
+               "full_name": "test_prog::Character::health"
+       }, {
+               "full_name": "test_prog::Character::health="
+       }, {
+               "full_name": "test_prog::Object::init"
+       }, {
+               "full_name": "test_prog::Combatable::hit_points"
+       }, {
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }, {
+               "full_name": "test_prog::Combatable::attack"
+       }, {
+               "full_name": "test_prog::Combatable::direct_attack"
+       }, {
+               "full_name": "test_prog::Combatable::defend"
+       }, {
+               "full_name": "test_prog::Combatable::is_dead"
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::character::Character::_race"
+       }, {
+               "full_name": "test_prog::Character::race"
+       }, {
+               "full_name": "test_prog::Character::race="
+       }, {
+               "full_name": "test_prog::character::Character::_career"
+       }, {
+               "full_name": "test_prog::Character::career"
+       }, {
+               "full_name": "test_prog::Character::career="
+       }, {
+               "full_name": "test_prog::Character::quit"
+       }, {
+               "full_name": "test_prog::character::Character::_name"
+       }, {
+               "full_name": "test_prog::Character::name"
+       }, {
+               "full_name": "test_prog::Character::name="
+       }, {
+               "full_name": "test_prog::character::Character::_age"
+       }, {
+               "full_name": "test_prog::Character::age"
+       }, {
+               "full_name": "test_prog::Character::age="
+       }, {
+               "full_name": "test_prog::character::Character::_sex"
+       }, {
+               "full_name": "test_prog::Character::sex"
+       }, {
+               "full_name": "test_prog::Character::sex="
+       }, {
+               "full_name": "test_prog::Character::total_strengh"
+       }, {
+               "full_name": "test_prog::Character::total_endurance"
+       }, {
+               "full_name": "test_prog::Character::total_intelligence"
+       }, {
+               "full_name": "test_prog::Character::max_health"
+       }, {
+               "full_name": "test_prog::character::Character::_health"
+       }, {
+               "full_name": "test_prog::Character::health"
+       }, {
+               "full_name": "test_prog::Character::health="
+       }],
+       "redef_mproperties": [{
+               "full_name": "test_prog::Object::init"
+       }, {
+               "full_name": "test_prog::Combatable::hit_points"
+       }],
+       "parents": [{
+               "full_name": "test_prog::Object"
+       }, {
+               "full_name": "test_prog::Combatable"
+       }]
+}
+{
+       "name": "Weapon",
+       "class_name": "MClass",
+       "full_name": "test_prog::Weapon",
+       "mdoc": {
+               "content": "Something that can be used to attack someone and inflict damage.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 21,
+                       "line_start": 20,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "interface"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 24,
+               "line_start": 20,
+               "file": "test_location"
+       },
+       "mparameters": [],
+       "intro": {
+               "full_name": "test_prog$Weapon"
+       },
+       "intro_mmodule": {
+               "full_name": "test_prog::combat"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mclassdefs": [{
+               "full_name": "test_prog$Weapon"
+       }],
+       "all_mproperties": [{
+               "full_name": "test_prog::Weapon::dps"
+       }, {
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }, {
+               "full_name": "test_prog::Object::init"
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::Weapon::dps"
+       }],
+       "redef_mproperties": [],
+       "parents": [{
+               "full_name": "test_prog::Object"
+       }]
+}
+{
+       "name": "Combatable",
+       "class_name": "MClass",
+       "full_name": "test_prog::Combatable",
+       "mdoc": {
+               "content": "Something that can be combatted, it can `attack` and `defend`.\n\nWorld items can also be `Combatable`.\n`defend` method is then used to determines how the object react to an attack\nSome magical items can even `attack`.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 31,
+                       "line_start": 26,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "interface"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 51,
+               "line_start": 26,
+               "file": "test_location"
+       },
+       "mparameters": [],
+       "intro": {
+               "full_name": "test_prog$Combatable"
+       },
+       "intro_mmodule": {
+               "full_name": "test_prog::combat"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mclassdefs": [{
+               "full_name": "test_prog$Combatable"
+       }],
+       "all_mproperties": [{
+               "full_name": "test_prog::Combatable::hit_points"
+       }, {
+               "full_name": "test_prog::Combatable::attack"
+       }, {
+               "full_name": "test_prog::Combatable::direct_attack"
+       }, {
+               "full_name": "test_prog::Combatable::defend"
+       }, {
+               "full_name": "test_prog::Combatable::is_dead"
+       }, {
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }, {
+               "full_name": "test_prog::Object::init"
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::Combatable::hit_points"
+       }, {
+               "full_name": "test_prog::Combatable::attack"
+       }, {
+               "full_name": "test_prog::Combatable::direct_attack"
+       }, {
+               "full_name": "test_prog::Combatable::defend"
+       }, {
+               "full_name": "test_prog::Combatable::is_dead"
+       }],
+       "redef_mproperties": [],
+       "parents": [{
+               "full_name": "test_prog::Object"
+       }]
+}
+{
+       "name": "Game",
+       "class_name": "MClass",
+       "full_name": "test_prog::Game",
+       "mdoc": {
+               "content": "This is the interface you have to implement to use ure gaming platform.\n\nsee http://our.platform.com",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 23,
+                       "line_start": 20,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "interface"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 45,
+               "line_start": 20,
+               "file": "test_location"
+       },
+       "mparameters": [],
+       "intro": {
+               "full_name": "test_prog$Game"
+       },
+       "intro_mmodule": {
+               "full_name": "test_prog::game"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mclassdefs": [{
+               "full_name": "test_prog$Game"
+       }],
+       "all_mproperties": [{
+               "full_name": "test_prog::Game::player_characters"
+       }, {
+               "full_name": "test_prog::Game::computer_characters"
+       }, {
+               "full_name": "test_prog::Game::start_game"
+       }, {
+               "full_name": "test_prog::Game::pause_game"
+       }, {
+               "full_name": "test_prog::Game::stop_game"
+       }, {
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }, {
+               "full_name": "test_prog::Object::init"
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::Game::player_characters"
+       }, {
+               "full_name": "test_prog::Game::computer_characters"
+       }, {
+               "full_name": "test_prog::Game::start_game"
+       }, {
+               "full_name": "test_prog::Game::pause_game"
+       }, {
+               "full_name": "test_prog::Game::stop_game"
+       }],
+       "redef_mproperties": [],
+       "parents": [{
+               "full_name": "test_prog::Object"
+       }]
+}
+{
+       "name": "Starter",
+       "class_name": "MClass",
+       "full_name": "test_prog::Starter",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 23,
+               "line_start": 21,
+               "file": "test_location"
+       },
+       "mparameters": [],
+       "intro": {
+               "full_name": "test_prog$Starter"
+       },
+       "intro_mmodule": {
+               "full_name": "test_prog::test_prog"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mclassdefs": [{
+               "full_name": "test_prog$Starter"
+       }],
+       "all_mproperties": [{
+               "full_name": "test_prog::Starter::start"
+       }, {
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }, {
+               "full_name": "test_prog::Object::init"
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::Starter::start"
+       }],
+       "redef_mproperties": [],
+       "parents": [{
+               "full_name": "test_prog::Object"
+       }]
+}
+{
+       "name": "Sys",
+       "class_name": "MClass",
+       "full_name": "test_prog::Sys",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "class"],
+       "location": {
+               "column_end": 13,
+               "column_start": 1,
+               "line_end": 26,
+               "line_start": 25,
+               "file": "test_location"
+       },
+       "mparameters": [],
+       "intro": {
+               "full_name": "test_prog$Sys"
+       },
+       "intro_mmodule": {
+               "full_name": "test_prog::test_prog"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mclassdefs": [{
+               "full_name": "test_prog$Sys"
+       }],
+       "all_mproperties": [{
+               "full_name": "test_prog::Sys::main"
+       }, {
+               "full_name": "test_prog::Object::OTHER"
+       }, {
+               "full_name": "test_prog::Object::=="
+       }, {
+               "full_name": "test_prog::Object::!="
+       }, {
+               "full_name": "test_prog::Object::init"
+       }],
+       "intro_mproperties": [{
+               "full_name": "test_prog::Sys::main"
+       }],
+       "redef_mproperties": [],
+       "parents": [{
+               "full_name": "test_prog::Object"
+       }]
+}
diff --git a/src/model/test_model_json.sav/test_groups_to_full_json.res b/src/model/test_model_json.sav/test_groups_to_full_json.res
new file mode 100644 (file)
index 0000000..3e9fd9f
--- /dev/null
@@ -0,0 +1,191 @@
+{
+       "name": "test_prog",
+       "class_name": "MGroup",
+       "full_name": "test_prog>",
+       "mdoc": {
+               "content": "Test program for model tools.\n\nThis program creates a fake model that can be used to test tools like:\n\n* `nitdoc`\n* `nitmetrics`\n* `nitx`\n* or others `modelbuilder`.\n\nAn image:\n\n![Tinks3D](../../contrib/tinks/doc/tinks3d.png)",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 0,
+                       "line_end": 12,
+                       "line_start": 1,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["group"],
+       "location": {
+               "column_end": 0,
+               "column_start": 0,
+               "line_end": 0,
+               "line_start": 0,
+               "file": "test_location"
+       },
+       "is_root": true,
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "default_mmodule": {
+               "full_name": "test_prog::test_prog"
+       },
+       "parent": null,
+       "mmodules": [{
+               "full_name": "test_prog::test_prog"
+       }],
+       "mgroups": [{
+               "full_name": "test_prog>game>"
+       }, {
+               "full_name": "test_prog>platform>"
+       }, {
+               "full_name": "test_prog>rpg>"
+       }]
+}
+{
+       "name": "game",
+       "class_name": "MGroup",
+       "full_name": "test_prog>game>",
+       "mdoc": {
+               "content": "Gaming group",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 0,
+                       "line_end": 1,
+                       "line_start": 1,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["group"],
+       "location": {
+               "column_end": 0,
+               "column_start": 0,
+               "line_end": 0,
+               "line_start": 0,
+               "file": "test_location"
+       },
+       "is_root": false,
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "default_mmodule": {
+               "full_name": "test_prog::game"
+       },
+       "parent": {
+               "full_name": "test_prog>"
+       },
+       "mmodules": [{
+               "full_name": "test_prog::game"
+       }],
+       "mgroups": []
+}
+{
+       "name": "platform",
+       "class_name": "MGroup",
+       "full_name": "test_prog>platform>",
+       "mdoc": {
+               "content": "Fictive Crappy Platform.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 0,
+                       "line_end": 1,
+                       "line_start": 1,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["group"],
+       "location": {
+               "column_end": 0,
+               "column_start": 0,
+               "line_end": 0,
+               "line_start": 0,
+               "file": "test_location"
+       },
+       "is_root": false,
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "default_mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "parent": {
+               "full_name": "test_prog>"
+       },
+       "mmodules": [{
+               "full_name": "test_prog::platform"
+       }],
+       "mgroups": []
+}
+{
+       "name": "rpg",
+       "class_name": "MGroup",
+       "full_name": "test_prog>rpg>",
+       "mdoc": {
+               "content": "Role Playing Game group",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 0,
+                       "line_end": 1,
+                       "line_start": 1,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["group"],
+       "location": {
+               "column_end": 0,
+               "column_start": 0,
+               "line_end": 0,
+               "line_start": 0,
+               "file": "test_location"
+       },
+       "is_root": false,
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "default_mmodule": {
+               "full_name": "test_prog::rpg"
+       },
+       "parent": {
+               "full_name": "test_prog>"
+       },
+       "mmodules": [{
+               "full_name": "test_prog::careers"
+       }, {
+               "full_name": "test_prog::character"
+       }, {
+               "full_name": "test_prog::combat"
+       }, {
+               "full_name": "test_prog::races"
+       }, {
+               "full_name": "test_prog::rpg"
+       }],
+       "mgroups": []
+}
+{
+       "name": "excluded",
+       "class_name": "MGroup",
+       "full_name": "excluded>",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["group"],
+       "location": {
+               "column_end": 0,
+               "column_start": 0,
+               "line_end": 0,
+               "line_start": 0,
+               "file": "test_location"
+       },
+       "is_root": true,
+       "mpackage": {
+               "full_name": "excluded"
+       },
+       "default_mmodule": {
+               "full_name": "excluded::excluded"
+       },
+       "parent": null,
+       "mmodules": [{
+               "full_name": "excluded::excluded"
+       }],
+       "mgroups": []
+}
diff --git a/src/model/test_model_json.sav/test_modules_to_full_json.res b/src/model/test_model_json.sav/test_modules_to_full_json.res
new file mode 100644 (file)
index 0000000..92690d1
--- /dev/null
@@ -0,0 +1,474 @@
+{
+       "name": "excluded",
+       "class_name": "MModule",
+       "full_name": "excluded::excluded",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["module"],
+       "location": {
+               "column_end": 0,
+               "column_start": 0,
+               "line_end": 0,
+               "line_start": 0,
+               "file": "test_location"
+       },
+       "mpackage": {
+               "full_name": "excluded"
+       },
+       "mgroup": {
+               "full_name": "excluded>"
+       },
+       "intro_mclasses": [],
+       "mclassdefs": [],
+       "intro_mclassdefs": [],
+       "redef_mclassdefs": [],
+       "imports": []
+}
+{
+       "name": "game",
+       "class_name": "MModule",
+       "full_name": "test_prog::game",
+       "mdoc": {
+               "content": "A game abstraction for RPG.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 16,
+                       "line_start": 15,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["module"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 45,
+               "line_start": 15,
+               "file": "test_location"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mgroup": {
+               "full_name": "test_prog>game>"
+       },
+       "intro_mclasses": [{
+               "full_name": "test_prog::Game"
+       }],
+       "mclassdefs": [{
+               "full_name": "test_prog$Game"
+       }],
+       "intro_mclassdefs": [{
+               "full_name": "test_prog$Game"
+       }],
+       "redef_mclassdefs": [],
+       "imports": [{
+               "full_name": "test_prog::rpg"
+       }]
+}
+{
+       "name": "platform",
+       "class_name": "MModule",
+       "full_name": "test_prog::platform",
+       "mdoc": {
+               "content": "Declares base types allowed on the platform.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 16,
+                       "line_start": 15,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["module"],
+       "location": {
+               "column_end": 17,
+               "column_start": 1,
+               "line_end": 59,
+               "line_start": 15,
+               "file": "test_location"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mgroup": {
+               "full_name": "test_prog>platform>"
+       },
+       "intro_mclasses": [{
+               "full_name": "test_prog::Object"
+       }, {
+               "full_name": "test_prog::Int"
+       }, {
+               "full_name": "test_prog::Float"
+       }, {
+               "full_name": "test_prog::Bool"
+       }, {
+               "full_name": "test_prog::String"
+       }, {
+               "full_name": "test_prog::List"
+       }],
+       "mclassdefs": [{
+               "full_name": "test_prog$Object"
+       }, {
+               "full_name": "test_prog$Int"
+       }, {
+               "full_name": "test_prog$Float"
+       }, {
+               "full_name": "test_prog$Bool"
+       }, {
+               "full_name": "test_prog$String"
+       }, {
+               "full_name": "test_prog$List"
+       }],
+       "intro_mclassdefs": [{
+               "full_name": "test_prog$Object"
+       }, {
+               "full_name": "test_prog$Int"
+       }, {
+               "full_name": "test_prog$Float"
+       }, {
+               "full_name": "test_prog$Bool"
+       }, {
+               "full_name": "test_prog$String"
+       }, {
+               "full_name": "test_prog$List"
+       }],
+       "redef_mclassdefs": [],
+       "imports": []
+}
+{
+       "name": "careers",
+       "class_name": "MModule",
+       "full_name": "test_prog::careers",
+       "mdoc": {
+               "content": "Careers of the game.\n\nAll characters can have a `Career`.\nA character can also quit its current career and start a new one.\n\nAvailable careers:\n\n * `Warrior`\n * `Magician`\n * `Alcoholic`",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 25,
+                       "line_start": 15,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["module"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 69,
+               "line_start": 15,
+               "file": "test_location"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "intro_mclasses": [{
+               "full_name": "test_prog::Career"
+       }, {
+               "full_name": "test_prog::Warrior"
+       }, {
+               "full_name": "test_prog::Magician"
+       }, {
+               "full_name": "test_prog::Alcoholic"
+       }],
+       "mclassdefs": [{
+               "full_name": "test_prog$Career"
+       }, {
+               "full_name": "test_prog$Warrior"
+       }, {
+               "full_name": "test_prog$Magician"
+       }, {
+               "full_name": "test_prog$Alcoholic"
+       }],
+       "intro_mclassdefs": [{
+               "full_name": "test_prog$Career"
+       }, {
+               "full_name": "test_prog$Warrior"
+       }, {
+               "full_name": "test_prog$Magician"
+       }, {
+               "full_name": "test_prog$Alcoholic"
+       }],
+       "redef_mclassdefs": [],
+       "imports": [{
+               "full_name": "test_prog::platform"
+       }]
+}
+{
+       "name": "character",
+       "class_name": "MModule",
+       "full_name": "test_prog::character",
+       "mdoc": {
+               "content": "Characters are playable entity in the world.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 16,
+                       "line_start": 15,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["module"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 68,
+               "line_start": 15,
+               "file": "test_location"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "intro_mclasses": [{
+               "full_name": "test_prog::Character"
+       }],
+       "mclassdefs": [{
+               "full_name": "test_prog$Character"
+       }],
+       "intro_mclassdefs": [{
+               "full_name": "test_prog$Character"
+       }],
+       "redef_mclassdefs": [],
+       "imports": [{
+               "full_name": "test_prog::races"
+       }, {
+               "full_name": "test_prog::careers"
+       }]
+}
+{
+       "name": "combat",
+       "class_name": "MModule",
+       "full_name": "test_prog::combat",
+       "mdoc": {
+               "content": "COmbat interactions between characters.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 16,
+                       "line_start": 15,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["module"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 67,
+               "line_start": 15,
+               "file": "test_location"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "intro_mclasses": [{
+               "full_name": "test_prog::Weapon"
+       }, {
+               "full_name": "test_prog::Combatable"
+       }],
+       "mclassdefs": [{
+               "full_name": "test_prog$Weapon"
+       }, {
+               "full_name": "test_prog$Combatable"
+       }, {
+               "full_name": "test_prog::combat$Character"
+       }, {
+               "full_name": "test_prog::combat$Dwarf"
+       }],
+       "intro_mclassdefs": [{
+               "full_name": "test_prog$Weapon"
+       }, {
+               "full_name": "test_prog$Combatable"
+       }],
+       "redef_mclassdefs": [{
+               "full_name": "test_prog::combat$Character"
+       }, {
+               "full_name": "test_prog::combat$Dwarf"
+       }],
+       "imports": [{
+               "full_name": "test_prog::character"
+       }]
+}
+{
+       "name": "races",
+       "class_name": "MModule",
+       "full_name": "test_prog::races",
+       "mdoc": {
+               "content": "Races of the game.\n\nAll characters belong to a `Race`.\n\nAvailable races:\n\n * `Human`\n * `Dwarf`\n * `Elf`",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 24,
+                       "line_start": 15,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["module"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 78,
+               "line_start": 15,
+               "file": "test_location"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "intro_mclasses": [{
+               "full_name": "test_prog::Race"
+       }, {
+               "full_name": "test_prog::Human"
+       }, {
+               "full_name": "test_prog::Dwarf"
+       }, {
+               "full_name": "test_prog::Elf"
+       }],
+       "mclassdefs": [{
+               "full_name": "test_prog$Race"
+       }, {
+               "full_name": "test_prog$Human"
+       }, {
+               "full_name": "test_prog$Dwarf"
+       }, {
+               "full_name": "test_prog$Elf"
+       }],
+       "intro_mclassdefs": [{
+               "full_name": "test_prog$Race"
+       }, {
+               "full_name": "test_prog$Human"
+       }, {
+               "full_name": "test_prog$Dwarf"
+       }, {
+               "full_name": "test_prog$Elf"
+       }],
+       "redef_mclassdefs": [],
+       "imports": [{
+               "full_name": "test_prog::platform"
+       }]
+}
+{
+       "name": "rpg",
+       "class_name": "MModule",
+       "full_name": "test_prog::rpg",
+       "mdoc": {
+               "content": "A worlg RPG abstraction.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 16,
+                       "line_start": 15,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["module"],
+       "location": {
+               "column_end": 13,
+               "column_start": 1,
+               "line_end": 21,
+               "line_start": 15,
+               "file": "test_location"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "intro_mclasses": [],
+       "mclassdefs": [],
+       "intro_mclassdefs": [],
+       "redef_mclassdefs": [],
+       "imports": [{
+               "full_name": "test_prog::combat"
+       }]
+}
+{
+       "name": "test_prog",
+       "class_name": "MModule",
+       "full_name": "test_prog::test_prog",
+       "mdoc": {
+               "content": "A test program with a fake model to check model tools.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 1,
+                       "line_end": 16,
+                       "line_start": 15,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["module"],
+       "location": {
+               "column_end": 13,
+               "column_start": 1,
+               "line_end": 26,
+               "line_start": 15,
+               "file": "test_location"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mgroup": {
+               "full_name": "test_prog>"
+       },
+       "intro_mclasses": [{
+               "full_name": "test_prog::Starter"
+       }, {
+               "full_name": "test_prog::Sys"
+       }],
+       "mclassdefs": [{
+               "full_name": "test_prog$Starter"
+       }, {
+               "full_name": "test_prog$Sys"
+       }],
+       "intro_mclassdefs": [{
+               "full_name": "test_prog$Starter"
+       }, {
+               "full_name": "test_prog$Sys"
+       }],
+       "redef_mclassdefs": [],
+       "imports": [{
+               "full_name": "test_prog::game"
+       }]
+}
+{
+       "name": "test_prog-m",
+       "class_name": "MModule",
+       "full_name": "test_prog-m",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["module"],
+       "location": {
+               "column_end": 0,
+               "column_start": 0,
+               "line_end": 0,
+               "line_start": 0,
+               "file": "test_location"
+       },
+       "mpackage": null,
+       "mgroup": null,
+       "intro_mclasses": [],
+       "mclassdefs": [],
+       "intro_mclassdefs": [],
+       "redef_mclassdefs": [],
+       "imports": [{
+               "full_name": "test_prog::test_prog"
+       }]
+}
diff --git a/src/model/test_model_json.sav/test_packages_to_full_json.res b/src/model/test_model_json.sav/test_packages_to_full_json.res
new file mode 100644 (file)
index 0000000..81a0cae
--- /dev/null
@@ -0,0 +1,70 @@
+{
+       "name": "test_prog",
+       "class_name": "MPackage",
+       "full_name": "test_prog",
+       "mdoc": {
+               "content": "Test program for model tools.\n\nThis program creates a fake model that can be used to test tools like:\n\n* `nitdoc`\n* `nitmetrics`\n* `nitx`\n* or others `modelbuilder`.\n\nAn image:\n\n![Tinks3D](../../contrib/tinks/doc/tinks3d.png)",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 0,
+                       "line_end": 12,
+                       "line_start": 1,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["package"],
+       "location": {
+               "column_end": 0,
+               "column_start": 0,
+               "line_end": 0,
+               "line_start": 0,
+               "file": "test_location"
+       },
+       "root": {
+               "full_name": "test_prog>"
+       },
+       "mgroups": [{
+               "full_name": "test_prog>"
+       }, {
+               "full_name": "test_prog>game>"
+       }, {
+               "full_name": "test_prog>platform>"
+       }, {
+               "full_name": "test_prog>rpg>"
+       }],
+       "ini": {
+               "upstream.issues": "https://github.com/nitlang/nit/issues",
+               "upstream.homepage": "http://nitlanguage.org",
+               "upstream.git.directory": "tests/test_prog",
+               "upstream.browse": "https://github.com/nitlang/nit/tree/master/tests/test_prog",
+               "source.exclude": "game/excluded.nit:game/excluded_dir",
+               "package.license": "Apache-2.0",
+               "package.more_contributors": "Riri <riri@example.com>, Fifi (http://www.example.com/~fifi), Loulou",
+               "package.maintainer": "John Doe <jdoe@example.com> (http://www.example.com/~jdoe), Spider-Man",
+               "package.tags": "test,game",
+               "package.version": "0.1",
+               "package.name": "test_prog"
+       }
+}
+{
+       "name": "excluded",
+       "class_name": "MPackage",
+       "full_name": "excluded",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["package"],
+       "location": {
+               "column_end": 0,
+               "column_start": 0,
+               "line_end": 0,
+               "line_start": 0,
+               "file": "test_location"
+       },
+       "root": {
+               "full_name": "excluded>"
+       },
+       "mgroups": [{
+               "full_name": "excluded>"
+       }]
+}
diff --git a/src/model/test_model_json.sav/test_propdefs_to_full_json.res b/src/model/test_model_json.sav/test_propdefs_to_full_json.res
new file mode 100644 (file)
index 0000000..167ec94
--- /dev/null
@@ -0,0 +1,4032 @@
+{
+       "name": "OTHER",
+       "class_name": "MVirtualTypeDef",
+       "full_name": "test_prog$Object$OTHER",
+       "mdoc": {
+               "content": "Used for comparisons.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 23,
+                       "line_start": 22,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "type"],
+       "location": {
+               "column_end": 28,
+               "column_start": 2,
+               "line_end": 23,
+               "line_start": 22,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Object::OTHER"
+       },
+       "intro": {
+               "full_name": "test_prog$Object$OTHER"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mgroup": {
+               "full_name": "test_prog>platform>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "bound": {
+               "full_name": "nullable test_prog::Object"
+       },
+       "is_fixed": false
+}
+{
+       "name": "==",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Object$==",
+       "mdoc": {
+               "content": "Is `other` equqls to `self`?",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 26,
+                       "line_start": 25,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 37,
+               "column_start": 2,
+               "line_end": 26,
+               "line_start": 25,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Object::=="
+       },
+       "intro": {
+               "full_name": "test_prog$Object$=="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mgroup": {
+               "full_name": "test_prog>platform>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "other",
+                       "mtype": {
+                               "full_name": "test_prog::Object::OTHER"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Bool"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "!=",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Object$!=",
+       "mdoc": {
+               "content": "Is `other` different from `self`?",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 29,
+                       "line_start": 28,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 55,
+               "column_start": 2,
+               "line_end": 29,
+               "line_start": 28,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Object::!="
+       },
+       "intro": {
+               "full_name": "test_prog$Object$!="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mgroup": {
+               "full_name": "test_prog>platform>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "other",
+                       "mtype": {
+                               "full_name": "test_prog::Object::OTHER"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Bool"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "init",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Object$init",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "init"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 30,
+               "line_start": 20,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Object::init"
+       },
+       "intro": {
+               "full_name": "test_prog$Object$init"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mgroup": {
+               "full_name": "test_prog>platform>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "init",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Career$Object::init",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["redef", "init"],
+       "location": {
+               "column_end": 12,
+               "column_start": 2,
+               "line_end": 35,
+               "line_start": 35,
+               "file": "test_location"
+       },
+       "is_intro": false,
+       "mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Object::init"
+       },
+       "intro": {
+               "full_name": "test_prog$Object$init"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "init",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Warrior$Object::init",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["redef", "init"],
+       "location": {
+               "column_end": 4,
+               "column_start": 2,
+               "line_end": 46,
+               "line_start": 42,
+               "file": "test_location"
+       },
+       "is_intro": false,
+       "mclassdef": {
+               "full_name": "test_prog$Warrior"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Object::init"
+       },
+       "intro": {
+               "full_name": "test_prog$Object$init"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "init",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Magician$Object::init",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["redef", "init"],
+       "location": {
+               "column_end": 4,
+               "column_start": 2,
+               "line_end": 57,
+               "line_start": 53,
+               "file": "test_location"
+       },
+       "is_intro": false,
+       "mclassdef": {
+               "full_name": "test_prog$Magician"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Object::init"
+       },
+       "intro": {
+               "full_name": "test_prog$Object$init"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "init",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Alcoholic$Object::init",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["redef", "init"],
+       "location": {
+               "column_end": 4,
+               "column_start": 2,
+               "line_end": 68,
+               "line_start": 64,
+               "file": "test_location"
+       },
+       "is_intro": false,
+       "mclassdef": {
+               "full_name": "test_prog$Alcoholic"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Object::init"
+       },
+       "intro": {
+               "full_name": "test_prog$Object$init"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "init",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Race$Object::init",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["redef", "init"],
+       "location": {
+               "column_end": 12,
+               "column_start": 2,
+               "line_end": 44,
+               "line_start": 44,
+               "file": "test_location"
+       },
+       "is_intro": false,
+       "mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Object::init"
+       },
+       "intro": {
+               "full_name": "test_prog$Object$init"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "init",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Human$Object::init",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["redef", "init"],
+       "location": {
+               "column_end": 4,
+               "column_start": 2,
+               "line_end": 55,
+               "line_start": 51,
+               "file": "test_location"
+       },
+       "is_intro": false,
+       "mclassdef": {
+               "full_name": "test_prog$Human"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Object::init"
+       },
+       "intro": {
+               "full_name": "test_prog$Object$init"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "init",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Dwarf$Object::init",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["redef", "init"],
+       "location": {
+               "column_end": 4,
+               "column_start": 2,
+               "line_end": 66,
+               "line_start": 62,
+               "file": "test_location"
+       },
+       "is_intro": false,
+       "mclassdef": {
+               "full_name": "test_prog$Dwarf"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Object::init"
+       },
+       "intro": {
+               "full_name": "test_prog$Object$init"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "init",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Elf$Object::init",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["redef", "init"],
+       "location": {
+               "column_end": 4,
+               "column_start": 2,
+               "line_end": 77,
+               "line_start": 73,
+               "file": "test_location"
+       },
+       "is_intro": false,
+       "mclassdef": {
+               "full_name": "test_prog$Elf"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Object::init"
+       },
+       "intro": {
+               "full_name": "test_prog$Object$init"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "init",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Character$Object::init",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["redef", "init"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 68,
+               "line_start": 21,
+               "file": "test_location"
+       },
+       "is_intro": false,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Object::init"
+       },
+       "intro": {
+               "full_name": "test_prog$Object$init"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "unary -",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Int$unary -",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 21,
+               "column_start": 2,
+               "line_end": 34,
+               "line_start": 34,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Int::unary -"
+       },
+       "intro": {
+               "full_name": "test_prog$Int$unary -"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mgroup": {
+               "full_name": "test_prog>platform>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "+",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Int$+",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 29,
+               "column_start": 2,
+               "line_end": 35,
+               "line_start": 35,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Int::+"
+       },
+       "intro": {
+               "full_name": "test_prog$Int$+"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mgroup": {
+               "full_name": "test_prog>platform>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "i",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "-",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Int$-",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 29,
+               "column_start": 2,
+               "line_end": 36,
+               "line_start": 36,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Int::-"
+       },
+       "intro": {
+               "full_name": "test_prog$Int$-"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mgroup": {
+               "full_name": "test_prog>platform>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "i",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "*",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Int$*",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 29,
+               "column_start": 2,
+               "line_end": 37,
+               "line_start": 37,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Int::*"
+       },
+       "intro": {
+               "full_name": "test_prog$Int$*"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mgroup": {
+               "full_name": "test_prog>platform>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "i",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "/",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Int$/",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 29,
+               "column_start": 2,
+               "line_end": 38,
+               "line_start": 38,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Int::/"
+       },
+       "intro": {
+               "full_name": "test_prog$Int$/"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mgroup": {
+               "full_name": "test_prog>platform>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "i",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": ">",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Int$>",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 30,
+               "column_start": 2,
+               "line_end": 39,
+               "line_start": 39,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Int::>"
+       },
+       "intro": {
+               "full_name": "test_prog$Int$>"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mgroup": {
+               "full_name": "test_prog>platform>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "i",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Bool"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "to_f",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Int$to_f",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 26,
+               "column_start": 2,
+               "line_end": 40,
+               "line_start": 40,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Int::to_f"
+       },
+       "intro": {
+               "full_name": "test_prog$Int$to_f"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mgroup": {
+               "full_name": "test_prog>platform>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Float"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "+",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Float$+",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 33,
+               "column_start": 2,
+               "line_end": 45,
+               "line_start": 45,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Float"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Float::+"
+       },
+       "intro": {
+               "full_name": "test_prog$Float$+"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Float"
+       },
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mgroup": {
+               "full_name": "test_prog>platform>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "f",
+                       "mtype": {
+                               "full_name": "test_prog::Float"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Float"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "-",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Float$-",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 33,
+               "column_start": 2,
+               "line_end": 46,
+               "line_start": 46,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Float"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Float::-"
+       },
+       "intro": {
+               "full_name": "test_prog$Float$-"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Float"
+       },
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mgroup": {
+               "full_name": "test_prog>platform>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "f",
+                       "mtype": {
+                               "full_name": "test_prog::Float"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Float"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "*",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Float$*",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 33,
+               "column_start": 2,
+               "line_end": 47,
+               "line_start": 47,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Float"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Float::*"
+       },
+       "intro": {
+               "full_name": "test_prog$Float$*"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Float"
+       },
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mgroup": {
+               "full_name": "test_prog>platform>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "f",
+                       "mtype": {
+                               "full_name": "test_prog::Float"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Float"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "/",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Float$/",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 33,
+               "column_start": 2,
+               "line_end": 48,
+               "line_start": 48,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Float"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Float::/"
+       },
+       "intro": {
+               "full_name": "test_prog$Float$/"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Float"
+       },
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mgroup": {
+               "full_name": "test_prog>platform>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "f",
+                       "mtype": {
+                               "full_name": "test_prog::Float"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Float"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": ">",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Float$>",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 32,
+               "column_start": 2,
+               "line_end": 49,
+               "line_start": 49,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Float"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Float::>"
+       },
+       "intro": {
+               "full_name": "test_prog$Float$>"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Float"
+       },
+       "mmodule": {
+               "full_name": "test_prog::platform"
+       },
+       "mgroup": {
+               "full_name": "test_prog>platform>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "f",
+                       "mtype": {
+                               "full_name": "test_prog::Float"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Bool"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_strength_bonus",
+       "class_name": "MAttributeDef",
+       "full_name": "test_prog$Career$_strength_bonus",
+       "mdoc": null,
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 24,
+               "column_start": 2,
+               "line_end": 31,
+               "line_start": 31,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mproperty": {
+               "full_name": "test_prog::careers::Career::_strength_bonus"
+       },
+       "intro": {
+               "full_name": "test_prog$Career$_strength_bonus"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::Int"
+       }
+}
+{
+       "name": "strength_bonus",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Career$strength_bonus",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 24,
+               "column_start": 2,
+               "line_end": 31,
+               "line_start": 31,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Career::strength_bonus"
+       },
+       "intro": {
+               "full_name": "test_prog$Career$strength_bonus"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "strength_bonus=",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Career$strength_bonus=",
+       "mdoc": null,
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 24,
+               "column_start": 2,
+               "line_end": 31,
+               "line_start": 31,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Career::strength_bonus="
+       },
+       "intro": {
+               "full_name": "test_prog$Career$strength_bonus="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "strength_bonus",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_endurance_bonus",
+       "class_name": "MAttributeDef",
+       "full_name": "test_prog$Career$_endurance_bonus",
+       "mdoc": null,
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 25,
+               "column_start": 2,
+               "line_end": 32,
+               "line_start": 32,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mproperty": {
+               "full_name": "test_prog::careers::Career::_endurance_bonus"
+       },
+       "intro": {
+               "full_name": "test_prog$Career$_endurance_bonus"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::Int"
+       }
+}
+{
+       "name": "endurance_bonus",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Career$endurance_bonus",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 25,
+               "column_start": 2,
+               "line_end": 32,
+               "line_start": 32,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Career::endurance_bonus"
+       },
+       "intro": {
+               "full_name": "test_prog$Career$endurance_bonus"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "endurance_bonus=",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Career$endurance_bonus=",
+       "mdoc": null,
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 25,
+               "column_start": 2,
+               "line_end": 32,
+               "line_start": 32,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Career::endurance_bonus="
+       },
+       "intro": {
+               "full_name": "test_prog$Career$endurance_bonus="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "endurance_bonus",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_intelligence_bonus",
+       "class_name": "MAttributeDef",
+       "full_name": "test_prog$Career$_intelligence_bonus",
+       "mdoc": null,
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 28,
+               "column_start": 2,
+               "line_end": 33,
+               "line_start": 33,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mproperty": {
+               "full_name": "test_prog::careers::Career::_intelligence_bonus"
+       },
+       "intro": {
+               "full_name": "test_prog$Career$_intelligence_bonus"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::Int"
+       }
+}
+{
+       "name": "intelligence_bonus",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Career$intelligence_bonus",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 28,
+               "column_start": 2,
+               "line_end": 33,
+               "line_start": 33,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Career::intelligence_bonus"
+       },
+       "intro": {
+               "full_name": "test_prog$Career$intelligence_bonus"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "intelligence_bonus=",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Career$intelligence_bonus=",
+       "mdoc": null,
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 28,
+               "column_start": 2,
+               "line_end": 33,
+               "line_start": 33,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Career::intelligence_bonus="
+       },
+       "intro": {
+               "full_name": "test_prog$Career$intelligence_bonus="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mmodule": {
+               "full_name": "test_prog::careers"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "intelligence_bonus",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_base_strength",
+       "class_name": "MAttributeDef",
+       "full_name": "test_prog$Race$_base_strength",
+       "mdoc": {
+               "content": "Used to represents how strong the race is.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 36,
+                       "line_start": 35,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 23,
+               "column_start": 2,
+               "line_end": 36,
+               "line_start": 35,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mproperty": {
+               "full_name": "test_prog::races::Race::_base_strength"
+       },
+       "intro": {
+               "full_name": "test_prog$Race$_base_strength"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::Int"
+       }
+}
+{
+       "name": "base_strength",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Race$base_strength",
+       "mdoc": {
+               "content": "Used to represents how strong the race is.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 36,
+                       "line_start": 35,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 23,
+               "column_start": 2,
+               "line_end": 36,
+               "line_start": 35,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Race::base_strength"
+       },
+       "intro": {
+               "full_name": "test_prog$Race$base_strength"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "base_strength=",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Race$base_strength=",
+       "mdoc": {
+               "content": "Used to represents how strong the race is.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 36,
+                       "line_start": 35,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 23,
+               "column_start": 2,
+               "line_end": 36,
+               "line_start": 35,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Race::base_strength="
+       },
+       "intro": {
+               "full_name": "test_prog$Race$base_strength="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "base_strength",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_base_endurance",
+       "class_name": "MAttributeDef",
+       "full_name": "test_prog$Race$_base_endurance",
+       "mdoc": {
+               "content": "Used to represents how the race can absorb damage.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 39,
+                       "line_start": 38,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 24,
+               "column_start": 2,
+               "line_end": 39,
+               "line_start": 38,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mproperty": {
+               "full_name": "test_prog::races::Race::_base_endurance"
+       },
+       "intro": {
+               "full_name": "test_prog$Race$_base_endurance"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::Int"
+       }
+}
+{
+       "name": "base_endurance",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Race$base_endurance",
+       "mdoc": {
+               "content": "Used to represents how the race can absorb damage.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 39,
+                       "line_start": 38,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 24,
+               "column_start": 2,
+               "line_end": 39,
+               "line_start": 38,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Race::base_endurance"
+       },
+       "intro": {
+               "full_name": "test_prog$Race$base_endurance"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "base_endurance=",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Race$base_endurance=",
+       "mdoc": {
+               "content": "Used to represents how the race can absorb damage.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 39,
+                       "line_start": 38,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 24,
+               "column_start": 2,
+               "line_end": 39,
+               "line_start": 38,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Race::base_endurance="
+       },
+       "intro": {
+               "full_name": "test_prog$Race$base_endurance="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "base_endurance",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_base_intelligence",
+       "class_name": "MAttributeDef",
+       "full_name": "test_prog$Race$_base_intelligence",
+       "mdoc": {
+               "content": "Is this race smart?",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 42,
+                       "line_start": 41,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 27,
+               "column_start": 2,
+               "line_end": 42,
+               "line_start": 41,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mproperty": {
+               "full_name": "test_prog::races::Race::_base_intelligence"
+       },
+       "intro": {
+               "full_name": "test_prog$Race$_base_intelligence"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::Int"
+       }
+}
+{
+       "name": "base_intelligence",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Race$base_intelligence",
+       "mdoc": {
+               "content": "Is this race smart?",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 42,
+                       "line_start": 41,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 27,
+               "column_start": 2,
+               "line_end": 42,
+               "line_start": 41,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Race::base_intelligence"
+       },
+       "intro": {
+               "full_name": "test_prog$Race$base_intelligence"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "base_intelligence=",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Race$base_intelligence=",
+       "mdoc": {
+               "content": "Is this race smart?",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 42,
+                       "line_start": 41,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 27,
+               "column_start": 2,
+               "line_end": 42,
+               "line_start": 41,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Race::base_intelligence="
+       },
+       "intro": {
+               "full_name": "test_prog$Race$base_intelligence="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mmodule": {
+               "full_name": "test_prog::races"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "base_intelligence",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_race",
+       "class_name": "MAttributeDef",
+       "full_name": "test_prog$Character$_race",
+       "mdoc": {
+               "content": "The `Race` of the character.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 25,
+                       "line_start": 24,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 15,
+               "column_start": 2,
+               "line_end": 25,
+               "line_start": 24,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::character::Character::_race"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$_race"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::Race"
+       }
+}
+{
+       "name": "race",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Character$race",
+       "mdoc": {
+               "content": "The `Race` of the character.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 25,
+                       "line_start": 24,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 15,
+               "column_start": 2,
+               "line_end": 25,
+               "line_start": 24,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Character::race"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$race"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Race"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "race=",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Character$race=",
+       "mdoc": {
+               "content": "The `Race` of the character.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 25,
+                       "line_start": 24,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 15,
+               "column_start": 2,
+               "line_end": 25,
+               "line_start": 24,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Character::race="
+       },
+       "intro": {
+               "full_name": "test_prog$Character$race="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "race",
+                       "mtype": {
+                               "full_name": "test_prog::Race"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_career",
+       "class_name": "MAttributeDef",
+       "full_name": "test_prog$Character$_career",
+       "mdoc": {
+               "content": "The current `Career` of the character.\nReturns `null` if character is unemployed.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 29,
+                       "line_start": 27,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 47,
+               "column_start": 2,
+               "line_end": 29,
+               "line_start": 27,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::character::Character::_career"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$_career"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "nullable test_prog::Career"
+       }
+}
+{
+       "name": "career",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Character$career",
+       "mdoc": {
+               "content": "The current `Career` of the character.\nReturns `null` if character is unemployed.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 29,
+                       "line_start": 27,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 47,
+               "column_start": 2,
+               "line_end": 29,
+               "line_start": 27,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Character::career"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$career"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "nullable test_prog::Career"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "career=",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Character$career=",
+       "mdoc": {
+               "content": "The current `Career` of the character.\nReturns `null` if character is unemployed.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 29,
+                       "line_start": 27,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 47,
+               "column_start": 2,
+               "line_end": 29,
+               "line_start": 27,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Character::career="
+       },
+       "intro": {
+               "full_name": "test_prog$Character$career="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "career",
+                       "mtype": {
+                               "full_name": "nullable test_prog::Career"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "quit",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Character$quit",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 4,
+               "column_start": 2,
+               "line_end": 33,
+               "line_start": 31,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Character::quit"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$quit"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_name",
+       "class_name": "MAttributeDef",
+       "full_name": "test_prog$Character$_name",
+       "mdoc": null,
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 17,
+               "column_start": 2,
+               "line_end": 35,
+               "line_start": 35,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::character::Character::_name"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$_name"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::String"
+       }
+}
+{
+       "name": "name",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Character$name",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 17,
+               "column_start": 2,
+               "line_end": 35,
+               "line_start": 35,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Character::name"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$name"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::String"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "name=",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Character$name=",
+       "mdoc": null,
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 17,
+               "column_start": 2,
+               "line_end": 35,
+               "line_start": 35,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Character::name="
+       },
+       "intro": {
+               "full_name": "test_prog$Character$name="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "name",
+                       "mtype": {
+                               "full_name": "test_prog::String"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_age",
+       "class_name": "MAttributeDef",
+       "full_name": "test_prog$Character$_age",
+       "mdoc": null,
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 13,
+               "column_start": 2,
+               "line_end": 36,
+               "line_start": 36,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::character::Character::_age"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$_age"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::Int"
+       }
+}
+{
+       "name": "age",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Character$age",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 13,
+               "column_start": 2,
+               "line_end": 36,
+               "line_start": 36,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Character::age"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$age"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "age=",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Character$age=",
+       "mdoc": null,
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 13,
+               "column_start": 2,
+               "line_end": 36,
+               "line_start": 36,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Character::age="
+       },
+       "intro": {
+               "full_name": "test_prog$Character$age="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "age",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_sex",
+       "class_name": "MAttributeDef",
+       "full_name": "test_prog$Character$_sex",
+       "mdoc": null,
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 14,
+               "column_start": 2,
+               "line_end": 37,
+               "line_start": 37,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::character::Character::_sex"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$_sex"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::Bool"
+       }
+}
+{
+       "name": "sex",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Character$sex",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 14,
+               "column_start": 2,
+               "line_end": 37,
+               "line_start": 37,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Character::sex"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$sex"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Bool"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "sex=",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Character$sex=",
+       "mdoc": null,
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 14,
+               "column_start": 2,
+               "line_end": 37,
+               "line_start": 37,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Character::sex="
+       },
+       "intro": {
+               "full_name": "test_prog$Character$sex="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "sex",
+                       "mtype": {
+                               "full_name": "test_prog::Bool"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "total_strengh",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Character$total_strengh",
+       "mdoc": {
+               "content": "The actual strength of the character.\n\nReturns `race.base_strength + career.strength_bonus` or just `race.base_strength` is unemployed.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 42,
+                       "line_start": 39,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 4,
+               "column_start": 2,
+               "line_end": 45,
+               "line_start": 39,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Character::total_strengh"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$total_strengh"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "total_endurance",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Character$total_endurance",
+       "mdoc": {
+               "content": "The actual endurance of the character.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 48,
+                       "line_start": 47,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 4,
+               "column_start": 2,
+               "line_end": 51,
+               "line_start": 47,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Character::total_endurance"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$total_endurance"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "total_intelligence",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Character$total_intelligence",
+       "mdoc": {
+               "content": "The acutal intelligence of the character.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 54,
+                       "line_start": 53,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 4,
+               "column_start": 2,
+               "line_end": 57,
+               "line_start": 53,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Character::total_intelligence"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$total_intelligence"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "max_health",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Character$max_health",
+       "mdoc": {
+               "content": "Maximum health of the character.\n\nBased on `total endurance * 10`.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 62,
+                       "line_start": 59,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 51,
+               "column_start": 2,
+               "line_end": 62,
+               "line_start": 59,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Character::max_health"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$max_health"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_health",
+       "class_name": "MAttributeDef",
+       "full_name": "test_prog$Character$_health",
+       "mdoc": {
+               "content": "The current `health` of the character.\n\nStarts at `max_health`.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 67,
+                       "line_start": 64,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 29,
+               "column_start": 2,
+               "line_end": 67,
+               "line_start": 64,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::character::Character::_health"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$_health"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::Int"
+       }
+}
+{
+       "name": "health",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Character$health",
+       "mdoc": {
+               "content": "The current `health` of the character.\n\nStarts at `max_health`.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 67,
+                       "line_start": 64,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 29,
+               "column_start": 2,
+               "line_end": 67,
+               "line_start": 64,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Character::health"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$health"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "health=",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Character$health=",
+       "mdoc": {
+               "content": "The current `health` of the character.\n\nStarts at `max_health`.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 67,
+                       "line_start": 64,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 29,
+               "column_start": 2,
+               "line_end": 67,
+               "line_start": 64,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Character::health="
+       },
+       "intro": {
+               "full_name": "test_prog$Character$health="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mmodule": {
+               "full_name": "test_prog::character"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "health",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "dps",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Weapon$dps",
+       "mdoc": {
+               "content": "Damage per second inflicted by this weapon.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 23,
+                       "line_start": 22,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract", "fun"],
+       "location": {
+               "column_end": 27,
+               "column_start": 2,
+               "line_end": 23,
+               "line_start": 22,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Weapon"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Weapon::dps"
+       },
+       "intro": {
+               "full_name": "test_prog$Weapon$dps"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Weapon"
+       },
+       "mmodule": {
+               "full_name": "test_prog::combat"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Float"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "dps",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog::combat$Dwarf$Weapon::dps",
+       "mdoc": {
+               "content": "Dwarf `dps` are based on the dwarf `base_endurance` (represents weight here)",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 66,
+                       "line_start": 65,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["redef", "fun"],
+       "location": {
+               "column_end": 51,
+               "column_start": 2,
+               "line_end": 66,
+               "line_start": 65,
+               "file": "test_location"
+       },
+       "is_intro": false,
+       "mclassdef": {
+               "full_name": "test_prog::combat$Dwarf"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Weapon::dps"
+       },
+       "intro": {
+               "full_name": "test_prog$Weapon$dps"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Weapon"
+       },
+       "mmodule": {
+               "full_name": "test_prog::combat"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Float"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "hit_points",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Combatable$hit_points",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "abstract", "fun"],
+       "location": {
+               "column_end": 32,
+               "column_start": 2,
+               "line_end": 32,
+               "line_start": 32,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Combatable"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Combatable::hit_points"
+       },
+       "intro": {
+               "full_name": "test_prog$Combatable$hit_points"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Combatable"
+       },
+       "mmodule": {
+               "full_name": "test_prog::combat"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "hit_points",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog::combat$Character$Combatable::hit_points",
+       "mdoc": {
+               "content": "Use character `health` to determines hit_points.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 58,
+                       "line_start": 57,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["redef", "fun"],
+       "location": {
+               "column_end": 38,
+               "column_start": 2,
+               "line_end": 58,
+               "line_start": 57,
+               "file": "test_location"
+       },
+       "is_intro": false,
+       "mclassdef": {
+               "full_name": "test_prog::combat$Character"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Combatable::hit_points"
+       },
+       "intro": {
+               "full_name": "test_prog$Combatable$hit_points"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Combatable"
+       },
+       "mmodule": {
+               "full_name": "test_prog::combat"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "attack",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Combatable$attack",
+       "mdoc": {
+               "content": "A `Combatable` can attack a `target` that is also a `Combatable`.\n\nAttack the `target` using `wepaon` and returns the number of inflicted hit points.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 37,
+                       "line_start": 34,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract", "fun"],
+       "location": {
+               "column_end": 64,
+               "column_start": 2,
+               "line_end": 37,
+               "line_start": 34,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Combatable"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Combatable::attack"
+       },
+       "intro": {
+               "full_name": "test_prog$Combatable$attack"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Combatable"
+       },
+       "mmodule": {
+               "full_name": "test_prog::combat"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 2,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "target",
+                       "mtype": {
+                               "full_name": "test_prog::Combatable"
+                       }
+               }, {
+                       "is_vararg": false,
+                       "name": "weapon",
+                       "mtype": {
+                               "full_name": "test_prog::Weapon"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "direct_attack",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Combatable$direct_attack",
+       "mdoc": {
+               "content": "Like `attack` but cannot be defended.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 40,
+                       "line_start": 39,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract", "fun"],
+       "location": {
+               "column_end": 71,
+               "column_start": 2,
+               "line_end": 40,
+               "line_start": 39,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Combatable"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Combatable::direct_attack"
+       },
+       "intro": {
+               "full_name": "test_prog$Combatable$direct_attack"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Combatable"
+       },
+       "mmodule": {
+               "full_name": "test_prog::combat"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 2,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "target",
+                       "mtype": {
+                               "full_name": "test_prog::Combatable"
+                       }
+               }, {
+                       "is_vararg": false,
+                       "name": "weapon",
+                       "mtype": {
+                               "full_name": "test_prog::Weapon"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "defend",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Combatable$defend",
+       "mdoc": {
+               "content": "`Combatable` can defend against attacks.\n\nDefends against a number of received hit points and return the number of pared hit points.\n\n@param hit: damage received.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 47,
+                       "line_start": 42,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract", "fun"],
+       "location": {
+               "column_end": 38,
+               "column_start": 2,
+               "line_end": 47,
+               "line_start": 42,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Combatable"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Combatable::defend"
+       },
+       "intro": {
+               "full_name": "test_prog$Combatable$defend"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Combatable"
+       },
+       "mmodule": {
+               "full_name": "test_prog::combat"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "hit",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "is_dead",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Combatable$is_dead",
+       "mdoc": {
+               "content": "Is the character still have hit_points?",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 50,
+                       "line_start": 49,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 43,
+               "column_start": 2,
+               "line_end": 50,
+               "line_start": 49,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Combatable"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Combatable::is_dead"
+       },
+       "intro": {
+               "full_name": "test_prog$Combatable$is_dead"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Combatable"
+       },
+       "mmodule": {
+               "full_name": "test_prog::combat"
+       },
+       "mgroup": {
+               "full_name": "test_prog>rpg>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Bool"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "player_characters",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Game$player_characters",
+       "mdoc": {
+               "content": "Characters played by human players.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 26,
+                       "line_start": 25,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract", "fun"],
+       "location": {
+               "column_end": 51,
+               "column_start": 2,
+               "line_end": 26,
+               "line_start": 25,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Game"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Game::player_characters"
+       },
+       "intro": {
+               "full_name": "test_prog$Game$player_characters"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Game"
+       },
+       "mmodule": {
+               "full_name": "test_prog::game"
+       },
+       "mgroup": {
+               "full_name": "test_prog>game>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::List[test_prog::Character]"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "computer_characters",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Game$computer_characters",
+       "mdoc": {
+               "content": "Characters players by computer.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 29,
+                       "line_start": 28,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract", "fun"],
+       "location": {
+               "column_end": 53,
+               "column_start": 2,
+               "line_end": 29,
+               "line_start": 28,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Game"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Game::computer_characters"
+       },
+       "intro": {
+               "full_name": "test_prog$Game$computer_characters"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Game"
+       },
+       "mmodule": {
+               "full_name": "test_prog::game"
+       },
+       "mgroup": {
+               "full_name": "test_prog>game>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::List[test_prog::Character]"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "start_game",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Game$start_game",
+       "mdoc": {
+               "content": "Start the game.\n\nYou have to implement that method!",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 34,
+                       "line_start": 31,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract", "fun"],
+       "location": {
+               "column_end": 27,
+               "column_start": 2,
+               "line_end": 34,
+               "line_start": 31,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Game"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Game::start_game"
+       },
+       "intro": {
+               "full_name": "test_prog$Game$start_game"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Game"
+       },
+       "mmodule": {
+               "full_name": "test_prog::game"
+       },
+       "mgroup": {
+               "full_name": "test_prog>game>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "pause_game",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Game$pause_game",
+       "mdoc": {
+               "content": "Pause the game.\n\nYou have to implement that method!",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 39,
+                       "line_start": 36,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract", "fun"],
+       "location": {
+               "column_end": 27,
+               "column_start": 2,
+               "line_end": 39,
+               "line_start": 36,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Game"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Game::pause_game"
+       },
+       "intro": {
+               "full_name": "test_prog$Game$pause_game"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Game"
+       },
+       "mmodule": {
+               "full_name": "test_prog::game"
+       },
+       "mgroup": {
+               "full_name": "test_prog>game>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "stop_game",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Game$stop_game",
+       "mdoc": {
+               "content": "Stop the game.\n\nYou have to implement that method!",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 44,
+                       "line_start": 41,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract", "fun"],
+       "location": {
+               "column_end": 26,
+               "column_start": 2,
+               "line_end": 44,
+               "line_start": 41,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Game"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Game::stop_game"
+       },
+       "intro": {
+               "full_name": "test_prog$Game$stop_game"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Game"
+       },
+       "mmodule": {
+               "full_name": "test_prog::game"
+       },
+       "mgroup": {
+               "full_name": "test_prog>game>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "start",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Starter$start",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 17,
+               "column_start": 2,
+               "line_end": 22,
+               "line_start": 22,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Starter"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Starter::start"
+       },
+       "intro": {
+               "full_name": "test_prog$Starter$start"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Starter"
+       },
+       "mmodule": {
+               "full_name": "test_prog::test_prog"
+       },
+       "mgroup": {
+               "full_name": "test_prog>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "main",
+       "class_name": "MMethodDef",
+       "full_name": "test_prog$Sys$main",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 13,
+               "column_start": 1,
+               "line_end": 26,
+               "line_start": 25,
+               "file": "test_location"
+       },
+       "is_intro": true,
+       "mclassdef": {
+               "full_name": "test_prog$Sys"
+       },
+       "mproperty": {
+               "full_name": "test_prog::Sys::main"
+       },
+       "intro": {
+               "full_name": "test_prog$Sys$main"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Sys"
+       },
+       "mmodule": {
+               "full_name": "test_prog::test_prog"
+       },
+       "mgroup": {
+               "full_name": "test_prog>"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
diff --git a/src/model/test_model_json.sav/test_props_to_full_json.res b/src/model/test_model_json.sav/test_props_to_full_json.res
new file mode 100644 (file)
index 0000000..d61dd81
--- /dev/null
@@ -0,0 +1,3128 @@
+{
+       "name": "OTHER",
+       "class_name": "MVirtualTypeProp",
+       "full_name": "test_prog::Object::OTHER",
+       "mdoc": {
+               "content": "Used for comparisons.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 23,
+                       "line_start": 22,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "type"],
+       "location": {
+               "column_end": 28,
+               "column_start": 2,
+               "line_end": 23,
+               "line_start": 22,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Object$OTHER"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Object$OTHER"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Object"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "mvirtualtype": {
+               "full_name": "test_prog::Object::OTHER"
+       },
+       "bound": {
+               "full_name": "nullable test_prog::Object"
+       }
+}
+{
+       "name": "==",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Object::==",
+       "mdoc": {
+               "content": "Is `other` equqls to `self`?",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 26,
+                       "line_start": 25,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 37,
+               "column_start": 2,
+               "line_end": 26,
+               "line_start": 25,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Object$=="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Object$=="
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Object"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "other",
+                       "mtype": {
+                               "full_name": "test_prog::Object::OTHER"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Bool"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "!=",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Object::!=",
+       "mdoc": {
+               "content": "Is `other` different from `self`?",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 29,
+                       "line_start": 28,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 55,
+               "column_start": 2,
+               "line_end": 29,
+               "line_start": 28,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Object$!="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Object$!="
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Object"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "other",
+                       "mtype": {
+                               "full_name": "test_prog::Object::OTHER"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Bool"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "init",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Object::init",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "init"],
+       "location": {
+               "column_end": 3,
+               "column_start": 1,
+               "line_end": 30,
+               "line_start": 20,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Object$init"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Object"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Object$init"
+       }, {
+               "full_name": "test_prog$Career$Object::init"
+       }, {
+               "full_name": "test_prog$Warrior$Object::init"
+       }, {
+               "full_name": "test_prog$Magician$Object::init"
+       }, {
+               "full_name": "test_prog$Alcoholic$Object::init"
+       }, {
+               "full_name": "test_prog$Race$Object::init"
+       }, {
+               "full_name": "test_prog$Human$Object::init"
+       }, {
+               "full_name": "test_prog$Dwarf$Object::init"
+       }, {
+               "full_name": "test_prog$Elf$Object::init"
+       }, {
+               "full_name": "test_prog$Character$Object::init"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Object"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": true,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "unary -",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Int::unary -",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 21,
+               "column_start": 2,
+               "line_end": 34,
+               "line_start": 34,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Int$unary -"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Int$unary -"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Int"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "+",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Int::+",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 29,
+               "column_start": 2,
+               "line_end": 35,
+               "line_start": 35,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Int$+"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Int$+"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Int"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "i",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "-",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Int::-",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 29,
+               "column_start": 2,
+               "line_end": 36,
+               "line_start": 36,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Int$-"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Int$-"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Int"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "i",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "*",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Int::*",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 29,
+               "column_start": 2,
+               "line_end": 37,
+               "line_start": 37,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Int$*"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Int$*"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Int"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "i",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "/",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Int::/",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 29,
+               "column_start": 2,
+               "line_end": 38,
+               "line_start": 38,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Int$/"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Int$/"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Int"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "i",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": ">",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Int::>",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 30,
+               "column_start": 2,
+               "line_end": 39,
+               "line_start": 39,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Int$>"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Int$>"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Int"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "i",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Bool"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "to_f",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Int::to_f",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 26,
+               "column_start": 2,
+               "line_end": 40,
+               "line_start": 40,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Int$to_f"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Int"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Int$to_f"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Int"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Float"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "+",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Float::+",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 33,
+               "column_start": 2,
+               "line_end": 45,
+               "line_start": 45,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Float$+"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Float"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Float$+"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Float"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "f",
+                       "mtype": {
+                               "full_name": "test_prog::Float"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Float"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "-",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Float::-",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 33,
+               "column_start": 2,
+               "line_end": 46,
+               "line_start": 46,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Float$-"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Float"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Float$-"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Float"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "f",
+                       "mtype": {
+                               "full_name": "test_prog::Float"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Float"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "*",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Float::*",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 33,
+               "column_start": 2,
+               "line_end": 47,
+               "line_start": 47,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Float$*"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Float"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Float$*"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Float"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "f",
+                       "mtype": {
+                               "full_name": "test_prog::Float"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Float"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "/",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Float::/",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 33,
+               "column_start": 2,
+               "line_end": 48,
+               "line_start": 48,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Float$/"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Float"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Float$/"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Float"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "f",
+                       "mtype": {
+                               "full_name": "test_prog::Float"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Float"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": ">",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Float::>",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "intern", "fun"],
+       "location": {
+               "column_end": 32,
+               "column_start": 2,
+               "line_end": 49,
+               "line_start": 49,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Float$>"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Float"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Float$>"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Float"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "f",
+                       "mtype": {
+                               "full_name": "test_prog::Float"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Bool"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_strength_bonus",
+       "class_name": "MAttribute",
+       "full_name": "test_prog::careers::Career::_strength_bonus",
+       "mdoc": null,
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 24,
+               "column_start": 2,
+               "line_end": 31,
+               "line_start": 31,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Career$_strength_bonus"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Career$_strength_bonus"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Career"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::Int"
+       }
+}
+{
+       "name": "strength_bonus",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Career::strength_bonus",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 24,
+               "column_start": 2,
+               "line_end": 31,
+               "line_start": 31,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Career$strength_bonus"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Career$strength_bonus"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Career"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "strength_bonus=",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Career::strength_bonus=",
+       "mdoc": null,
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 24,
+               "column_start": 2,
+               "line_end": 31,
+               "line_start": 31,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Career$strength_bonus="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Career$strength_bonus="
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Career"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "strength_bonus",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_endurance_bonus",
+       "class_name": "MAttribute",
+       "full_name": "test_prog::careers::Career::_endurance_bonus",
+       "mdoc": null,
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 25,
+               "column_start": 2,
+               "line_end": 32,
+               "line_start": 32,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Career$_endurance_bonus"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Career$_endurance_bonus"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Career"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::Int"
+       }
+}
+{
+       "name": "endurance_bonus",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Career::endurance_bonus",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 25,
+               "column_start": 2,
+               "line_end": 32,
+               "line_start": 32,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Career$endurance_bonus"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Career$endurance_bonus"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Career"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "endurance_bonus=",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Career::endurance_bonus=",
+       "mdoc": null,
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 25,
+               "column_start": 2,
+               "line_end": 32,
+               "line_start": 32,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Career$endurance_bonus="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Career$endurance_bonus="
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Career"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "endurance_bonus",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_intelligence_bonus",
+       "class_name": "MAttribute",
+       "full_name": "test_prog::careers::Career::_intelligence_bonus",
+       "mdoc": null,
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 28,
+               "column_start": 2,
+               "line_end": 33,
+               "line_start": 33,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Career$_intelligence_bonus"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Career$_intelligence_bonus"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Career"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::Int"
+       }
+}
+{
+       "name": "intelligence_bonus",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Career::intelligence_bonus",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 28,
+               "column_start": 2,
+               "line_end": 33,
+               "line_start": 33,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Career$intelligence_bonus"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Career$intelligence_bonus"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Career"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "intelligence_bonus=",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Career::intelligence_bonus=",
+       "mdoc": null,
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 28,
+               "column_start": 2,
+               "line_end": 33,
+               "line_start": 33,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Career$intelligence_bonus="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Career"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Career$intelligence_bonus="
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Career"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "intelligence_bonus",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_base_strength",
+       "class_name": "MAttribute",
+       "full_name": "test_prog::races::Race::_base_strength",
+       "mdoc": {
+               "content": "Used to represents how strong the race is.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 36,
+                       "line_start": 35,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 23,
+               "column_start": 2,
+               "line_end": 36,
+               "line_start": 35,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Race$_base_strength"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Race$_base_strength"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Race"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::Int"
+       }
+}
+{
+       "name": "base_strength",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Race::base_strength",
+       "mdoc": {
+               "content": "Used to represents how strong the race is.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 36,
+                       "line_start": 35,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 23,
+               "column_start": 2,
+               "line_end": 36,
+               "line_start": 35,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Race$base_strength"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Race$base_strength"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Race"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "base_strength=",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Race::base_strength=",
+       "mdoc": {
+               "content": "Used to represents how strong the race is.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 36,
+                       "line_start": 35,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 23,
+               "column_start": 2,
+               "line_end": 36,
+               "line_start": 35,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Race$base_strength="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Race$base_strength="
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Race"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "base_strength",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_base_endurance",
+       "class_name": "MAttribute",
+       "full_name": "test_prog::races::Race::_base_endurance",
+       "mdoc": {
+               "content": "Used to represents how the race can absorb damage.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 39,
+                       "line_start": 38,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 24,
+               "column_start": 2,
+               "line_end": 39,
+               "line_start": 38,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Race$_base_endurance"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Race$_base_endurance"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Race"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::Int"
+       }
+}
+{
+       "name": "base_endurance",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Race::base_endurance",
+       "mdoc": {
+               "content": "Used to represents how the race can absorb damage.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 39,
+                       "line_start": 38,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 24,
+               "column_start": 2,
+               "line_end": 39,
+               "line_start": 38,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Race$base_endurance"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Race$base_endurance"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Race"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "base_endurance=",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Race::base_endurance=",
+       "mdoc": {
+               "content": "Used to represents how the race can absorb damage.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 39,
+                       "line_start": 38,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 24,
+               "column_start": 2,
+               "line_end": 39,
+               "line_start": 38,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Race$base_endurance="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Race$base_endurance="
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Race"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "base_endurance",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_base_intelligence",
+       "class_name": "MAttribute",
+       "full_name": "test_prog::races::Race::_base_intelligence",
+       "mdoc": {
+               "content": "Is this race smart?",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 42,
+                       "line_start": 41,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 27,
+               "column_start": 2,
+               "line_end": 42,
+               "line_start": 41,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Race$_base_intelligence"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Race$_base_intelligence"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Race"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::Int"
+       }
+}
+{
+       "name": "base_intelligence",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Race::base_intelligence",
+       "mdoc": {
+               "content": "Is this race smart?",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 42,
+                       "line_start": 41,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 27,
+               "column_start": 2,
+               "line_end": 42,
+               "line_start": 41,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Race$base_intelligence"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Race$base_intelligence"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Race"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "base_intelligence=",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Race::base_intelligence=",
+       "mdoc": {
+               "content": "Is this race smart?",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 42,
+                       "line_start": 41,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 27,
+               "column_start": 2,
+               "line_end": 42,
+               "line_start": 41,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Race$base_intelligence="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Race"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Race$base_intelligence="
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Race"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "base_intelligence",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_race",
+       "class_name": "MAttribute",
+       "full_name": "test_prog::character::Character::_race",
+       "mdoc": {
+               "content": "The `Race` of the character.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 25,
+                       "line_start": 24,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 15,
+               "column_start": 2,
+               "line_end": 25,
+               "line_start": 24,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$_race"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$_race"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::Race"
+       }
+}
+{
+       "name": "race",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Character::race",
+       "mdoc": {
+               "content": "The `Race` of the character.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 25,
+                       "line_start": 24,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 15,
+               "column_start": 2,
+               "line_end": 25,
+               "line_start": 24,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$race"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$race"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Race"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "race=",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Character::race=",
+       "mdoc": {
+               "content": "The `Race` of the character.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 25,
+                       "line_start": 24,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 15,
+               "column_start": 2,
+               "line_end": 25,
+               "line_start": 24,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$race="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$race="
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "race",
+                       "mtype": {
+                               "full_name": "test_prog::Race"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_career",
+       "class_name": "MAttribute",
+       "full_name": "test_prog::character::Character::_career",
+       "mdoc": {
+               "content": "The current `Career` of the character.\nReturns `null` if character is unemployed.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 29,
+                       "line_start": 27,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 47,
+               "column_start": 2,
+               "line_end": 29,
+               "line_start": 27,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$_career"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$_career"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "nullable test_prog::Career"
+       }
+}
+{
+       "name": "career",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Character::career",
+       "mdoc": {
+               "content": "The current `Career` of the character.\nReturns `null` if character is unemployed.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 29,
+                       "line_start": 27,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 47,
+               "column_start": 2,
+               "line_end": 29,
+               "line_start": 27,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$career"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$career"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "nullable test_prog::Career"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "career=",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Character::career=",
+       "mdoc": {
+               "content": "The current `Career` of the character.\nReturns `null` if character is unemployed.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 29,
+                       "line_start": 27,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 47,
+               "column_start": 2,
+               "line_end": 29,
+               "line_start": 27,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$career="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$career="
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "career",
+                       "mtype": {
+                               "full_name": "nullable test_prog::Career"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "quit",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Character::quit",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 4,
+               "column_start": 2,
+               "line_end": 33,
+               "line_start": 31,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$quit"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$quit"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_name",
+       "class_name": "MAttribute",
+       "full_name": "test_prog::character::Character::_name",
+       "mdoc": null,
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 17,
+               "column_start": 2,
+               "line_end": 35,
+               "line_start": 35,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$_name"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$_name"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::String"
+       }
+}
+{
+       "name": "name",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Character::name",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 17,
+               "column_start": 2,
+               "line_end": 35,
+               "line_start": 35,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$name"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$name"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::String"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "name=",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Character::name=",
+       "mdoc": null,
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 17,
+               "column_start": 2,
+               "line_end": 35,
+               "line_start": 35,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$name="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$name="
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "name",
+                       "mtype": {
+                               "full_name": "test_prog::String"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_age",
+       "class_name": "MAttribute",
+       "full_name": "test_prog::character::Character::_age",
+       "mdoc": null,
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 13,
+               "column_start": 2,
+               "line_end": 36,
+               "line_start": 36,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$_age"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$_age"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::Int"
+       }
+}
+{
+       "name": "age",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Character::age",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 13,
+               "column_start": 2,
+               "line_end": 36,
+               "line_start": 36,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$age"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$age"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "age=",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Character::age=",
+       "mdoc": null,
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 13,
+               "column_start": 2,
+               "line_end": 36,
+               "line_start": 36,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$age="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$age="
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "age",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_sex",
+       "class_name": "MAttribute",
+       "full_name": "test_prog::character::Character::_sex",
+       "mdoc": null,
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 14,
+               "column_start": 2,
+               "line_end": 37,
+               "line_start": 37,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$_sex"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$_sex"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::Bool"
+       }
+}
+{
+       "name": "sex",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Character::sex",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 14,
+               "column_start": 2,
+               "line_end": 37,
+               "line_start": 37,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$sex"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$sex"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Bool"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "sex=",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Character::sex=",
+       "mdoc": null,
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 14,
+               "column_start": 2,
+               "line_end": 37,
+               "line_start": 37,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$sex="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$sex="
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "sex",
+                       "mtype": {
+                               "full_name": "test_prog::Bool"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "total_strengh",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Character::total_strengh",
+       "mdoc": {
+               "content": "The actual strength of the character.\n\nReturns `race.base_strength + career.strength_bonus` or just `race.base_strength` is unemployed.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 42,
+                       "line_start": 39,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 4,
+               "column_start": 2,
+               "line_end": 45,
+               "line_start": 39,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$total_strengh"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$total_strengh"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "total_endurance",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Character::total_endurance",
+       "mdoc": {
+               "content": "The actual endurance of the character.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 48,
+                       "line_start": 47,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 4,
+               "column_start": 2,
+               "line_end": 51,
+               "line_start": 47,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$total_endurance"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$total_endurance"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "total_intelligence",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Character::total_intelligence",
+       "mdoc": {
+               "content": "The acutal intelligence of the character.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 54,
+                       "line_start": 53,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 4,
+               "column_start": 2,
+               "line_end": 57,
+               "line_start": 53,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$total_intelligence"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$total_intelligence"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "max_health",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Character::max_health",
+       "mdoc": {
+               "content": "Maximum health of the character.\n\nBased on `total endurance * 10`.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 62,
+                       "line_start": 59,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 51,
+               "column_start": 2,
+               "line_end": 62,
+               "line_start": 59,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$max_health"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$max_health"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "_health",
+       "class_name": "MAttribute",
+       "full_name": "test_prog::character::Character::_health",
+       "mdoc": {
+               "content": "The current `health` of the character.\n\nStarts at `max_health`.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 67,
+                       "line_start": 64,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "private",
+       "modifiers": ["private", "var"],
+       "location": {
+               "column_end": 29,
+               "column_start": 2,
+               "line_end": 67,
+               "line_start": 64,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$_health"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$_health"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "static_mtype": {
+               "full_name": "test_prog::Int"
+       }
+}
+{
+       "name": "health",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Character::health",
+       "mdoc": {
+               "content": "The current `health` of the character.\n\nStarts at `max_health`.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 67,
+                       "line_start": 64,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 29,
+               "column_start": 2,
+               "line_end": 67,
+               "line_start": 64,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$health"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$health"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "health=",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Character::health=",
+       "mdoc": {
+               "content": "The current `health` of the character.\n\nStarts at `max_health`.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 67,
+                       "line_start": 64,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "protected",
+       "modifiers": ["protected", "fun"],
+       "location": {
+               "column_end": 29,
+               "column_start": 2,
+               "line_end": 67,
+               "line_start": 64,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Character$health="
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Character"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Character$health="
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Character"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "health",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "dps",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Weapon::dps",
+       "mdoc": {
+               "content": "Damage per second inflicted by this weapon.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 23,
+                       "line_start": 22,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract", "fun"],
+       "location": {
+               "column_end": 27,
+               "column_start": 2,
+               "line_end": 23,
+               "line_start": 22,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Weapon$dps"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Weapon"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Weapon$dps"
+       }, {
+               "full_name": "test_prog::combat$Dwarf$Weapon::dps"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Weapon"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Float"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "hit_points",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Combatable::hit_points",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "abstract", "fun"],
+       "location": {
+               "column_end": 32,
+               "column_start": 2,
+               "line_end": 32,
+               "line_start": 32,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Combatable$hit_points"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Combatable"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Combatable$hit_points"
+       }, {
+               "full_name": "test_prog::combat$Character$Combatable::hit_points"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Combatable"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "attack",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Combatable::attack",
+       "mdoc": {
+               "content": "A `Combatable` can attack a `target` that is also a `Combatable`.\n\nAttack the `target` using `wepaon` and returns the number of inflicted hit points.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 37,
+                       "line_start": 34,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract", "fun"],
+       "location": {
+               "column_end": 64,
+               "column_start": 2,
+               "line_end": 37,
+               "line_start": 34,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Combatable$attack"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Combatable"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Combatable$attack"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Combatable"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 2,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "target",
+                       "mtype": {
+                               "full_name": "test_prog::Combatable"
+                       }
+               }, {
+                       "is_vararg": false,
+                       "name": "weapon",
+                       "mtype": {
+                               "full_name": "test_prog::Weapon"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "direct_attack",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Combatable::direct_attack",
+       "mdoc": {
+               "content": "Like `attack` but cannot be defended.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 40,
+                       "line_start": 39,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract", "fun"],
+       "location": {
+               "column_end": 71,
+               "column_start": 2,
+               "line_end": 40,
+               "line_start": 39,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Combatable$direct_attack"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Combatable"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Combatable$direct_attack"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Combatable"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 2,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "target",
+                       "mtype": {
+                               "full_name": "test_prog::Combatable"
+                       }
+               }, {
+                       "is_vararg": false,
+                       "name": "weapon",
+                       "mtype": {
+                               "full_name": "test_prog::Weapon"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "defend",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Combatable::defend",
+       "mdoc": {
+               "content": "`Combatable` can defend against attacks.\n\nDefends against a number of received hit points and return the number of pared hit points.\n\n@param hit: damage received.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 47,
+                       "line_start": 42,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract", "fun"],
+       "location": {
+               "column_end": 38,
+               "column_start": 2,
+               "line_end": 47,
+               "line_start": 42,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Combatable$defend"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Combatable"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Combatable$defend"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Combatable"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 1,
+               "mparams": [{
+                       "is_vararg": false,
+                       "name": "hit",
+                       "mtype": {
+                               "full_name": "test_prog::Int"
+                       }
+               }],
+               "return_mtype": {
+                       "full_name": "test_prog::Int"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "is_dead",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Combatable::is_dead",
+       "mdoc": {
+               "content": "Is the character still have hit_points?",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 50,
+                       "line_start": 49,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 43,
+               "column_start": 2,
+               "line_end": 50,
+               "line_start": 49,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Combatable$is_dead"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Combatable"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Combatable$is_dead"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Combatable"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::Bool"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "player_characters",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Game::player_characters",
+       "mdoc": {
+               "content": "Characters played by human players.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 26,
+                       "line_start": 25,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract", "fun"],
+       "location": {
+               "column_end": 51,
+               "column_start": 2,
+               "line_end": 26,
+               "line_start": 25,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Game$player_characters"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Game"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Game$player_characters"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Game"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::List[test_prog::Character]"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "computer_characters",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Game::computer_characters",
+       "mdoc": {
+               "content": "Characters players by computer.",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 29,
+                       "line_start": 28,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract", "fun"],
+       "location": {
+               "column_end": 53,
+               "column_start": 2,
+               "line_end": 29,
+               "line_start": 28,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Game$computer_characters"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Game"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Game$computer_characters"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Game"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": {
+                       "full_name": "test_prog::List[test_prog::Character]"
+               },
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "start_game",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Game::start_game",
+       "mdoc": {
+               "content": "Start the game.\n\nYou have to implement that method!",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 34,
+                       "line_start": 31,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract", "fun"],
+       "location": {
+               "column_end": 27,
+               "column_start": 2,
+               "line_end": 34,
+               "line_start": 31,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Game$start_game"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Game"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Game$start_game"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Game"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "pause_game",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Game::pause_game",
+       "mdoc": {
+               "content": "Pause the game.\n\nYou have to implement that method!",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 39,
+                       "line_start": 36,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract", "fun"],
+       "location": {
+               "column_end": 27,
+               "column_start": 2,
+               "line_end": 39,
+               "line_start": 36,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Game$pause_game"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Game"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Game$pause_game"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Game"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "stop_game",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Game::stop_game",
+       "mdoc": {
+               "content": "Stop the game.\n\nYou have to implement that method!",
+               "location": {
+                       "column_end": 0,
+                       "column_start": 2,
+                       "line_end": 44,
+                       "line_start": 41,
+                       "file": "test_location"
+               }
+       },
+       "visibility": "public",
+       "modifiers": ["public", "abstract", "fun"],
+       "location": {
+               "column_end": 26,
+               "column_start": 2,
+               "line_end": 44,
+               "line_start": 41,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Game$stop_game"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Game"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Game$stop_game"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Game"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "start",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Starter::start",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 17,
+               "column_start": 2,
+               "line_end": 22,
+               "line_start": 22,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Starter$start"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Starter"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Starter$start"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Starter"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
+{
+       "name": "main",
+       "class_name": "MMethod",
+       "full_name": "test_prog::Sys::main",
+       "mdoc": null,
+       "visibility": "public",
+       "modifiers": ["public", "fun"],
+       "location": {
+               "column_end": 13,
+               "column_start": 1,
+               "line_end": 26,
+               "line_start": 25,
+               "file": "test_location"
+       },
+       "intro": {
+               "full_name": "test_prog$Sys$main"
+       },
+       "intro_mclassdef": {
+               "full_name": "test_prog$Sys"
+       },
+       "mpropdefs": [{
+               "full_name": "test_prog$Sys$main"
+       }],
+       "intro_mclass": {
+               "full_name": "test_prog::Sys"
+       },
+       "mpackage": {
+               "full_name": "test_prog"
+       },
+       "is_init": false,
+       "msignature": {
+               "arity": 0,
+               "mparams": [],
+               "return_mtype": null,
+               "vararg_rank": -1
+       }
+}
diff --git a/src/model/test_model_json.sav/test_refs_to_full_json.res b/src/model/test_model_json.sav/test_refs_to_full_json.res
new file mode 100644 (file)
index 0000000..60e70df
--- /dev/null
@@ -0,0 +1,9 @@
+{
+       "full_name": "test_prog"
+}
+{
+       "full_name": "excluded::excluded"
+}
+{
+       "full_name": "test_prog::Object"
+}