tests: fix tests for doc commands
[nit.git] / src / model / model_json.nit
index ddd7023..a48cef2 100644 (file)
@@ -12,7 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# Make model entities Jsonable.
+# Make model entities Serializable.
 #
 # To avoid cycles, every reference from a MEntity to another is replaced by a
 # MEntityRef.
@@ -42,7 +42,6 @@ class MEntityRef
 end
 
 redef class MEntity
-       super Jsonable
        serialize
 
        redef fun core_serialize_to(v) do
@@ -58,9 +57,9 @@ redef class MEntity
        # Serialize the full version of `self` to JSON
        #
        # See: `FullJsonSerializer`
-       fun serialize_to_full_json(plain, pretty: nullable Bool): String do
+       fun serialize_to_full_json(mainmodule: MModule, plain, pretty: nullable Bool): String do
                var stream = new StringWriter
-               var serializer = new FullJsonSerializer(stream)
+               var serializer = new FullJsonSerializer(stream, mainmodule)
                serializer.plain_json = plain or else false
                serializer.pretty_json = pretty or else false
                serializer.serialize self
@@ -73,14 +72,25 @@ redef class MEntity
        # By default, every reference to another MEntity is replaced by a pointer
        # to the MEntity::json_id.
        # Use this method to obtain a full object with mentities instead of pointers.
-       fun to_full_json: String do return serialize_to_full_json(plain=true)
+       fun to_full_json(mainmodule: MModule): String do
+               return serialize_to_full_json(mainmodule, plain=true)
+       end
 
        # Same as `to_full_json` but with pretty json.
-       fun to_pretty_full_json: String do return serialize_to_full_json(plain=true, pretty=true)
+       fun to_pretty_full_json(mainmodule: MModule): String do
+               return serialize_to_full_json(mainmodule, plain=true, pretty=true)
+       end
+
+       # Sort mentities by name
+       private fun sort_entities(mentities: Collection[MEntity]): Array[MEntity] do
+               var sorter = new MEntityNameSorter
+               var sorted = mentities.to_a
+               sorter.sort(sorted)
+               return sorted
+       end
 end
 
 redef class MDoc
-       super Jsonable
        serialize
 
        redef fun core_serialize_to(v) do
@@ -90,8 +100,7 @@ redef class MDoc
        end
 end
 
-redef class Location
-       super Jsonable
+redef class nitc::Location
        serialize
 
        redef fun core_serialize_to(v) do
@@ -111,7 +120,7 @@ redef class MPackage
                super
                if v isa FullJsonSerializer then
                        v.serialize_attribute("root", to_mentity_ref(root))
-                       v.serialize_attribute("mgroups", to_mentity_refs(mgroups))
+                       v.serialize_attribute("mgroups", to_mentity_refs(sort_entities(mgroups)))
                        var ini = self.ini
                        if ini != null then v.serialize_attribute("ini", ini.to_map)
                end
@@ -126,8 +135,8 @@ redef class MGroup
                        v.serialize_attribute("mpackage", to_mentity_ref(mpackage))
                        v.serialize_attribute("default_mmodule", to_mentity_ref(default_mmodule))
                        v.serialize_attribute("parent", to_mentity_ref(parent))
-                       v.serialize_attribute("mmodules", to_mentity_refs(mmodules))
-                       v.serialize_attribute("mgroups", to_mentity_refs(in_nesting.direct_smallers))
+                       v.serialize_attribute("mmodules", to_mentity_refs(sort_entities(mmodules)))
+                       v.serialize_attribute("mgroups", to_mentity_refs(sort_entities(in_nesting.direct_smallers)))
                end
        end
 end
@@ -136,13 +145,13 @@ redef class MModule
        redef fun core_serialize_to(v) do
                super
                if v isa FullJsonSerializer then
-                       var view = private_view
+                       var view = new ModelView(model, v.mainmodule)
                        v.serialize_attribute("mpackage", to_mentity_ref(mpackage))
                        v.serialize_attribute("mgroup", to_mentity_ref(mgroup))
-                       v.serialize_attribute("intro_mclasses", to_mentity_refs(intro_mclasses))
-                       v.serialize_attribute("mclassdefs", to_mentity_refs(mclassdefs))
-                       v.serialize_attribute("intro_mclassdefs", to_mentity_refs(collect_intro_mclassdefs(view)))
-                       v.serialize_attribute("redef_mclassdefs", to_mentity_refs(collect_redef_mclassdefs(view)))
+                       v.serialize_attribute("intro_mclasses", to_mentity_refs(sort_entities(intro_mclasses)))
+                       v.serialize_attribute("mclassdefs", to_mentity_refs(sort_entities(mclassdefs)))
+                       v.serialize_attribute("intro_mclassdefs", to_mentity_refs(sort_entities(collect_intro_mclassdefs(view))))
+                       v.serialize_attribute("redef_mclassdefs", to_mentity_refs(sort_entities(collect_redef_mclassdefs(view))))
                        v.serialize_attribute("imports", to_mentity_refs(in_importation.direct_greaters))
                end
        end
@@ -153,15 +162,16 @@ redef class MClass
                super
                v.serialize_attribute("mparameters", mparameters)
                if v isa FullJsonSerializer then
-                       var view = private_view
+                       var filter = new ModelFilter(private_visibility)
+                       var view = new ModelView(model, v.mainmodule, filter)
                        v.serialize_attribute("intro", to_mentity_ref(intro))
                        v.serialize_attribute("intro_mmodule", to_mentity_ref(intro_mmodule))
                        v.serialize_attribute("mpackage", to_mentity_ref(intro_mmodule.mpackage))
                        v.serialize_attribute("mclassdefs", to_mentity_refs(mclassdefs))
-                       v.serialize_attribute("all_mproperties", to_mentity_refs(collect_accessible_mproperties(view)))
-                       v.serialize_attribute("intro_mproperties", to_mentity_refs(collect_intro_mproperties(view)))
-                       v.serialize_attribute("redef_mproperties", to_mentity_refs(collect_redef_mproperties(view)))
-                       v.serialize_attribute("parents", to_mentity_refs(collect_parents(view)))
+                       v.serialize_attribute("all_mproperties", to_mentity_refs(sort_entities(collect_accessible_mproperties(view))))
+                       v.serialize_attribute("intro_mproperties", to_mentity_refs(sort_entities(collect_intro_mproperties(view))))
+                       v.serialize_attribute("redef_mproperties", to_mentity_refs(sort_entities(collect_redef_mproperties(view))))
+                       v.serialize_attribute("parents", to_mentity_refs(sort_entities(collect_parents(view))))
                end
        end
 end
@@ -172,15 +182,16 @@ redef class MClassDef
                v.serialize_attribute("is_intro", is_intro)
                v.serialize_attribute("mparameters", mclass.mparameters)
                if v isa FullJsonSerializer then
-                       var view = private_view
+                       var filter = new ModelFilter(private_visibility)
+                       var view = new ModelView(model, v.mainmodule, filter)
                        v.serialize_attribute("mmodule", to_mentity_ref(mmodule))
                        v.serialize_attribute("mclass", to_mentity_ref(mclass))
-                       v.serialize_attribute("mpropdefs", to_mentity_refs(mpropdefs))
-                       v.serialize_attribute("intro_mproperties", to_mentity_refs(intro_mproperties))
+                       v.serialize_attribute("mpropdefs", to_mentity_refs(sort_entities(mpropdefs)))
+                       v.serialize_attribute("intro_mproperties", to_mentity_refs(sort_entities(intro_mproperties)))
                        v.serialize_attribute("intro", to_mentity_ref(mclass.intro))
                        v.serialize_attribute("mpackage", to_mentity_ref(mmodule.mpackage))
-                       v.serialize_attribute("intro_mpropdefs", to_mentity_refs(collect_intro_mpropdefs(view)))
-                       v.serialize_attribute("redef_mpropdefs", to_mentity_refs(collect_redef_mpropdefs(view)))
+                       v.serialize_attribute("intro_mpropdefs", to_mentity_refs(sort_entities(collect_intro_mpropdefs(view))))
+                       v.serialize_attribute("redef_mpropdefs", to_mentity_refs(sort_entities(collect_redef_mpropdefs(view))))
                end
        end
 end
@@ -191,7 +202,7 @@ redef class MProperty
                if v isa FullJsonSerializer then
                        v.serialize_attribute("intro", to_mentity_ref(intro))
                        v.serialize_attribute("intro_mclassdef", to_mentity_ref(intro_mclassdef))
-                       v.serialize_attribute("mpropdefs", to_mentity_refs(mpropdefs))
+                       v.serialize_attribute("mpropdefs", to_mentity_refs(sort_entities(mpropdefs)))
                        v.serialize_attribute("intro_mclass", to_mentity_ref(intro_mclassdef.mclass))
                        v.serialize_attribute("mpackage", to_mentity_ref(intro_mclassdef.mmodule.mpackage))
                end
@@ -306,4 +317,7 @@ end
 # See MEntity::to_full_json.
 class FullJsonSerializer
        super JsonSerializer
+
+       # FIXME tmp use of the mainmodule, a PR is comming to clean all the JSON mess
+       var mainmodule: MModule
 end