From: Rico Tzschichholz Date: Sun, 10 Mar 2019 17:14:09 +0000 (+0100) Subject: gsignal: Move disconnect error from signal-module to semantic-analyzer pass X-Git-Tag: 0.42.7~29 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=06cab1e9de6191eda8c49fa6df8b20e347d581bc;p=thirdparty%2Fvala.git gsignal: Move disconnect error from signal-module to semantic-analyzer pass Add corresponding invalid test to increase coverage --- diff --git a/codegen/valagsignalmodule.vala b/codegen/valagsignalmodule.vala index e3a12f58f..b3b7333b8 100644 --- a/codegen/valagsignalmodule.vala +++ b/codegen/valagsignalmodule.vala @@ -642,9 +642,6 @@ public class Vala.GSignalModule : GObjectModule { } } else { // disconnect - if (handler is LambdaExpression) { - Report.error (handler.source_reference, "Cannot disconnect lambda expression from signal. Use Object.disconnect."); - } if (sig is DynamicSignal) { connect_func = get_dynamic_signal_disconnect_wrapper_name ((DynamicSignal) sig); } else { diff --git a/tests/Makefile.am b/tests/Makefile.am index 9de376474..c71e0cf40 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -664,6 +664,7 @@ TESTS = \ semantic/signal-detail-invalid.test \ semantic/signal-detail-non-string.test \ semantic/struct-derived.test \ + semantic/signal-disconnect-invalid.test \ semantic/struct-field-initializer.test \ semantic/struct-invalid-base.test \ semantic/struct-recursive.test \ diff --git a/tests/semantic/signal-disconnect-invalid.test b/tests/semantic/signal-disconnect-invalid.test new file mode 100644 index 000000000..2d3883840 --- /dev/null +++ b/tests/semantic/signal-disconnect-invalid.test @@ -0,0 +1,10 @@ +Invalid Code + +class Foo : Object { + public signal void bar (); +} + +void main () { + var foo = new Foo (); + foo.bar.disconnect (() => {}); +} diff --git a/vala/valamethodcall.vala b/vala/valamethodcall.vala index b3fe08465..15d608656 100644 --- a/vala/valamethodcall.vala +++ b/vala/valamethodcall.vala @@ -509,6 +509,16 @@ public class Vala.MethodCall : Expression { value_type.nullable = true; } + unowned Signal? sig = m.parent_symbol as Signal; + if (sig != null && m.name == "disconnect") { + var param = get_argument_list ()[0]; + if (param is LambdaExpression) { + error = true; + Report.error (source_reference, "Cannot disconnect lambda expression from signal"); + return false; + } + } + var dynamic_sig = m.parent_symbol as DynamicSignal; if (dynamic_sig != null && dynamic_sig.handler != null) { dynamic_sig.return_type = dynamic_sig.handler.value_type.get_return_type ().copy ();