From: Rico Tzschichholz Date: Thu, 6 Dec 2018 21:41:43 +0000 (+0100) Subject: codegen: Emit delegate/enum typedefs to type-declaration section X-Git-Tag: 0.42.4~10 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c745533ecfc0d2b012ebe20002622256e8621657;p=thirdparty%2Fvala.git 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 --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index e5ae4f33c..14c9286d5 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -839,8 +839,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 fecde81cb..1f983bf2e 100644 --- a/codegen/valaccodedelegatemodule.vala +++ b/codegen/valaccodedelegatemodule.vala @@ -123,7 +123,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 73c2f8add..6b3dfa2b2 100644 --- a/codegen/valagtypemodule.vala +++ b/codegen/valagtypemodule.vala @@ -2052,16 +2052,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); - } - } - var type_struct = new CCodeStruct ("_%s".printf (get_ccode_type_name (iface))); decl_space.add_type_declaration (new CCodeNewline ()); @@ -2081,6 +2071,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) {