+2007-11-30 Jürg Billeter <j@bitron.ch>
+
+ * vala/valasemanticanalyzer.vala: check interfaces before base class
+ in symbol lookup
+
+ * tests/classes-methods.exp, tests/classes-methods.vala: test expected
+ symbol lookup behavior
+
2007-11-29 Jürg Billeter <j@bitron.ch>
* vala/valamemberaccess.vala, gobject/Makefile.am,
stdout.printf (" 3\n");
+ // test symbol resolving to check that methods of implemented
+ // interfaces take precedence of methods in base classes
+ stdout.printf ("Interface Inheritance Test: 1");
+
+ var foobar = new SubFooBar ();
+ foobar.do_action ();
+
+ stdout.printf (" 3\n");
+
return 0;
}
}
+
+interface Maman.Foo {
+ public void do_action () {
+ stdout.printf (" 2");
+ }
+}
+
+class Maman.FooBar : Object {
+ public void do_action () {
+ stdout.printf (" BAD");
+ }
+}
+
+class Maman.SubFooBar : FooBar, Foo {
+}
+
if (sym is Class) {
var cl = (Class) sym;
+ // first check interfaces without prerequisites
+ // (prerequisites can be assumed to be met already)
foreach (TypeReference base_type in cl.get_base_types ()) {
- result = symbol_lookup_inherited (base_type.data_type, name);
- if (result != null) {
- return result;
+ if (base_type.data_type is Interface) {
+ result = base_type.data_type.scope.lookup (name);
+ if (result != null) {
+ return result;
+ }
}
}
+ // then check base class recursively
+ if (cl.base_class != null) {
+ return symbol_lookup_inherited (cl.base_class, name);
+ }
} else if (sym is Struct) {
var st = (Struct) sym;
foreach (TypeReference base_type in st.get_base_types ()) {
}
} else if (sym is Interface) {
var iface = (Interface) sym;
+ // first check interface prerequisites recursively
foreach (TypeReference prerequisite in iface.get_prerequisites ()) {
- result = symbol_lookup_inherited (prerequisite.data_type, name);
- if (result != null) {
- return result;
+ if (prerequisite.data_type is Interface) {
+ result = symbol_lookup_inherited (prerequisite.data_type, name);
+ if (result != null) {
+ return result;
+ }
+ }
+ }
+ // then check class prerequisite recursively
+ foreach (TypeReference prerequisite in iface.get_prerequisites ()) {
+ if (prerequisite.data_type is Class) {
+ result = symbol_lookup_inherited (prerequisite.data_type, name);
+ if (result != null) {
+ return result;
+ }
}
}
}