X-Git-Url: http://nitlanguage.org diff --git a/src/typing.nit b/src/typing.nit index d6f2a0a..c1720c1 100644 --- a/src/typing.nit +++ b/src/typing.nit @@ -237,19 +237,33 @@ private class TypeVisitor end var propdefs = mproperty.lookup_definitions(self.mmodule, unsafe_type) + var mpropdef if propdefs.length == 0 then self.modelbuilder.error(node, "Type error: no definition found for property {name} in {unsafe_type}") return null - else if propdefs.length > 1 then - self.modelbuilder.error(node, "Error: confliting property definitions for property {name} in {unsafe_type}: {propdefs.join(" ")}") - return null + else if propdefs.length == 1 then + mpropdef = propdefs.first + else + self.modelbuilder.warning(node, "Warning: confliting property definitions for property {name} in {unsafe_type}: {propdefs.join(" ")}") + mpropdef = mproperty.intro end - var mpropdef = propdefs.first var msignature = self.resolve_signature_for(mpropdef, recvtype, recv_is_self) - var callsite = new CallSite(node, recvtype, recv_is_self, mproperty, mpropdef, msignature) + var erasure_cast = false + var rettype = mpropdef.msignature.return_mtype + if not recv_is_self and rettype != null then + if rettype isa MNullableType then rettype = rettype.mtype + if rettype isa MParameterType then + var erased_rettype = msignature.return_mtype + assert erased_rettype != null + #node.debug("Erasure cast: Really a {rettype} but unsafely a {erased_rettype}") + erasure_cast = true + end + end + + var callsite = new CallSite(node, recvtype, recv_is_self, mproperty, mpropdef, msignature, erasure_cast) return callsite end @@ -379,6 +393,9 @@ class CallSite # The resolved signature for the receiver var msignature: MSignature + # Is a implicit cast required on erasure typing policy? + var erasure_cast: Bool + private fun check_signature(v: TypeVisitor, args: Array[AExpr]): Bool do return v.check_signature(self.node, args, self.mproperty.name, self.msignature) @@ -558,11 +575,13 @@ redef class AVardeclExpr end end - if mtype == null then - mtype = v.get_mclass(self, "Object").mclass_type.as_nullable + var decltype = mtype + if mtype == null or mtype isa MNullType then + decltype = v.get_mclass(self, "Object").mclass_type.as_nullable + if mtype == null then mtype = decltype end - variable.declared_type = mtype + variable.declared_type = decltype v.set_variable(self, variable, mtype) #debug("var {variable}: {mtype}") @@ -1394,10 +1413,8 @@ redef class ASuperExpr end v.error(self, "Error: No super method to call for {mproperty}.") return - else if superprops.length > 1 then - v.modelbuilder.warning(self, "Warning: NOT YET IMPLEMENTED: Conflicting super method to call for {mproperty}: {superprops.join(", ")}.") - return end + # FIXME: covariance of return type in linear extension? var superprop = superprops.first assert superprop isa MMethodDef