]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: Allow explicit interface methods to be virtual 2cea36afee72d395784b9f178beac5808edb7b5b
authorRico Tzschichholz <ricotz@ubuntu.com>
Sat, 1 Dec 2018 14:27:08 +0000 (15:27 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Wed, 19 Dec 2018 23:51:37 +0000 (00:51 +0100)
tests/Makefile.am
tests/objects/classes-interfaces-virtuals.vala [new file with mode: 0644]
vala/valaclass.vala
vala/valaobjecttypesymbol.vala

index a62998b1b61440109802960f6447d9543181e2bf..f672887e57694fc115c58288ff4bbb7e93c11f7b 100644 (file)
@@ -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 (file)
index 0000000..cf56c62
--- /dev/null
@@ -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");
+}
index 419e72d93baca7c26bf209bded02a42fc5905771..51e8fbade672c685e592020da05bd07e53dc54eb 100644 (file)
@@ -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<Method,Method> get_implicit_implementations () {
index 66e7f955f33f6847781d494d9d1a09aa373ae765..ce17d63c160b54b429c99e79ffd09e5716e59ef7 100644 (file)
@@ -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);
+               }
        }
 
        /**