X-Git-Url: http://nitlanguage.org diff --git a/src/modelize/modelize_class.nit b/src/modelize/modelize_class.nit index b7fd877..8a49296 100644 --- a/src/modelize/modelize_class.nit +++ b/src/modelize/modelize_class.nit @@ -20,6 +20,7 @@ module modelize_class import modelbuilder redef class ToolContext + # Run `AModule::build_classes` on each module var modelize_class_phase: Phase = new ModelizeClassPhase(self, null) end @@ -96,6 +97,18 @@ redef class ModelBuilder error(nclassdef, "Redef error: No imported class {name} to refine.") return end + + # Check for conflicting class full-names in the project + if mmodule.mgroup != null and mvisibility >= protected_visibility then + var mclasses = model.get_mclasses_by_name(name) + if mclasses != null then for other in mclasses do + if other.intro_mmodule.mgroup != null and other.intro_mmodule.mgroup.mproject == mmodule.mgroup.mproject then + error(nclassdef, "Error: A class named `{other.full_name}` is already defined in module `{other.intro_mmodule}` at {other.intro.location}.") + break + end + end + end + mclass = new MClass(mmodule, name, names, mkind, mvisibility) #print "new class {mclass}" else if nclassdef isa AStdClassdef and nmodule.mclass2nclassdef.has_key(mclass) then @@ -168,6 +181,10 @@ redef class ModelBuilder warning(nfdt, "useless-bound", "Warning: Useless formal parameter type since `{bound}` cannnot have subclasses.") end else if mclass.mclassdefs.is_empty then + if objectclass == null then + error(nfd, "Error: Formal parameter type `{pname}' unbounded but no Object class exist.") + return + end # No bound, then implicitely bound by nullable Object var bound = objectclass.mclass_type.as_nullable bounds.add(bound) @@ -258,7 +275,6 @@ redef class ModelBuilder private fun check_supertypes(nmodule: AModule, nclassdef: AClassdef) do var mmodule = nmodule.mmodule.as(not null) - var objectclass = try_get_mclass_by_name(nmodule, mmodule, "Object") var mclass = nclassdef.mclass.as(not null) var mclassdef = nclassdef.mclassdef.as(not null) @@ -279,9 +295,8 @@ redef class ModelBuilder nmodule.build_classes_is_done = true var mmodule = nmodule.mmodule.as(not null) for imp in mmodule.in_importation.direct_greaters do - - if not mmodule2nmodule.has_key(imp) then continue - build_classes(mmodule2nmodule[imp]) + var nimp = mmodule2node(imp) + if nimp != null then build_classes(nimp) end if errcount != toolcontext.error_count then return @@ -408,9 +423,8 @@ redef class ModelBuilder end end - # Register the nclassdef associated to each mclassdef - # FIXME: why not refine the `MClassDef` class with a nullable attribute? - var mclassdef2nclassdef: HashMap[MClassDef, AClassdef] = new HashMap[MClassDef, AClassdef] + # Registration of the nclassdef associated to each mclassdef + private var mclassdef2nclassdef = new HashMap[MClassDef, AClassdef] # Return the static type associated to the node `ntype`. # `mmodule` and `mclassdef` is the context where the call is made (used to understand formal types) @@ -436,19 +450,19 @@ redef class ModelBuilder end # Check parameter type - if mclassdef != null and mclassdef.parameter_names.has(name) then - if not ntype.n_types.is_empty then - error(ntype, "Type error: formal type {name} cannot have formal parameters.") - end - for i in [0..mclassdef.parameter_names.length[ do - if mclassdef.parameter_names[i] == name then - res = mclassdef.mclass.mclass_type.arguments[i] - if ntype.n_kwnullable != null then res = res.as_nullable - ntype.mtype = res - return res + if mclassdef != null then + for p in mclassdef.mclass.mparameters do + if p.name != name then continue + + if not ntype.n_types.is_empty then + error(ntype, "Type error: formal type {name} cannot have formal parameters.") end + + res = p + if ntype.n_kwnullable != null then res = res.as_nullable + ntype.mtype = res + return res end - abort end # Check class