[vala/staging] vala: Accept interface as inner type for object-type symbols
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/staging] vala: Accept interface as inner type for object-type symbols
- Date: Wed, 16 Oct 2019 11:52:48 +0000 (UTC)
commit 83bf1a9c751603103413d0f28b2f937c89d09f19
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 33f99b30d..0ce392813 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.
*
@@ -334,6 +354,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]