src/model: fix mdoc_or_fallback for MClasses and MProperties
[nit.git] / src / model / model.nit
index 2005fca..3d9a364 100644 (file)
@@ -285,8 +285,9 @@ redef class MModule
                        if name == "Bool" and self.model.get_mclasses_by_name("Object") != null then
                                # Bool is injected because it is needed by engine to code the result
                                # of the implicit casts.
-                               var c = new MClass(self, name, null, enum_kind, public_visibility)
-                               var cladef = new MClassDef(self, c.mclass_type, new Location(null, 0,0,0,0))
+                               var loc = model.no_location
+                               var c = new MClass(self, name, loc, null, enum_kind, public_visibility)
+                               var cladef = new MClassDef(self, c.mclass_type, loc)
                                cladef.set_supertypes([object_type])
                                cladef.add_in_hierarchy
                                return c
@@ -386,6 +387,8 @@ class MClass
        # In Nit, the name of a class cannot evolve in refinements
        redef var name
 
+       redef var location
+
        # The canonical name of the class
        #
        # It is the name of the class prefixed by the full_name of the `intro_mmodule`
@@ -552,6 +555,8 @@ class MClass
 
        # Is `self` and abstract class?
        var is_abstract: Bool is lazy do return kind == abstract_kind
+
+       redef fun mdoc_or_fallback do return intro.mdoc_or_fallback
 end
 
 
@@ -588,8 +593,7 @@ class MClassDef
        # ENSURE: `bound_mtype.mclass == self.mclass`
        var bound_mtype: MClassType
 
-       # The origin of the definition
-       var location: Location
+       redef var location: Location
 
        # Internal name combining the module and the class
        # Example: "mymodule$MyClass"
@@ -1165,6 +1169,8 @@ class MClassType
 
        redef fun model do return self.mclass.intro_mmodule.model
 
+       redef fun location do return mclass.location
+
        # TODO: private init because strongly bounded to its mclass. see `mclass.mclass_type`
 
        # The formal arguments of the type
@@ -1370,6 +1376,8 @@ class MVirtualType
        # Its the definitions of this property that determine the bound or the virtual type.
        var mproperty: MVirtualTypeProp
 
+       redef fun location do return mproperty.location
+
        redef fun model do return self.mproperty.intro_mclassdef.mmodule.model
 
        redef fun lookup_bound(mmodule: MModule, resolved_receiver: MType): MType
@@ -1500,6 +1508,8 @@ class MParameterType
 
        redef fun model do return self.mclass.intro_mmodule.model
 
+       redef fun location do return mclass.location
+
        # The position of the parameter (0 for the first parameter)
        # FIXME: is `position` a better name?
        var rank: Int
@@ -1625,6 +1635,8 @@ abstract class MProxyType
        # The base type
        var mtype: MType
 
+       redef fun location do return mtype.location
+
        redef fun model do return self.mtype.model
        redef fun need_anchor do return mtype.need_anchor
        redef fun as_nullable do return mtype.as_nullable
@@ -1951,6 +1963,10 @@ abstract class MProperty
        # The (short) name of the property
        redef var name
 
+       redef var location
+
+       redef fun mdoc_or_fallback do return intro.mdoc_or_fallback
+
        # The canonical name of the property.
        #
        # It is currently the short-`name` prefixed by the short-name of the class and the full-name of the module.
@@ -2241,8 +2257,7 @@ abstract class MPropDef
        # The associated global property
        var mproperty: MPROPERTY
 
-       # The origin of the definition
-       var location: Location
+       redef var location: Location
 
        init
        do
@@ -2285,7 +2300,7 @@ abstract class MPropDef
                        # Just try to simplify each part
                        if mclassdef.mmodule.mpackage != mproperty.intro_mclassdef.mmodule.mpackage then
                                # precise "p::m" only if "p" != "r"
-                               res.append mproperty.intro_mclassdef.mmodule.full_name
+                               res.append mproperty.intro_mclassdef.mmodule.namespace_for(mproperty.visibility)
                                res.append "::"
                        else if mproperty.visibility <= private_visibility then
                                # Same package ("p"=="q"), but private visibility,