]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Emit delegate/enum typedefs to type-declaration section 7adb3a45bb8d663c0cfca55af26b7e6f7292b14a
authorRico Tzschichholz <ricotz@ubuntu.com>
Thu, 6 Dec 2018 21:41:43 +0000 (22:41 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Fri, 7 Dec 2018 15:35:23 +0000 (16:35 +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 879d4fb2306168bef53f5790fb926d67729635c0..c4d00aba565c18589978c9773b4d45146d9c9e9f 100644 (file)
@@ -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;
index fe1d6f6ce992bb5699da22251163a0697dc153a0..71c63e92acdd661329947da3b20a05979e9a0e52 100644 (file)
@@ -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) {
index fb7851c115dfcaa30f02d3839f68602085b93732..55ad7f3fd7709e30c4c180e921a6957dc9a567b7 100644 (file)
@@ -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) {