X-Git-Url: http://nitlanguage.org diff --git a/src/syntax/mmbuilder.nit b/src/syntax/mmbuilder.nit index 2651efe..510f0fc 100644 --- a/src/syntax/mmbuilder.nit +++ b/src/syntax/mmbuilder.nit @@ -292,17 +292,17 @@ redef class MMImplicitInit end _super_init = base - var params = new Array[MMType] + var params = new Array[MMParam] if base != null then var sig = base.signature for i in [0..sig.arity[ do - params.add(sig[i]) + params.add(sig.params[i]) end end for a in unassigned_attributes do var sig = a.signature if sig == null then return # Broken attribute definition - params.add(sig.return_type.as(not null)) + params.add( new MMParam( sig.return_type.as(not null), once "recv".to_symbol)) end signature = new MMSignature(params, null, local_class.get_type) end @@ -457,7 +457,7 @@ redef class AModuledecl redef fun accept_class_builder(v) do if n_name.n_id.to_symbol != v.mmmodule.name then - v.error(n_name.n_id, "Error: Module name missmatch between {v.mmmodule.name} and {n_name.n_id.to_symbol}") + v.error(n_name.n_id, "Error: Module name mismatch between {v.mmmodule.name} and {n_name.n_id.to_symbol}") end end end @@ -653,6 +653,62 @@ redef class AStdClassdef do return n_formaldefs.length end + redef fun accept_class_verifier(v) + do + super + var glob = _local_class.global + if glob.intro == _local_class then + # Intro + glob.visibility_level = visibility_level + glob.is_interface = n_classkind.is_interface + glob.is_abstract = n_classkind.is_abstract + glob.is_enum = n_classkind.is_enum + if n_kwredef != null then + v.error(self, "Redef error: No class {name} is imported. Remove the redef keyword to define a new class.") + end + + for c in _local_class.cshe.direct_greaters do + var cg = c.global + if glob.is_interface then + if cg.is_enum then + v.error(self, "Special error: Interface {name} try to specialise enum class {c.name}.") + else if not cg.is_interface then + v.error(self, "Special error: Interface {name} try to specialise class {c.name}.") + end + else if glob.is_enum then + if not cg.is_interface and not cg.is_enum then + v.error(self, "Special error: Enum class {name} try to specialise class {c.name}.") + end + else + if cg.is_enum then + v.error(self, "Special error: Class {name} try to specialise enum class {c.name}.") + end + end + + end + return + end + + # Redef + + glob.check_visibility(v, self, v.mmmodule) + if n_kwredef == null then + v.error(self, "Redef error: {name} is an imported class. Add the redef keyword to refine it.") + return + end + + if glob.intro.arity != _local_class.arity then + v.error(self, "Redef error: Formal parameter arity mismatch; got {_local_class.arity}, expected {glob.intro.arity}.") + end + + if + not glob.is_interface and n_classkind.is_interface or + not glob.is_abstract and n_classkind.is_abstract or + not glob.is_enum and n_classkind.is_enum + then + v.error(self, "Redef error: cannot change kind of class {name}.") + end + end redef fun visibility_level do @@ -797,7 +853,7 @@ redef class APropdef else if not v.signature_builder.untyped_params.is_empty then v.error(v.signature_builder.untyped_params.first, "Error: Untyped parameter.") else - prop.signature = new MMSignature(new Array[MMType], null, v.local_class.get_type) + prop.signature = new MMSignature(new Array[MMParam], null, v.local_class.get_type) for clos in v.signature_builder.closure_decls do prop.signature.closures.add(clos.variable.closure) end @@ -887,11 +943,22 @@ redef class APropdef if s.arity != isig.arity then v.error(self, "Redef error: {prop.local_class}::{prop} redefines {ip.local_class}::{ip} with {isig.arity} parameter(s).") - else - for j in [0..s.arity[ do - if s[j] != isig[j] then - v.error(self, "Redef error: Expected {isig[j]} (as in {ip.local_class}::{ip}), got {s[j]} in {prop.local_class}::{prop}.") + else if s.arity > 0 then + if self isa AMethPropdef then + # A standard method + for j in [0..s.arity[ do + if s[j] != isig[j] then + v.error(n_signature.n_params[j], "Redef error: Expected {isig[j]}, as in {ip.local_class}::{ip}.") + end end + else if self isa AAttrPropdef then + # A write accessor + if s[0] != isig[0] then + v.error(n_type, "Redef error: Expected {isig[0]}, as in the parameter of {ip.local_class}::{ip}.") + end + + else + abort # end end @@ -902,13 +969,21 @@ redef class APropdef else if srt != null and isrt == null then v.error(self, "Redef error: The function {prop.local_class}::{prop} redefines the procedure {ip.local_class}::{ip}.") else if srt != null and isrt != null and not srt < isrt then - v.error(self, "Redef error: Expected {isrt} (as in {ip.local_class}::{ip}), got {srt} in {prop.local_class}::{prop}.") + var n: nullable ANode = null + if self isa AMethPropdef then + n = self.n_signature.n_type + else if self isa AAttrPropdef then + n = self.n_type + else if self isa ATypePropdef then + n = self.n_type + end + v.error(n, "Redef error: Expected {isrt}, as in {ip.local_class}::{ip}.") else if not s < isig and nberr == v.tc.error_count then # 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}), got {srt} in {prop.local_class}::{prop}.") + v.warning(self, "Redef warning: Expected {isrt}, as in {ip.local_class}::{ip}.") end end @@ -974,7 +1049,7 @@ redef class AAttrPropdef end var prop = prop - var signature = new MMSignature(new Array[MMType], t, v.local_class.get_type) + var signature = new MMSignature(new Array[MMParam], t, v.local_class.get_type) prop.signature = signature var visibility_level = n_visibility.level process_and_check(v, prop, n_id != null and n_kwredef != null, visibility_level) @@ -986,7 +1061,7 @@ redef class AAttrPropdef end if n_writable != null or n_id == null then var m = _writemethod.as(not null) - m.signature = new MMSignature(new Array[MMType].with_items(t), null, v.local_class.get_type) + m.signature = new MMSignature(new Array[MMParam].with_items(new MMParam(t, once "value".to_symbol)), null, v.local_class.get_type) var vl = visibility_level if n_id == null then if n_writable == null then vl = 3 else vl = n_writable.n_visibility.level # write accessor has a specific visibility @@ -1069,7 +1144,7 @@ redef class AMainMethPropdef redef fun process_and_check(v, prop, has_redef, visibility_level) do prop.global.visibility_level = visibility_level - prop.signature = new MMSignature(new Array[MMType], null, v.local_class.get_type) + prop.signature = new MMSignature(new Array[MMParam], null, v.local_class.get_type) # Disable all checks for main end end @@ -1105,7 +1180,7 @@ redef class ATypePropdef redef fun accept_property_verifier(v) do super - var signature = new MMSignature(new Array[MMType], n_type.get_stype(v), v.local_class.get_type) + var signature = new MMSignature(new Array[MMParam], n_type.get_stype(v), v.local_class.get_type) prop.signature = signature var visibility_level = n_visibility.level process_and_check(v, prop, n_kwredef != null, visibility_level) @@ -1134,8 +1209,7 @@ private class MethidAccumulator end redef class AMethid - # Method name - readable var _name: nullable Symbol + redef readable var _name: nullable Symbol redef fun accept_property_builder(v) do @@ -1158,9 +1232,9 @@ redef class ASignature return end else if not v.signature_builder.params.is_empty or n_type != null then - var pars = new Array[MMType] + var pars = new Array[MMParam] for p in v.signature_builder.params do - pars.add(p.stype.as(not null)) + pars.add( new MMParam( p.stype.as(not null), p.n_id.to_symbol ) ) end var ret: nullable MMType = null if n_type != null then @@ -1248,14 +1322,14 @@ redef class AClosureDecl end var sig = v.signature_builder.signature if sig == null then - sig = new MMSignature(new Array[MMType], null, v.local_class.get_type) + sig = new MMSignature(new Array[MMParam], null, v.local_class.get_type) end if sig.return_type != null and n_kwbreak != null then v.error(self, "Syntax Error: A break block cannot have a return value.") end # Add the finalizer to the closure signature - var finalize_sig = new MMSignature(new Array[MMType], null, v.mmmodule.type_any) # FIXME should be no receiver + var finalize_sig = new MMSignature(new Array[MMParam], null, v.mmmodule.type_any) # FIXME should be no receiver var finalizer_clos = new MMClosure(once ("break".to_symbol), finalize_sig, false, true) sig.closures.add(finalizer_clos)