2008-04-19 Jürg Billeter <j@bitron.ch>
+ * vala/valasemanticanalyzer.vala,
+ gobject/valaccodeinterfacebinding.vala: support virtual methods
+ in interfaces, fixes bug 443525
+
+2008-04-19 Jürg Billeter <j@bitron.ch>
+
* vala/valaattributeprocessor.vala, vala/valaerrortype.vala,
vapi/dbus-glib-1.vapi, gobject/valaccodegenerator.vala: get D-Bus
sample working again
foreach (Signal sig in iface.get_signals ()) {
init_block.add_statement (new CCodeExpressionStatement (get_signal_creation (sig, iface)));
}
-
+
+ // connect default implementations
+ foreach (Method m in iface.get_methods ()) {
+ if (m.is_virtual) {
+ var ciface = new CCodeIdentifier ("iface");
+ var cname = m.get_real_cname ();
+ base_init.block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (ciface, m.vfunc_name), new CCodeIdentifier (cname))));
+ }
+ }
+
codegen.source_type_member_definition.append (base_init);
}
}
return;
}
} else if (m.is_virtual) {
- if (!(m.parent_symbol is Class)) {
+ if (!(m.parent_symbol is Class) && !(m.parent_symbol is Interface)) {
m.error = true;
- Report.error (m.source_reference, "Virtual methods may not be declared outside of classes");
+ Report.error (m.source_reference, "Virtual methods may not be declared outside of classes and interfaces");
return;
}
} else if (m.overrides) {
var sym = type.data_type.scope.lookup (m.name);
if (sym is Method) {
var base_method = (Method) sym;
- if (base_method.is_abstract) {
+ if (base_method.is_abstract || base_method.is_virtual) {
string invalid_match;
if (!m.compatible (base_method, out invalid_match)) {
m.error = true;