[vala/0.16] Support virtual interface signals



commit 32c4b242d4dd4c7a0a42c4622f6c98e7bb3c5d06
Author: JÃrg Billeter <j bitron ch>
Date:   Fri May 25 11:39:44 2012 +0200

    Support virtual interface signals
    
    Fixes bug 676802.

 vala/valamemberaccess.vala |   10 +++++++++-
 vala/valamethod.vala       |   22 ++++++++--------------
 2 files changed, 17 insertions(+), 15 deletions(-)
---
diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala
index 64d2b51..3958777 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 c2de41d..9f397c4 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) {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]