+ # The real arguments used (after star transformation) (once computed)
+ readable attr _arguments: Array[PExpr]
+
+ # Check the conformity of a set of arguments `raw_args' to a signature.
+ private meth process_signature(v: TypingVisitor, psig: MMSignature, name: Symbol, raw_args: Array[PExpr]): Array[PExpr]
+ do
+ var par_vararg = psig.vararg_rank
+ var par_arity = psig.arity
+ var raw_arity: Int
+ if raw_args == null then raw_arity = 0 else raw_arity = raw_args.length
+ if par_arity > raw_arity or (par_arity != raw_arity and par_vararg == -1) then
+ v.error(self, "Error: '{name}' arity missmatch.")
+ return null
+ end
+ var arg_idx = 0
+ var args = new Array[PExpr]
+ for par_idx in [0..par_arity[ do
+ var a: PExpr
+ var par_type = psig[par_idx]
+ if par_idx == par_vararg then
+ var star = new Array[PExpr]
+ for i in [0..(raw_arity-par_arity)] do
+ a = raw_args[arg_idx]
+ v.check_conform_expr(a, par_type)
+ star.add(a)
+ arg_idx = arg_idx + 1
+ end
+ var aa = new AArrayExpr.init_aarrayexpr(star)
+ aa.do_typing(v, par_type)
+ a = aa
+ else
+ a = raw_args[arg_idx]
+ v.check_conform_expr(a, par_type)
+ arg_idx = arg_idx + 1
+ end
+ args.add(a)
+ end
+ return args
+ end
+
+ # Check the conformity of a set of defined closures
+ private meth process_closures(v: TypingVisitor, psig: MMSignature, name: Symbol, cd: Array[PClosureDef]): MMType
+ do
+ var t = psig.return_type
+ var cs = psig.closures # Declared closures
+ var min_arity = 0
+ for c in cs do
+ if not c.is_optional then min_arity += 1
+ end
+ if cd != null then
+ if cs.length == 0 then
+ v.error(self, "Error: {name} does not require blocks.")
+ else if cd.length > cs.length or cd.length < min_arity then
+ v.error(self, "Error: {name} requires {cs.length} blocks, {cd.length} found.")
+ else
+ # Initialize the break list if a value is required for breaks (ie. if the method is a function)
+ var break_list: Array[ABreakExpr] = null
+ if t != null then break_list = new Array[ABreakExpr]
+
+ # Process each closure definition
+ for i in [0..cd.length[ do
+ var csi = cs[i]
+ var cdi = cd[i]
+ var esc = new EscapableClosure(cdi, csi, break_list)
+ v.escapable_ctx.push(esc)
+ cdi.accept_typing2(v, esc)
+ v.escapable_ctx.pop
+ end
+
+ # Check break type conformity
+ if break_list != null then
+ t = v.check_conform_multiexpr(t, break_list)
+ end
+ end
+ else if min_arity != 0 then
+ v.error(self, "Error: {name} requires {cs.length} blocks.")
+ end
+ return t
+ end
+end
+
+class AAbsSendExpr
+special AAbsAbsSendExpr