diff options
author | Jürg Billeter <j@bitron.ch> | 2012-05-25 11:39:44 +0200 |
---|---|---|
committer | Jürg Billeter <j@bitron.ch> | 2012-06-23 17:21:33 +0200 |
commit | 32c4b242d4dd4c7a0a42c4622f6c98e7bb3c5d06 (patch) | |
tree | d9e305c9e8673ecab03bf213ca5c6a8a6201748c | |
parent | 554e653f2117f4a20b7ba1fd55983043521ad02a (diff) | |
download | vala-32c4b242d4dd4c7a0a42c4622f6c98e7bb3c5d06.tar.gz |
Support virtual interface signals
Fixes bug 676802.
-rw-r--r-- | vala/valamemberaccess.vala | 10 | ||||
-rw-r--r-- | vala/valamethod.vala | 22 |
2 files changed, 17 insertions, 15 deletions
diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala index 64d2b518a..3958777f3 100644 --- a/vala/valamemberaccess.vala +++ b/vala/valamemberaccess.vala @@ -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; diff --git a/vala/valamethod.vala b/vala/valamethod.vala index c2de41d21..9f397c4cc 100644 --- a/vala/valamethod.vala +++ b/vala/valamethod.vala @@ -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) { @@ -506,20 +510,6 @@ public class Vala.Method : Subroutine { _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; - } } if (cl.base_class != null) { @@ -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) { |