diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2019-09-26 11:08:31 +0200 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2019-09-26 11:14:02 +0200 |
commit | fc246aa7f8cbc6cb176724246a0187e19fe91198 (patch) | |
tree | 886fe41b4c2ae5f0d89eda001016619985d04343 | |
parent | b4ad44e669742451536ebe395500ca431b697bba (diff) | |
download | vala-fc246aa7f8cbc6cb176724246a0187e19fe91198.tar.gz |
vala: Allow to override virtual interface implementations
Fixes https://gitlab.gnome.org/GNOME/vala/issues/852
-rw-r--r-- | codegen/valaccodemethodmodule.vala | 2 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/objects/interface-virtual-override.vala | 16 | ||||
-rw-r--r-- | vala/valamethod.vala | 2 |
4 files changed, 19 insertions, 2 deletions
diff --git a/codegen/valaccodemethodmodule.vala b/codegen/valaccodemethodmodule.vala index f11e501ba..354e1839f 100644 --- a/codegen/valaccodemethodmodule.vala +++ b/codegen/valaccodemethodmodule.vala @@ -534,7 +534,7 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule { if (m.overrides || (m.base_interface_method != null && !m.is_abstract && !m.is_virtual)) { Method base_method; ReferenceType base_expression_type; - if (m.overrides) { + if (m.overrides && m.base_method != null) { base_method = m.base_method; base_expression_type = new ObjectType ((Class) base_method.parent_symbol); } else { diff --git a/tests/Makefile.am b/tests/Makefile.am index bb374221a..f6e4b0881 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -314,6 +314,7 @@ TESTS = \ objects/interface_only.vala \ objects/interfaces.vala \ objects/interface-generics.vala \ + objects/interface-virtual-override.vala \ objects/methods.vala \ objects/paramspec.vala \ objects/plugin-module-init.vala \ diff --git a/tests/objects/interface-virtual-override.vala b/tests/objects/interface-virtual-override.vala new file mode 100644 index 000000000..62fcb6597 --- /dev/null +++ b/tests/objects/interface-virtual-override.vala @@ -0,0 +1,16 @@ +interface IFoo : Object { + public virtual int foo () { + assert_not_reached (); + } +} + +class Bar : Object, IFoo { + public override int foo () { + return 42; + } +} + +void main () { + var bar = new Bar (); + assert (bar.foo () == 42); +} diff --git a/vala/valamethod.vala b/vala/valamethod.vala index e91da89eb..29e7171a2 100644 --- a/vala/valamethod.vala +++ b/vala/valamethod.vala @@ -880,7 +880,7 @@ public class Vala.Method : Subroutine, Callable { Report.error (source_reference, "A struct member `%s' cannot be marked as override, virtual, or abstract".printf (get_full_name ())); return false; } - } else if (overrides && base_method == null) { + } else if (overrides && base_method == null && base_interface_method == null) { Report.error (source_reference, "`%s': no suitable method found to override".printf (get_full_name ())); } else if ((is_abstract || is_virtual || overrides) && access == SymbolAccessibility.PRIVATE) { error = true; |