]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: Improve error message for invalid handler of dynamic signal
authorLorenz Wildberg <lorenz@wild-fisch.de>
Fri, 29 Oct 2021 10:50:30 +0000 (11:50 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Thu, 11 Nov 2021 14:50:03 +0000 (15:50 +0100)
tests/Makefile.am
tests/objects/signals-dynamic-lambda-handler.test [new file with mode: 0644]
vala/valamemberaccess.vala

index cee1f693b9c071cc19d0954cd6cf771dc94b6b94..d0062f879ae856d0a039e4c5b91031a2edbc5db3 100644 (file)
@@ -534,6 +534,7 @@ TESTS = \
        objects/signals-delegate.vala \
        objects/signals-delegate-parameter.vala \
        objects/signals-dymanic-invalid-handler.test \
+       objects/signals-dynamic-lambda-handler.test \
        objects/signals-error-marshal.vala \
        objects/signals-fundamental-return.vala \
        objects/signals-gobject-return.vala \
diff --git a/tests/objects/signals-dynamic-lambda-handler.test b/tests/objects/signals-dynamic-lambda-handler.test
new file mode 100644 (file)
index 0000000..ae86c9f
--- /dev/null
@@ -0,0 +1,8 @@
+Invalid Code
+
+void main () {
+       dynamic Object? foo = null;
+       foo.on_bar.connect ((baz) => {
+               // lambdas are not allowed
+       });
+}
index 9120db250c749405f061ca7d082e6ba8cc69c086..0df5d32a9a2b8afd54119f261d1621b143dd9cde 100644 (file)
@@ -490,7 +490,11 @@ public class Vala.MemberAccess : Expression {
                                                        unowned MemberAccess? arg = s.handler as MemberAccess;
                                                        if (arg == null || !arg.check (context) || !(arg.symbol_reference is Method)) {
                                                                error = true;
-                                                               Report.error (s.handler.source_reference, "Invalid handler for `%s'", s.get_full_name ());
+                                                               if (s.handler is LambdaExpression) {
+                                                                       Report.error (s.handler.source_reference, "Lambdas are not allowed for dynamic signals");
+                                                               } else {
+                                                                       Report.error (s.handler.source_reference, "Cannot infer call signature for dynamic signal `%s' from given expression", s.get_full_name ());
+                                                               }
                                                        }
                                                }
                                                s.access = SymbolAccessibility.PUBLIC;