nclassdef
.In case of error, return null
.
REQUIRE: nmodule.mmodule != null
REQUIRE: nclassdef.mclass != null
# Determine the type parameter bounds for `nclassdef`.
#
# In case of error, return `null`.
#
# REQUIRE: `nmodule.mmodule != null`
# REQUIRE: `nclassdef.mclass != null`
private fun build_a_bound_mtype(nmodule: AModule, nclassdef: AClassdef): nullable MClassType
do
var mmodule = nmodule.mmodule.as(not null)
var mclass = nclassdef.mclass.as(not null)
var bounds = new Array[MType]
if nclassdef isa AStdClassdef and mclass.arity > 0 then
var objectclass = try_get_mclass_by_name(nmodule, mmodule, "Object")
# Revolve bound for formal parameters
for i in [0..mclass.arity[ do
if nclassdef.n_formaldefs.is_empty then
# Inherit the bound
var bound = mclass.intro.bound_mtype.arguments[i]
bounds.add(bound)
continue
end
var nfd = nclassdef.n_formaldefs[i]
var pname = mclass.mparameters[i].name
if nfd.n_id.text != pname then
error(nfd.n_id, "Error: formal parameter type #{i} `{nfd.n_id.text}` must be named `{pname}` as in the original definition in module `{mclass.intro.mmodule}`.")
end
var nfdt = nfd.n_type
if nfdt != null then
var bound = resolve_mtype3_unchecked(mmodule, null, null, nfdt, false)
if bound == null then return null # Forward error
if bound.need_anchor then
# No F-bounds!
error(nfd, "Error: formal parameter type `{pname}` bounded with a formal parameter type.")
else
bounds.add(bound)
nfd.bound = bound
end
else if mclass.mclassdefs.is_empty then
if objectclass == null then
error(nfd, "Error: formal parameter type `{pname}` unbounded but no `Object` class exists.")
return null
end
# No bound, then implicitely bound by nullable Object
var bound = objectclass.mclass_type.as_nullable
bounds.add(bound)
nfd.bound = bound
else
# Inherit the bound
var bound = mclass.intro.bound_mtype.arguments[i]
bounds.add(bound)
nfd.bound = bound
end
end
end
return mclass.get_mtype(bounds)
end
src/modelize/modelize_class.nit:187,2--246,4