]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Support .connect() and .connect_after() for dynamic signals
authorLuca Bruno <lethalman88@gmail.com>
Sat, 13 Mar 2010 22:16:30 +0000 (23:16 +0100)
committerJürg Billeter <j@bitron.ch>
Sat, 20 Mar 2010 13:13:13 +0000 (14:13 +0100)
Fixes bug 607936.

vala/valamemberaccess.vala
vala/valamethodcall.vala

index 99b4819798c07bb6a5ace220114945ef19c1530b..e9103335bc9f8ac39ee7d387a2860f570bd25d78 100644 (file)
@@ -371,6 +371,20 @@ public class Vala.MemberAccess : Expression {
                                                dynamic_object_type.type_symbol.scope.add (null, prop);
                                                symbol_reference = prop;
                                        }
+                               } else if (parent_node is MemberAccess && inner is MemberAccess && parent_node.parent_node is MethodCall) {
+                                       var ma = (MemberAccess) parent_node;
+                                       if (ma.member_name == "connect" || ma.member_name == "connect_after") {
+                                               // dynamic signal
+                                               var s = new DynamicSignal (inner.value_type, member_name, new VoidType (), source_reference);
+                                               var mcall = (MethodCall) parent_node.parent_node;
+                                               // the first argument is the handler
+                                               if (mcall.get_argument_list().size > 0) {
+                                                       s.handler = mcall.get_argument_list()[0];
+                                               }
+                                               s.access = SymbolAccessibility.PUBLIC;
+                                               dynamic_object_type.type_symbol.scope.add (null, s);
+                                               symbol_reference = s;
+                                       }
                                }
                                if (symbol_reference == null) {
                                        // dynamic property read access
index 047df7e63adf9f493ef45107065f1957fe349913..4b99a255a8b7a91bf4faa7bd7effac765f1f9d50 100644 (file)
@@ -514,6 +514,20 @@ public class Vala.MethodCall : Expression {
                        if (m.returns_floating_reference) {
                                value_type.floating_reference = true;
                        }
+
+                       var dynamic_sig = m.parent_symbol as DynamicSignal;
+                       if (dynamic_sig != null && dynamic_sig.handler != null) {
+                               bool first = true;
+                               foreach (FormalParameter param in dynamic_sig.handler.value_type.get_parameters ()) {
+                                       if (first) {
+                                               // skip sender parameter
+                                               first = false;
+                                       } else {
+                                               dynamic_sig.add_parameter (param.copy ());
+                                       }
+                               }
+                               dynamic_sig.handler.target_type = new DelegateType (dynamic_sig.get_delegate (new ObjectType ((ObjectTypeSymbol) dynamic_sig.parent_symbol), this));
+                       }
                } else if (mtype is DelegateType) {
                        var d = ((DelegateType) mtype).delegate_symbol;
                        foreach (DataType error_type in d.get_error_types ()) {