diff options
-rw-r--r-- | vala/valamethod.vala | 19 | ||||
-rw-r--r-- | vala/valamethodcall.vala | 7 |
2 files changed, 26 insertions, 0 deletions
diff --git a/vala/valamethod.vala b/vala/valamethod.vala index 878946890..9988c6628 100644 --- a/vala/valamethod.vala +++ b/vala/valamethod.vala @@ -196,6 +196,7 @@ public class Vala.Method : Subroutine, Callable { private bool base_methods_valid; Method? callback_method; + Method? end_method; // only valid for closures List<LocalVariable> captured_variables; @@ -957,6 +958,24 @@ public class Vala.Method : Subroutine, Callable { return n; } + public Method get_end_method () { + assert (this.coroutine); + + if (end_method == null) { + end_method = new Method ("end", return_type, source_reference); + end_method.access = SymbolAccessibility.PUBLIC; + end_method.external = true; + end_method.owner = scope; + foreach (var param in get_async_end_parameters ()) { + end_method.add_parameter (param.copy ()); + } + foreach (var param in get_type_parameters ()) { + end_method.add_type_parameter (param); + } + } + return end_method; + } + public Method get_callback_method () { assert (this.coroutine); diff --git a/vala/valamethodcall.vala b/vala/valamethodcall.vala index f6203160c..cefc65131 100644 --- a/vala/valamethodcall.vala +++ b/vala/valamethodcall.vala @@ -573,6 +573,13 @@ public class Vala.MethodCall : Expression { value_type = formal_value_type.get_actual_type (target_object_type, method_type_args, this); } } + // replace method-type if needed for proper argument-check in semantic-analyser + if (m != null && m.coroutine) { + var ma = (MemberAccess) call; + if (ma.member_name == "end") { + mtype = new MethodType (m.get_end_method ()); + } + } } else if (mtype is ObjectType) { // constructor var cl = (Class) ((ObjectType) mtype).type_symbol; |