X-Git-Url: http://nitlanguage.org diff --git a/src/model/model.nit b/src/model/model.nit index 6dbcda1..ff7bb48 100644 --- a/src/model/model.nit +++ b/src/model/model.nit @@ -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