]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Support virtual interface signals
authorJürg Billeter <j@bitron.ch>
Fri, 25 May 2012 09:39:44 +0000 (11:39 +0200)
committerJürg Billeter <j@bitron.ch>
Sat, 23 Jun 2012 15:21:33 +0000 (17:21 +0200)
Fixes bug 676802.

vala/valamemberaccess.vala
vala/valamethod.vala

index 64d2b518ad83deb14e905e704e35c41e2a038af4..3958777f338d9c5cbda78df87ddc9a1f3ea62913 100644 (file)
@@ -586,7 +586,15 @@ public class Vala.MemberAccess : Expression {
                        } else if (m.base_interface_method != null) {
                                // refer to base method to inherit default arguments
                                m = m.base_interface_method;
-                               symbol_reference = m;
+
+                               if (m.signal_reference != null) {
+                                       // method is class/default handler for a signal
+                                       // let signal deal with member access
+                                       symbol_reference = m.signal_reference;
+                               } else {
+                                       symbol_reference = m;
+                               }
+
                                member = symbol_reference;
                        }
                        access = m.access;
index c2de41d21a7ff432112da80b4c5a39976657fbbc..9f397c4cc36b99ba25acf6f324f5d208b6f61e0c 100644 (file)
@@ -493,6 +493,10 @@ public class Vala.Method : Subroutine {
 
        private void find_base_class_method (Class cl) {
                var sym = cl.scope.lookup (name);
+               if (sym is Signal) {
+                       var sig = (Signal) sym;
+                       sym = sig.default_handler;
+               }
                if (sym is Method) {
                        var base_method = (Method) sym;
                        if (base_method.is_abstract || base_method.is_virtual) {
@@ -503,20 +507,6 @@ public class Vala.Method : Subroutine {
                                        return;
                                }
 
-                               _base_method = base_method;
-                               return;
-                       }
-               } else if (sym is Signal) {
-                       var sig = (Signal) sym;
-                       if (sig.is_virtual) {
-                               var base_method = sig.default_handler;
-                               string invalid_match;
-                               if (!compatible (base_method, out invalid_match)) {
-                                       error = true;
-                                       Report.error (source_reference, "overriding method `%s' is incompatible with base method `%s': %s.".printf (get_full_name (), base_method.get_full_name (), invalid_match));
-                                       return;
-                               }
-
                                _base_method = base_method;
                                return;
                        }
@@ -532,6 +522,10 @@ public class Vala.Method : Subroutine {
                foreach (DataType type in cl.get_base_types ()) {
                        if (type.data_type is Interface) {
                                var sym = type.data_type.scope.lookup (name);
+                               if (sym is Signal) {
+                                       var sig = (Signal) sym;
+                                       sym = sig.default_handler;
+                               }
                                if (sym is Method) {
                                        var base_method = (Method) sym;
                                        if (base_method.is_abstract || base_method.is_virtual) {