vala r1172 - in trunk: . tests vala



Author: juergbi
Date: Mon Apr  7 15:21:50 2008
New Revision: 1172
URL: http://svn.gnome.org/viewvc/vala?rev=1172&view=rev

Log:
2008-04-07  Juerg Billeter  <j bitron ch>

	* vala/valasemanticanalyzer.vala: fix spurious error when
	  overriding abstract method in derived abstract class,
	  fixes bug 523263

	* tests/classes-methods.vala: test overriding abstract method in
	  derived abstract class


Modified:
   trunk/ChangeLog
   trunk/tests/classes-methods.vala
   trunk/vala/valasemanticanalyzer.vala

Modified: trunk/tests/classes-methods.vala
==============================================================================
--- trunk/tests/classes-methods.vala	(original)
+++ trunk/tests/classes-methods.vala	Mon Apr  7 15:21:50 2008
@@ -77,3 +77,17 @@
 class Maman.SubFooBar : FooBar, Foo {
 }
 
+// http://bugzilla.gnome.org/show_bug.cgi?id=523263
+
+abstract class Maman.AbstractBase : Object {
+	public abstract void foo ();
+}
+
+abstract class Maman.AbstractDerived : AbstractBase {
+	public override void foo () {
+	}
+}
+
+class Maman.DeepDerived : AbstractDerived {
+}
+

Modified: trunk/vala/valasemanticanalyzer.vala
==============================================================================
--- trunk/vala/valasemanticanalyzer.vala	(original)
+++ trunk/vala/valasemanticanalyzer.vala	Mon Apr  7 15:21:50 2008
@@ -197,12 +197,14 @@
 			if (!cl.is_abstract) {
 				var base_class = cl.base_class;
 				while (base_class != null && base_class.is_abstract) {
-					foreach (Method m in base_class.get_methods ()) {
-						if (m.is_abstract) {
-							var sym = cl.scope.lookup (m.name);
-							if (sym == null || !(sym is Method) || ((Method) sym).base_method != m) {
+					foreach (Method base_method in base_class.get_methods ()) {
+						if (base_method.is_abstract) {
+							var override_method = symbol_lookup_inherited (cl, base_method.name) as Method;
+							if (override_method == null
+							    || !override_method.overrides
+							    || override_method.base_method != base_method) {
 								cl.error = true;
-								Report.error (cl.source_reference, "`%s' does not implement abstract method `%s'".printf (cl.get_full_name (), m.get_full_name ()));
+								Report.error (cl.source_reference, "`%s' does not implement abstract method `%s'".printf (cl.get_full_name (), base_method.get_full_name ()));
 							}
 						}
 					}



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