summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2012-05-25 11:39:44 +0200
committerJürg Billeter <j@bitron.ch>2012-06-23 17:21:33 +0200
commit32c4b242d4dd4c7a0a42c4622f6c98e7bb3c5d06 (patch)
treed9e305c9e8673ecab03bf213ca5c6a8a6201748c
parent554e653f2117f4a20b7ba1fd55983043521ad02a (diff)
downloadvala-32c4b242d4dd4c7a0a42c4622f6c98e7bb3c5d06.tar.gz
Support virtual interface signals
Fixes bug 676802.
-rw-r--r--vala/valamemberaccess.vala10
-rw-r--r--vala/valamethod.vala22
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) {