]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Support [HasEmitter] for vala sources
authorSimon Werbeck <simon.werbeck@gmail.com>
Wed, 5 Oct 2016 17:01:58 +0000 (19:01 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Wed, 12 Oct 2016 19:15:08 +0000 (21:15 +0200)
https://bugzilla.gnome.org/show_bug.cgi?id=681356

codegen/valaccodemethodcallmodule.vala
codegen/valagirwriter.vala
tests/Makefile.am
tests/objects/bug681356.vala [new file with mode: 0644]
vala/valasignal.vala

index 8e923ea7dda30e615e5b572109421f9ac0d2da56..e323bed75da263bf0baad1ea616d2b31b0549e49 100644 (file)
@@ -628,7 +628,7 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
 
                        if (ma != null && ma.inner is BaseAccess && sig.is_virtual) {
                                // normal return value for base access
-                       } else if (!get_signal_has_emitter (sig)) {
+                       } else if (!get_signal_has_emitter (sig) || ma.source_reference.file == sig.source_reference.file) {
                                return_result_via_out_param = true;
                        }
                }
index 3f4d15d58ee95d104fc7d5faa0085c62b048d4b6..628b28c7c26084148f6fc298773bef24e6679b1f 100644 (file)
@@ -1182,6 +1182,10 @@ public class Vala.GIRWriter : CodeVisitor {
                if (!check_accessibility (sig)) {
                        return;
                }
+
+               if (sig.emitter != null) {
+                       sig.emitter.accept (this);
+               }
                
                write_indent ();
                buffer.append_printf ("<glib:signal name=\"%s\"", CCodeBaseModule.get_ccode_name (sig));
index 901cb2815fe4ed7d9baf4eaf75d2cc32a97eaa50..01ad63a2b6e6061c3f644a69b1b251c5864fa45a 100644 (file)
@@ -173,6 +173,7 @@ TESTS = \
        objects/bug663134.vala \
        objects/bug664529.vala \
        objects/bug667668.vala \
+       objects/bug681356.vala \
        objects/bug683646.vala \
        objects/bug695671.vala \
        objects/bug701978.vala \
diff --git a/tests/objects/bug681356.vala b/tests/objects/bug681356.vala
new file mode 100644 (file)
index 0000000..326dedb
--- /dev/null
@@ -0,0 +1,13 @@
+public class Foo : GLib.Object {
+       [HasEmitter]
+       public signal int bar (int i);
+}
+
+void main () {
+       var f = new Foo ();
+
+       f.bar.connect (i => i + 12);
+
+       var res = f.bar (30);
+       assert (res == 42);
+}
index 17e858fd1d445fb957ceafe57d4a202d937f02d3..d11180fb3977f51d9fa42d189ce3639561514ceb 100644 (file)
@@ -59,6 +59,12 @@ public class Vala.Signal : Symbol, Lockable, Callable {
         * */
        public Method default_handler { get; private set; }
 
+       /**
+        * Refers to the public signal emitter method, which is an anonymous
+        * function in the scope.
+        * */
+       public Method emitter { get; private set; }
+
        private bool lock_used = false;
 
        private DataType _return_type;
@@ -158,6 +164,9 @@ public class Vala.Signal : Symbol, Lockable, Callable {
                } else if (default_handler != null) {
                        default_handler.accept (visitor);
                }
+               if (emitter != null) {
+                       emitter.accept (visitor);
+               }
        }
 
        public bool get_lock_used () {
@@ -219,6 +228,33 @@ public class Vala.Signal : Symbol, Lockable, Callable {
                        default_handler.check (context);
                }
 
+               if (!external_package && get_attribute ("HasEmitter") != null) {
+                       emitter = new Method (name, return_type, source_reference);
+
+                       emitter.owner = owner;
+                       emitter.access = access;
+
+                       var body = new Block (source_reference);
+                       var call = new MethodCall (new MemberAccess.simple (name, source_reference), source_reference);
+
+                       foreach (Parameter param in parameters) {
+                               emitter.add_parameter (param);
+                               call.add_argument (new MemberAccess.simple (param.name, source_reference));
+                       }
+
+                       if (return_type is VoidType) {
+                               body.add_statement (new ExpressionStatement (call, source_reference));
+                       } else {
+                               body.add_statement (new ReturnStatement (call, source_reference));
+                       }
+                       emitter.body = body;
+
+                       var cl = parent_symbol as ObjectTypeSymbol;
+
+                       cl.add_hidden_method (emitter);
+                       emitter.check (context);
+               }
+
 
                if (!external_package && !hides && get_hidden_member () != null) {
                        Report.warning (source_reference, "%s hides inherited signal `%s'. Use the `new' keyword if hiding was intentional".printf (get_full_name (), get_hidden_member ().get_full_name ()));