From: Rico Tzschichholz Date: Sat, 1 Dec 2018 14:27:08 +0000 (+0100) Subject: vala: Allow explicit interface methods to be virtual X-Git-Tag: 0.43.4~30 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2cea36afee72d395784b9f178beac5808edb7b5b;p=thirdparty%2Fvala.git vala: Allow explicit interface methods to be virtual --- diff --git a/tests/Makefile.am b/tests/Makefile.am index a62998b1b..f672887e5 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -255,6 +255,7 @@ TESTS = \ objects/class_only.vala \ objects/classes.vala \ objects/classes-interfaces.vala \ + objects/classes-interfaces-virtuals.vala \ objects/classes-implicit-implementation.vala \ objects/compact-class.vala \ objects/compact-class-destructor.vala \ diff --git a/tests/objects/classes-interfaces-virtuals.vala b/tests/objects/classes-interfaces-virtuals.vala new file mode 100644 index 000000000..cf56c62b7 --- /dev/null +++ b/tests/objects/classes-interfaces-virtuals.vala @@ -0,0 +1,34 @@ +interface IFoo : Object { + public abstract int foo (); +} + +interface IBar : Object { + public abstract string foo (); +} + +class Foo : Object, IFoo, IBar { + public virtual int IFoo.foo () { + return 42; + } + public string IBar.foo () { + return "foo"; + } +} + +class Bar : Foo { + public override int foo () { + return 23; + } +} + +void main () { + var foo = new Foo (); + assert (foo.foo () == 42); + assert (((IBar) foo).foo () == "foo"); + + var bar = new Bar (); + assert (bar.foo () == 23); + assert (((Foo) bar).foo () == 23); + assert (((IFoo) bar).foo () == 23); + assert (((IBar) bar).foo () == "foo"); +} diff --git a/vala/valaclass.vala b/vala/valaclass.vala index 419e72d93..51e8fbade 100644 --- a/vala/valaclass.vala +++ b/vala/valaclass.vala @@ -299,11 +299,6 @@ public class Vala.Class : ObjectTypeSymbol { } base.add_method (m); - // explicit interface method implementation - if (m.base_interface_type != null) { - scope.remove (m.name); - scope.add (null, m); - } } public HashMap get_implicit_implementations () { diff --git a/vala/valaobjecttypesymbol.vala b/vala/valaobjecttypesymbol.vala index 66e7f955f..ce17d63c1 100644 --- a/vala/valaobjecttypesymbol.vala +++ b/vala/valaobjecttypesymbol.vala @@ -115,7 +115,14 @@ public abstract class Vala.ObjectTypeSymbol : TypeSymbol { public override void add_method (Method m) { methods.add (m); members.add (m); - scope.add (m.name, m); + + // explicit interface method implementation + // virtual/abstract methods needs to be scoped and overridable + if (this is Class && m.base_interface_type != null && !(m.is_abstract || m.is_virtual)) { + scope.add (null, m); + } else { + scope.add (m.name, m); + } } /**