nitls: parse options before instantiating modelbuilder
[nit.git] / src / modelize_class.nit
index e96877d..a55d4c4 100644 (file)
@@ -76,6 +76,10 @@ redef class ModelBuilder
 
                var mclass = try_get_mclass_by_name(nclassdef, mmodule, name)
                if mclass == null then
+                       if nclassdef isa AStdClassdef and nclassdef.n_kwredef != null then
+                               error(nclassdef, "Redef error: No imported class {name} to refine.")
+                               return
+                       end
                        mclass = new MClass(mmodule, name, arity, mkind, mvisibility)
                        #print "new class {mclass}"
                else if nclassdef isa AStdClassdef and nmodule.mclass2nclassdef.has_key(mclass) then
@@ -116,6 +120,10 @@ redef class ModelBuilder
                                        error(nfd, "Error: A formal parameter type `{ptname}' already exists")
                                        return
                                end
+                               for c in ptname.chars do if c >= 'a' and c<= 'z' then
+                                       warning(nfd, "Warning: lowercase in the formal parameter type {ptname}")
+                                       break
+                               end
                                names.add(ptname)
                                nfd.mtype = mclass.mclass_type.arguments[i].as(MParameterType)
                        end
@@ -153,6 +161,11 @@ redef class ModelBuilder
                nclassdef.mclassdef = mclassdef
                self.mclassdef2nclassdef[mclassdef] = nclassdef
 
+               if nclassdef isa AStdClassdef then
+                       var ndoc = nclassdef.n_doc
+                       if ndoc != null then mclassdef.mdoc = ndoc.to_mdoc
+               end
+
                if mclassdef.is_intro then
                        self.toolcontext.info("{mclassdef} introduces new {mclass.kind} {mclass.full_name}", 3)
                else
@@ -169,7 +182,13 @@ redef class ModelBuilder
                var mclass = nclassdef.mclass.as(not null)
                var mclassdef = nclassdef.mclassdef.as(not null)
 
+               # Do we need to specify Object as a super class?
                var specobject = true
+
+               # Do we need to specify Pointer as a super class? (is only valid
+               # if `nclassdef` is an extern class)
+               var specpointer = true
+
                var supertypes = new Array[MClassType]
                if nclassdef isa AStdClassdef then
                        for nsc in nclassdef.n_superclasses do
@@ -183,16 +202,16 @@ redef class ModelBuilder
                                end
                                supertypes.add mtype
                                #print "new super : {mclass} < {mtype}"
+                               if mtype.mclass.kind == extern_kind then specpointer = false
                        end
                end
-               if specobject and mclassdef.is_intro then
-                       if mclass.kind == extern_kind then
-                               if mclass.name == "Pointer" then
-                                       supertypes.add objectclass.mclass_type
-                               else
-                                       supertypes.add pointerclass.mclass_type
-                               end
-                       else if mclass.name != "Object" and objectclass != null then
+
+               if mclassdef.is_intro and objectclass != null then
+                       if mclass.kind == extern_kind and mclass.name != "Pointer" then
+                               # it is an extern class, but not a Pointer
+                               if specpointer then supertypes.add pointerclass.mclass_type
+                       else if specobject and mclass.name != "Object" then
+                               # it is a standard class without super class (but is not Object)
                                supertypes.add objectclass.mclass_type
                        end
                end