From: Rico Tzschichholz Date: Wed, 16 Oct 2019 10:47:04 +0000 (+0200) Subject: vala: Accept interface as inner type for object-type symbols X-Git-Tag: 0.47.1~83 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d79401ad13a4bc5121f5ae187547c53b6a0a7701;p=thirdparty%2Fvala.git vala: Accept interface as inner type for object-type symbols Fixes https://gitlab.gnome.org/GNOME/vala/issues/697 --- 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 classes = new ArrayList (); + private List interfaces = new ArrayList (); private List structs = new ArrayList (); private List enums = new ArrayList (); private List delegates = new ArrayList (); @@ -156,6 +157,15 @@ public abstract class Vala.ObjectTypeSymbol : TypeSymbol { return classes; } + /** + * Returns the list of interfaces. + * + * @return list of interfaces + */ + public unowned List 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); }