Rename REAMDE to README.md
[nit.git] / src / model / model.nit
index 62c3db4..ff7bb48 100644 (file)
@@ -380,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
@@ -1694,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
 
@@ -1739,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
@@ -1795,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
@@ -1810,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