summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2018-12-06 22:41:43 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2018-12-07 16:35:23 +0100
commit7adb3a45bb8d663c0cfca55af26b7e6f7292b14a (patch)
tree2417a70b4bff887d8b65745a987c5dec0b863bef
parent34dd7196b23c78ef9d480118f4b77a85067d3b7d (diff)
downloadvala-7adb3a45bb8d663c0cfca55af26b7e6f7292b14a.tar.gz
codegen: Emit delegate/enum typedefs to type-declaration section
This fixes compilation of circular dependency of delegates with enums, structs, classes and interfaces. Resolve interface prerequisites after writing forward declarations to fix entagled delegate dependencies in them. Fixes https://gitlab.gnome.org/GNOME/vala/issues/318
-rw-r--r--codegen/valaccodebasemodule.vala4
-rw-r--r--codegen/valaccodedelegatemodule.vala2
-rw-r--r--codegen/valagtypemodule.vala20
3 files changed, 13 insertions, 13 deletions
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 879d4fb23..c4d00aba5 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -847,8 +847,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
cfile = current_cfile;
- decl_space.add_type_definition (cenum);
- decl_space.add_type_definition (new CCodeNewline ());
+ decl_space.add_type_declaration (cenum);
+ decl_space.add_type_declaration (new CCodeNewline ());
if (context.profile != Profile.GOBJECT || !get_ccode_has_type_id (en)) {
return true;
diff --git a/codegen/valaccodedelegatemodule.vala b/codegen/valaccodedelegatemodule.vala
index fe1d6f6ce..71c63e92a 100644
--- a/codegen/valaccodedelegatemodule.vala
+++ b/codegen/valaccodedelegatemodule.vala
@@ -124,7 +124,7 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
var ctypedef = new CCodeTypeDefinition (return_type_cname, cfundecl);
ctypedef.modifiers |= (d.version.deprecated ? CCodeModifiers.DEPRECATED : 0);
- decl_space.add_type_definition (ctypedef);
+ decl_space.add_type_declaration (ctypedef);
}
public override void visit_delegate (Delegate d) {
diff --git a/codegen/valagtypemodule.vala b/codegen/valagtypemodule.vala
index fb7851c11..55ad7f3fd 100644
--- a/codegen/valagtypemodule.vala
+++ b/codegen/valagtypemodule.vala
@@ -2074,16 +2074,6 @@ public class Vala.GTypeModule : GErrorModule {
return;
}
- foreach (DataType prerequisite in iface.get_prerequisites ()) {
- var prereq_cl = prerequisite.data_type as Class;
- var prereq_iface = prerequisite.data_type as Interface;
- if (prereq_cl != null) {
- generate_class_declaration (prereq_cl, decl_space);
- } else if (prereq_iface != null) {
- generate_interface_declaration (prereq_iface, decl_space);
- }
- }
-
decl_space.add_include ("glib-object.h");
var type_struct = new CCodeStruct ("_%s".printf (get_ccode_type_name (iface)));
@@ -2105,6 +2095,16 @@ public class Vala.GTypeModule : GErrorModule {
decl_space.add_type_declaration (new CCodeTypeDefinition ("struct _%s".printf (get_ccode_name (iface)), new CCodeVariableDeclarator (get_ccode_name (iface))));
decl_space.add_type_declaration (new CCodeTypeDefinition ("struct %s".printf (type_struct.name), new CCodeVariableDeclarator (get_ccode_type_name (iface))));
+ foreach (DataType prerequisite in iface.get_prerequisites ()) {
+ var prereq_cl = prerequisite.data_type as Class;
+ var prereq_iface = prerequisite.data_type as Interface;
+ if (prereq_cl != null) {
+ generate_class_declaration (prereq_cl, decl_space);
+ } else if (prereq_iface != null) {
+ generate_interface_declaration (prereq_iface, decl_space);
+ }
+ }
+
type_struct.add_field ("GTypeInterface", "parent_iface");
if (iface.get_attribute ("GenericAccessors") != null) {