+ redef fun variable: ClosureVariable do return _variable.as(not null)
+ var _variable: nullable ClosureVariable
+
+ redef fun accept_property_verifier(v)
+ do
+ var old_signature_builder = v.signature_builder
+ v.signature_builder = new SignatureBuilder
+ super
+ if v.signature_builder.has_error_occured then
+ return
+ end
+ var sig = v.signature_builder.signature
+ if sig == null then
+ sig = new MMSignature(new Array[MMType], 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 finalizer_clos = new MMClosure(once ("break".to_symbol), finalize_sig, false, true)
+ sig.closures.add(finalizer_clos)
+
+ var name = n_id.to_symbol
+ 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)}.")
+ return
+ end
+ end
+ v.signature_builder = old_signature_builder
+ _position = old_signature_builder.closure_decls.length
+ old_signature_builder.closure_decls.add(self)
+ _variable = new ClosureVariable(n_id.to_symbol, n_id, clos)
+ end