+
+ # For parameters, type is always useless in a redef.
+ # For return type, type is useless if not covariant with introduction.
+ redef fun check_repeated_types(modelbuilder) do
+ var mpropdef = self.mpropdef
+ if mpropdef == null then return
+ if mpropdef.is_intro or n_signature == null then return
+ # check params
+ for param in n_signature.n_params do
+ if param.n_type != null then
+ modelbuilder.advice(param.n_type, "useless-signature", "Warning: useless type repetition on parameter `{param.n_id.text}` for redefined method `{mpropdef.name}`")
+ end
+ end
+ # get intro
+ var intro = mpropdef.mproperty.intro
+ var n_intro = modelbuilder.mpropdef2npropdef.get_or_null(intro)
+ if n_intro == null or not n_intro isa AMethPropdef then return
+ # check return type
+ var ret_type = n_signature.ret_type
+ if ret_type != null and ret_type == n_intro.n_signature.ret_type then
+ modelbuilder.advice(n_signature.n_type, "useless-signature", "Warning: useless return type repetition for redefined method `{mpropdef.name}`")
+ end
+ end
+end
+
+redef class AMethid
+ # Is a return required?
+ #
+ # * True for operators and brackets.
+ # * False for id and assignment.
+ fun return_is_mandatory: Bool do return true
+
+ # Can the last parameter be special like a vararg?
+ #
+ # * False for operators: the last one is in fact the only one.
+ # * False for assignments: it is the right part of the assignment.
+ # * True for ids and brackets.
+ fun accept_special_last_parameter: Bool do return false
+
+ # The minimum required number of parameters.
+ #
+ # * 1 for binary operators
+ # * 1 for brackets
+ # * 1 for assignments
+ # * 2 for bracket assignments
+ # * 0 for ids
+ fun min_arity: Int do return 1
+
+ # Is the `self` a binary operator?
+ fun is_binary: Bool do return true
+end
+
+redef class AIdMethid
+ redef fun return_is_mandatory do return false
+ redef fun accept_special_last_parameter do return true
+ redef fun min_arity do return 0
+ redef fun is_binary do return false
+end
+
+redef class ABraMethid
+ redef fun accept_special_last_parameter do return true
+ redef fun is_binary do return false
+end
+
+redef class ABraassignMethid
+ redef fun return_is_mandatory do return false
+ redef fun min_arity do return 2
+ redef fun is_binary do return false
+end
+
+redef class AAssignMethid
+ redef fun return_is_mandatory do return false
+ redef fun is_binary do return false