summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2017-03-22 14:13:26 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2017-03-22 14:59:47 +0100
commitad0530ec6d02290d1dfe8715cb2d000edc69711d (patch)
tree5936019e8563fd64620ccace4da5ff109bffe8f2
parentc0ff1adfb3c96c2effddadbae441ab2a81cb0751 (diff)
downloadvala-ad0530ec6d02290d1dfe8715cb2d000edc69711d.tar.gz
vala: Perform arguments-check against actual .end() method-signature
This results in error message referring to the actual expected signature. https://bugzilla.gnome.org/show_bug.cgi?id=684208
-rw-r--r--vala/valamethod.vala19
-rw-r--r--vala/valamethodcall.vala7
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;