Rename REAMDE to README.md
[nit.git] / src / modelbuilder_base.nit
index 9995338..8e1e7c6 100644 (file)
@@ -74,13 +74,23 @@ class ModelBuilder
                        if res == null then
                                res = mclass
                        else
-                               error(anode, "Ambigous class name '{name}'; conflict between {mclass.full_name} and {res.full_name}")
+                               error(anode, "Error: ambiguous class name `{name}`; conflict between `{mclass.full_name}` and `{res.full_name}`.")
                                return null
                        end
                end
                return res
        end
 
+       # Like `try_get_mclass_by_name` but display an error message when the class is not found
+       fun get_mclass_by_name(node: ANode, mmodule: MModule, name: String): nullable MClass
+       do
+               var mclass = try_get_mclass_by_name(node, mmodule, name)
+               if mclass == null then
+                       error(node, "Type Error: missing primitive class `{name}'.")
+               end
+               return mclass
+       end
+
        # Return a property named `name` on the type `mtype` visible in the module `mmodule`.
        # Visibility in modules is correctly handled.
        # Protected properties are returned (it is up to the caller to check and reject protected properties).
@@ -158,7 +168,7 @@ class ModelBuilder
                        assert ress.length > 1
                        var s = new Array[String]
                        for mprop in ress do s.add mprop.full_name
-                       self.error(anode, "Ambigous property name '{name}' for {mtype}; conflict between {s.join(" and ")}")
+                       self.error(anode, "Error: ambiguous property name `{name}` for `{mtype}`; conflict between {s.join(" and ")}.")
                end
 
                self.try_get_mproperty_by_name2_cache[mmodule, mtype, name] = res
@@ -208,7 +218,7 @@ class ModelBuilder
                if res == null then
                        var l = null
                        if n != null then l = n.hot_location
-                       self.toolcontext.fatal_error(l, "Fatal Error: {recv} must have a property named {name}.")
+                       self.toolcontext.fatal_error(l, "Fatal Error: `{recv}` must have a property named `{name}`.")
                        abort
                end
                return res
@@ -228,7 +238,7 @@ class ModelBuilder
                        var prop = try_get_mproperty_by_name(ntype, mclassdef, name).as(nullable MVirtualTypeProp)
                        if prop != null then
                                if not ntype.n_types.is_empty then
-                                       error(ntype, "Type error: formal type {name} cannot have formal parameters.")
+                                       error(ntype, "Type Error: formal type `{name}` cannot have formal parameters.")
                                end
                                res = prop.mvirtualtype
                                if ntype.n_kwnullable != null then res = res.as_nullable
@@ -243,7 +253,7 @@ class ModelBuilder
                                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.")
+                                       error(ntype, "Type Error: formal type `{name}` cannot have formal parameters.")
                                end
 
                                res = p
@@ -259,11 +269,11 @@ class ModelBuilder
                        var arity = ntype.n_types.length
                        if arity != mclass.arity then
                                if arity == 0 then
-                                       error(ntype, "Type error: '{name}' is a generic class.")
+                                       error(ntype, "Type Error: `{mclass.signature_to_s}` is a generic class.")
                                else if mclass.arity == 0 then
-                                       error(ntype, "Type error: '{name}' is not a generic class.")
+                                       error(ntype, "Type Error: `{name}` is not a generic class.")
                                else
-                                       error(ntype, "Type error: '{name}' has {mclass.arity} parameters ({arity} are provided).")
+                                       error(ntype, "Type Error: expected {mclass.arity} formal argument(s) for `{mclass.signature_to_s}`; got {arity}.")
                                end
                                return null
                        end
@@ -287,7 +297,7 @@ class ModelBuilder
                end
 
                # If everything fail, then give up :(
-               error(ntype, "Type error: class {name} not found in module {mmodule}.")
+               error(ntype, "Error: class `{name}` not found in module `{mmodule}`.")
                return null
        end
 
@@ -305,14 +315,16 @@ class ModelBuilder
                if mtype isa MGenericType then
                        var mclass = mtype.mclass
                        for i in [0..mclass.arity[ do
-                               var bound = mclass.intro.bound_mtype.arguments[i]
+                               var intro = mclass.try_intro
+                               if intro == null then return null # skip error
+                               var bound = intro.bound_mtype.arguments[i]
                                var nt = ntype.n_types[i]
                                var mt = resolve_mtype(mmodule, mclassdef, nt)
                                if mt == null then return null # forward error
                                var anchor
                                if mclassdef != null then anchor = mclassdef.bound_mtype else anchor = null
                                if not check_subtype(nt, mmodule, anchor, mt, bound) then
-                                       error(nt, "Type error: expected {bound}, got {mt}")
+                                       error(nt, "Type Error: expected `{bound}`, got `{mt}`.")
                                        return null
                                end
                        end