]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Emit delegate/enum typedefs to type-declaration section
authorRico Tzschichholz <ricotz@ubuntu.com>
Thu, 6 Dec 2018 21:41:43 +0000 (22:41 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Tue, 18 Dec 2018 08:06:02 +0000 (09:06 +0100)
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

codegen/valaccodebasemodule.vala
codegen/valaccodedelegatemodule.vala
codegen/valagtypemodule.vala

index e5ae4f33cd6a92f45c2f18e60f9292ca1036a680..14c9286d57b203ec627875a3a91cdf9c0b9c9045 100644 (file)
@@ -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;
index fecde81cbbe2ecc2b08baf5fdaed8d586a1b8d38..1f983bf2ee148fe4ff51651f92d173e6cf64f57c 100644 (file)
@@ -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) {
index 73c2f8addd8e0c86dea1fe05e54b2fef08c31122..6b3dfa2b2ddf56d99e51ac5db18d6a37ad7ad1c1 100644 (file)
@@ -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) {