[vala/staging] vala: Do not allow to implement the same interface multiple times



commit 96d9d891ffb27e25595374c97932cdbd66aae4bf
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Thu May 17 16:57:23 2018 +0200

    vala: Do not allow to implement the same interface multiple times
    
    Based on patch by Florian Brosch
    
    https://bugzilla.gnome.org/show_bug.cgi?id=656204

 tests/Makefile.am              |    1 +
 tests/objects/bug656204-1.test |   10 ++++++++++
 vala/valaclass.vala            |    9 +++++++++
 3 files changed, 20 insertions(+), 0 deletions(-)
---
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 4391d2f..7274d83 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -282,6 +282,7 @@ TESTS = \
        objects/bug653138.vala \
        objects/bug654702.vala \
        objects/bug656204.vala \
+       objects/bug656204-1.test \
        objects/bug663134.vala \
        objects/bug664529.vala \
        objects/bug667668.vala \
diff --git a/tests/objects/bug656204-1.test b/tests/objects/bug656204-1.test
new file mode 100644
index 0000000..0ff8bb9
--- /dev/null
+++ b/tests/objects/bug656204-1.test
@@ -0,0 +1,10 @@
+Invalid Code
+
+interface Foo {
+}
+
+class Bar : Foo, Foo {
+}
+
+void main () {
+}
diff --git a/vala/valaclass.vala b/vala/valaclass.vala
index d9edda5..033d581 100644
--- a/vala/valaclass.vala
+++ b/vala/valaclass.vala
@@ -464,12 +464,21 @@ public class Vala.Class : ObjectTypeSymbol {
                // Organize base-types based on their relationship
                base_types.sort (cmp_base_types);
 
+               unowned Interface? last_iface = null;
                foreach (DataType base_type_reference in get_base_types ()) {
                        if (!base_type_reference.check (context)) {
                                error = true;
                                return false;
                        }
 
+                       unowned Interface? iface = base_type_reference.data_type as Interface;
+                       if (iface != null && last_iface == iface) {
+                               Report.error (source_reference, "class `%s' already implements interface 
`%s'".printf (get_full_name (), iface.get_full_name ()));
+                               error = true;
+                               return false;
+                       }
+                       last_iface = iface;
+
                        if (!(base_type_reference is ObjectType)) {
                                error = true;
                                Report.error (source_reference, "base type `%s` of class `%s` is not an 
object type".printf (base_type_reference.to_string (), get_full_name ()));


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]