[vala/staging: 2/3] vala: Accept interface as inner type for object-type symbols



commit d79401ad13a4bc5121f5ae187547c53b6a0a7701
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Wed Oct 16 12:47:04 2019 +0200

    vala: Accept interface as inner type for object-type symbols
    
    Fixes https://gitlab.gnome.org/GNOME/vala/issues/697

 tests/Makefile.am                        |  2 ++
 tests/objects/class-inner-types.vala     | 17 +++++++++++++++++
 tests/objects/interface-inner-types.vala | 20 ++++++++++++++++++++
 vala/valaclass.vala                      |  4 ++++
 vala/valainterface.vala                  |  4 ++++
 vala/valaobjecttypesymbol.vala           | 24 ++++++++++++++++++++++++
 6 files changed, 71 insertions(+)
---
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 4fe6f9b3a..c22b4dc0b 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -299,6 +299,7 @@ TESTS = \
        delegates/bug792077.vala \
        objects/chainup.vala \
        objects/class_only.vala \
+       objects/class-inner-types.vala \
        objects/classes.vala \
        objects/classes-interfaces.vala \
        objects/classes-interfaces-virtuals.vala \
@@ -321,6 +322,7 @@ TESTS = \
        objects/gsource.vala \
        objects/instance-comparison.vala \
        objects/interface_only.vala \
+       objects/interface-inner-types.vala \
        objects/interfaces.vala \
        objects/interface-generics.vala \
        objects/interface-virtual-override.vala \
diff --git a/tests/objects/class-inner-types.vala b/tests/objects/class-inner-types.vala
new file mode 100644
index 000000000..ee6ab0865
--- /dev/null
+++ b/tests/objects/class-inner-types.vala
@@ -0,0 +1,17 @@
+class Foo {
+       interface IBar {
+       }
+
+       class Bar : IBar {
+       }
+
+       public void bar () {
+               var bar = new Bar ();
+               assert (bar is IBar);
+       }
+}
+
+void main () {
+       var foo = new Foo ();
+       foo.bar ();
+}
diff --git a/tests/objects/interface-inner-types.vala b/tests/objects/interface-inner-types.vala
new file mode 100644
index 000000000..db0d80d95
--- /dev/null
+++ b/tests/objects/interface-inner-types.vala
@@ -0,0 +1,20 @@
+class Foo : IFoo {
+}
+
+interface IFoo {
+       interface IBar {
+       }
+
+       class Bar : IBar {
+       }
+
+       public void bar () {
+               var bar = new Bar ();
+               assert (bar is IBar);
+       }
+}
+
+void main () {
+       var foo = new Foo ();
+       foo.bar ();
+}
diff --git a/vala/valaclass.vala b/vala/valaclass.vala
index 289cc7459..507a10d23 100644
--- a/vala/valaclass.vala
+++ b/vala/valaclass.vala
@@ -629,6 +629,10 @@ public class Vala.Class : ObjectTypeSymbol {
                        cl.check (context);
                }
 
+               foreach (Interface iface in get_interfaces ()) {
+                       iface.check (context);
+               }
+
                foreach (Struct st in get_structs ()) {
                        st.check (context);
                }
diff --git a/vala/valainterface.vala b/vala/valainterface.vala
index 5cbb2ed78..44613f9ef 100644
--- a/vala/valainterface.vala
+++ b/vala/valainterface.vala
@@ -270,6 +270,10 @@ public class Vala.Interface : ObjectTypeSymbol {
                        cl.check (context);
                }
 
+               foreach (Interface iface in get_interfaces ()) {
+                       iface.check (context);
+               }
+
                foreach (Struct st in get_structs ()) {
                        st.check (context);
                }
diff --git a/vala/valaobjecttypesymbol.vala b/vala/valaobjecttypesymbol.vala
index 918d18814..c0ca11bb2 100644
--- a/vala/valaobjecttypesymbol.vala
+++ b/vala/valaobjecttypesymbol.vala
@@ -41,6 +41,7 @@ public abstract class Vala.ObjectTypeSymbol : TypeSymbol {
 
        // inner types
        private List<Class> classes = new ArrayList<Class> ();
+       private List<Interface> interfaces = new ArrayList<Interface> ();
        private List<Struct> structs = new ArrayList<Struct> ();
        private List<Enum> enums = new ArrayList<Enum> ();
        private List<Delegate> delegates = new ArrayList<Delegate> ();
@@ -156,6 +157,15 @@ public abstract class Vala.ObjectTypeSymbol : TypeSymbol {
                return classes;
        }
 
+       /**
+        * Returns the list of interfaces.
+        *
+        * @return list of interfaces
+        */
+       public unowned List<Interface> get_interfaces () {
+               return interfaces;
+       }
+
        /**
         * Returns the list of structs.
         *
@@ -193,6 +203,16 @@ public abstract class Vala.ObjectTypeSymbol : TypeSymbol {
                scope.add (cl.name, cl);
        }
 
+       /**
+        * Adds the specified interface as an inner interface.
+        *
+        * @param iface an interface
+        */
+       public override void add_interface (Interface iface) {
+               interfaces.add (iface);
+               scope.add (iface.name, iface);
+       }
+
        /**
         * Adds the specified struct as an inner struct.
         *
@@ -353,6 +373,10 @@ public abstract class Vala.ObjectTypeSymbol : TypeSymbol {
                        cl.accept (visitor);
                }
 
+               foreach (Interface iface in get_interfaces ()) {
+                       iface.accept (visitor);
+               }
+
                foreach (Struct st in get_structs ()) {
                        st.accept (visitor);
                }


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