rename 'package' to 'module'
[nit.git] / src / syntax / mmbuilder.nit
index 8999b01..2df1ad2 100644 (file)
@@ -17,7 +17,7 @@
 # Build MM entity from NIT AST and check conformance of these entities.
 # This module introduce specific MM class (MMSrcXXX) that specialize the abstract one from metamodel
 #
-package mmbuilder
+module mmbuilder
 
 import syntax_base
 private import primitive_info
@@ -1033,8 +1033,7 @@ redef class APropdef
                                # Systematic fallback for conformance check
                                v.error(self, "Redef error: Incompatible redefinition of {ip.local_class}::{ip} with {prop.local_class}::{prop}")
                        else if srt != null and isrt != null and srt != isrt and prop isa MMAttribute then
-                               # FIXME: To remove
-                               v.warning(self, "Redef warning: Expected {isrt}, as in {ip.local_class}::{ip}.")
+                               v.error(self, "Redef error: Expected {isrt}, as in {ip.local_class}::{ip}.")
                        end
                end
 
@@ -1090,11 +1089,15 @@ redef class AAttrPropdef
        redef fun accept_property_verifier(v)
        do
                super
-               var t: MMType
+               var t: nullable MMType = null
                if n_type != null then
                        var t0 = n_type.get_stype(v)
                        if t0 != null then t = t0 else return
-               else
+               else if n_expr != null then
+                       t = n_expr.get_easy_stype(v)
+               end
+
+               if t == null then
                        v.error(self, "Not yet implemented: Attribute definition {prop.local_class}::{prop} requires an explicit type.")
                        return
                end
@@ -1108,7 +1111,7 @@ redef class AAttrPropdef
                        var m = _readmethod.as(not null)
                        m.signature = signature
                        process_and_check(v, m, (n_readable != null and n_readable.n_kwredef != null) or (n_id == null and n_kwredef != null), visibility_level)
-                       n_type.check_visibility(v, m)
+                       if n_type != null then n_type.check_visibility(v, m)
                end
                if n_writable != null or n_id == null then
                        var m = _writemethod.as(not null)
@@ -1118,7 +1121,7 @@ redef class AAttrPropdef
                                if n_writable == null then vl = 3 else vl = n_writable.n_visibility.level # write accessor has a specific visibility
                        end
                        process_and_check(v, m, n_writable != null and n_writable.n_kwredef != null, vl)
-                       n_type.check_visibility(v, m)
+                       if n_type != null then n_type.check_visibility(v, m)
                end
        end
 
@@ -1388,7 +1391,7 @@ redef class AClosureDecl
                var clos = new MMClosure(name, sig, n_kwbreak != null, n_expr != null)
                for c in old_signature_builder.closure_decls do
                        if c.n_id.to_symbol == name then
-                               v.error(n_id, "A closure '!{name}' already defined at {c.n_id.location.relative_to(n_id.location)}.")
+                               v.error(n_id, "Error: A closure '!{name}' already defined at {c.n_id.location.relative_to(n_id.location)}.")
                                return
                        end
                end
@@ -1420,4 +1423,30 @@ redef class AExpr
        redef fun accept_class_builder(v) do end
        redef fun accept_property_builder(v) do end
        redef fun accept_property_verifier(v) do end
+
+       private fun get_easy_stype(v:PropertyVerifierVisitor) : nullable MMType do return null
+end
+
+redef class ABoolExpr
+       redef fun get_easy_stype(v) do return v.type_bool
+end
+
+redef class AStringExpr
+       redef fun get_easy_stype(v) do return v.type_string
+end
+
+redef class ACharExpr
+       redef fun get_easy_stype(v) do return v.type_char
+end
+
+redef class AIntExpr
+       redef fun get_easy_stype(v) do return v.type_int
+end
+
+redef class AFloatExpr
+       redef fun get_easy_stype(v) do return v.type_float
+end
+
+redef class ANewExpr
+       redef fun get_easy_stype(v) do return n_type.get_stype(v)
 end