Rename REAMDE to README.md
[nit.git] / src / model / model.nit
index 6dbcda1..ff7bb48 100644 (file)
@@ -251,7 +251,9 @@ redef class MModule
        fun get_primitive_class(name: String): MClass
        do
                var cla = self.model.get_mclasses_by_name(name)
-               if cla == null then
+               # Filter classes by introducing module
+               if cla != null then cla = [for c in cla do if self.in_importation <= c.intro_mmodule then c]
+               if cla == null or cla.is_empty then
                        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.
@@ -261,11 +263,11 @@ redef class MModule
                                cladef.add_in_hierarchy
                                return c
                        end
-                       print("Fatal Error: no primitive class {name}")
+                       print("Fatal Error: no primitive class {name} in {self}")
                        exit(1)
                end
                if cla.length != 1 then
-                       var msg = "Fatal Error: more than one primitive class {name}:"
+                       var msg = "Fatal Error: more than one primitive class {name} in {self}:"
                        for c in cla do msg += " {c.full_name}"
                        print msg
                        #exit(1)
@@ -378,6 +380,29 @@ class MClass
        # is empty if the class is not generic
        var mparameters = new Array[MParameterType]
 
+       # A string version of the signature a generic class.
+       #
+       # eg. `Map[K: nullable Object, V: nullable Object]`
+       #
+       # If the class in non generic the name is just given.
+       #
+       # eg. `Object`
+       fun signature_to_s: String
+       do
+               if arity == 0 then return name
+               var res = new FlatBuffer
+               res.append name
+               res.append "["
+               for i in [0..arity[ do
+                       if i > 0 then res.append ", "
+                       res.append mparameters[i].name
+                       res.append ": "
+                       res.append intro.bound_mtype.arguments[i].to_s
+               end
+               res.append "]"
+               return res.to_s
+       end
+
        # Initialize `mparameters` from their names.
        protected fun setup_parameter_names(parameter_names: nullable Array[String]) is
                autoinit
@@ -433,8 +458,17 @@ class MClass
        #
        # Warning: such a definition may not exist in the early life of the object.
        # In this case, the method will abort.
+       #
+       # Use `try_intro` instead
        var intro: MClassDef is noinit
 
+       # The definition that introduces the class or null if not yet known.
+       #
+       # See `intro`
+       fun try_intro: nullable MClassDef do
+               if isset _intro then return _intro else return null
+       end
+
        # Return the class `self` in the class hierarchy of the module `mmodule`.
        #
        # SEE: `MModule::flatten_mclass_hierarchy`
@@ -627,7 +661,7 @@ class MClassDef
        var in_hierarchy: nullable POSetElement[MClassDef] = null
 
        # Is the definition the one that introduced `mclass`?
-       fun is_intro: Bool do return mclass.intro == self
+       fun is_intro: Bool do return isset mclass._intro and mclass.intro == self
 
        # All properties introduced by the classdef
        var intro_mproperties = new Array[MProperty]
@@ -1683,6 +1717,15 @@ class MSignature
        # The each parameter (in order)
        var mparameters: Array[MParameter]
 
+       # Returns a parameter named `name`, if any.
+       fun mparameter_by_name(name: String): nullable MParameter
+       do
+               for p in mparameters do
+                       if p.name == name then return p
+               end
+               return null
+       end
+
        # The return type (null for a procedure)
        var return_mtype: nullable MType
 
@@ -1728,9 +1771,25 @@ class MSignature
        # Example: for "(a: Int, b: Bool..., c: Char)" #-> vararg_rank=1
        var vararg_rank: Int is noinit
 
-       # The number or parameters
+       # The number of parameters
        fun arity: Int do return mparameters.length
 
+       # The number of non-default parameters
+       #
+       # The number of default parameters is then `arity-min_arity`.
+       #
+       # Note that there cannot be both varargs and default prameters, thus
+       # if `vararg_rank != -1` then `min_arity` == `arity`
+       fun min_arity: Int
+       do
+               if vararg_rank != -1 then return arity
+               var res = 0
+               for p in mparameters do
+                       if not p.is_default then res += 1
+               end
+               return res
+       end
+
        redef fun to_s
        do
                var b = new FlatBuffer
@@ -1784,6 +1843,9 @@ class MParameter
        # Is the parameter a vararg?
        var is_vararg: Bool
 
+       # Is the parameter a default one?
+       var is_default: Bool
+
        redef fun to_s
        do
                if is_vararg then
@@ -1799,7 +1861,7 @@ class MParameter
        do
                if not self.mtype.need_anchor then return self
                var newtype = self.mtype.resolve_for(mtype, anchor, mmodule, cleanup_virtual)
-               var res = new MParameter(self.name, newtype, self.is_vararg)
+               var res = new MParameter(self.name, newtype, self.is_vararg, self.is_default)
                return res
        end