]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: Perform arguments-check against actual .end() method-signature
authorRico Tzschichholz <ricotz@ubuntu.com>
Wed, 22 Mar 2017 13:13:26 +0000 (14:13 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Wed, 22 Mar 2017 13:59:47 +0000 (14:59 +0100)
This results in error message referring to the actual expected signature.

https://bugzilla.gnome.org/show_bug.cgi?id=684208

vala/valamethod.vala
vala/valamethodcall.vala

index 8789468903558001315f25e11b1b5003b3a0077e..9988c6628b38a789f8c4b57cd90896f15eb3a0d8 100644 (file)
@@ -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);
 
index f6203160c296f2c9d47f15f9222a5ac7e42c36a3..cefc65131afea4ca27aced6d48d87365612ca305 100644 (file)
@@ -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;