[vala/staging] vala: Sort base-types of classes by their relationship
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/staging] vala: Sort base-types of classes by their relationship
- Date: Thu, 17 May 2018 15:01:58 +0000 (UTC)
commit 80461db44f09b593e714bfeb73b67bf0d6ed95be
Author: Rico Tzschichholz <ricotz ubuntu com>
Date: Thu May 17 16:45:58 2018 +0200
vala: Sort base-types of classes by their relationship
This fixes the registration order of interfaces in codegen and will allow
to find duplicates later.
Based on patch by Florian Brosch
https://bugzilla.gnome.org/show_bug.cgi?id=656204
tests/Makefile.am | 1 +
tests/objects/bug656204.vala | 16 ++++++++++++++++
vala/valaclass.vala | 27 +++++++++++++++++++++++++++
3 files changed, 44 insertions(+), 0 deletions(-)
---
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 943e8fe..4391d2f 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -281,6 +281,7 @@ TESTS = \
objects/bug647018.vala \
objects/bug653138.vala \
objects/bug654702.vala \
+ objects/bug656204.vala \
objects/bug663134.vala \
objects/bug664529.vala \
objects/bug667668.vala \
diff --git a/tests/objects/bug656204.vala b/tests/objects/bug656204.vala
new file mode 100644
index 0000000..d54ecc1
--- /dev/null
+++ b/tests/objects/bug656204.vala
@@ -0,0 +1,16 @@
+interface Foo : Bar {
+}
+
+interface Bar {
+}
+
+class Baz : Bar, Foo {
+}
+
+class Mama : Foo, Bar {
+}
+
+void main () {
+ new Baz ();
+ new Mama ();
+}
diff --git a/vala/valaclass.vala b/vala/valaclass.vala
index b0de0f5..d9edda5 100644
--- a/vala/valaclass.vala
+++ b/vala/valaclass.vala
@@ -461,6 +461,9 @@ public class Vala.Class : ObjectTypeSymbol {
}
context.analyzer.current_symbol = this;
+ // Organize base-types based on their relationship
+ base_types.sort (cmp_base_types);
+
foreach (DataType base_type_reference in get_base_types ()) {
if (!base_type_reference.check (context)) {
error = true;
@@ -720,6 +723,30 @@ public class Vala.Class : ObjectTypeSymbol {
return !error;
}
+
+ static int cmp_base_types (DataType d1, DataType d2) {
+ unowned Class? c1 = d1.data_type as Class;
+ unowned Class? c2 = d2.data_type as Class;
+ if (c1 != null) {
+ return -1;
+ } else if (c2 != null) {
+ return 1;
+ }
+
+ unowned Interface? i1 = d1.data_type as Interface;
+ unowned Interface? i2 = d2.data_type as Interface;
+ if (i1 == i2) {
+ return 0;
+ }
+ if (i1 == null) {
+ return -1;
+ }
+ if (i2 == null) {
+ return 1;
+ }
+
+ return (i1.is_subtype_of (i2) ? 1 : i2.is_subtype_of (i1) ? -1 : 0);
+ }
}
// vim:sw=8 noet
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]