]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Add type declarations required for generics as needed
authorRico Tzschichholz <ricotz@ubuntu.com>
Wed, 21 Nov 2018 12:03:31 +0000 (13:03 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Wed, 21 Nov 2018 18:14:10 +0000 (19:14 +0100)
codegen/valaccodebasemodule.vala
codegen/valaccodemethodmodule.vala
codegen/valagasyncmodule.vala

index acadf940e857163528afb4546cf144dc39ad50c3..aabcd9b936fb0cc6f8fe00cdb7c7e7f673fda341 100644 (file)
@@ -1478,9 +1478,17 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                if (type is ObjectType) {
                        var object_type = (ObjectType) type;
                        if (object_type.type_symbol is Class) {
-                               generate_class_declaration ((Class) object_type.type_symbol, decl_space);
+                               var cl = (Class) object_type.type_symbol;
+                               generate_class_declaration (cl, decl_space);
+                               if (!cl.is_compact && cl.has_type_parameters ()) {
+                                       generate_struct_declaration ((Struct) gtype_type, decl_space);
+                               }
                        } else if (object_type.type_symbol is Interface) {
-                               generate_interface_declaration ((Interface) object_type.type_symbol, decl_space);
+                               var iface = (Interface) object_type.type_symbol;
+                               generate_interface_declaration (iface, decl_space);
+                               if (iface.has_type_parameters ()) {
+                                       generate_struct_declaration ((Struct) gtype_type, decl_space);
+                               }
                        }
                } else if (type is DelegateType) {
                        var deleg_type = (DelegateType) type;
@@ -1509,6 +1517,11 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                } else if (type is PointerType) {
                        var pointer_type = (PointerType) type;
                        generate_type_declaration (pointer_type.base_type, decl_space);
+               } else if (type is MethodType) {
+                       var method = ((MethodType) type).method_symbol;
+                       if (method.has_type_parameters () && !get_ccode_simple_generics (method)) {
+                               generate_struct_declaration ((Struct) gtype_type, decl_space);
+                       }
                }
 
                foreach (DataType type_arg in type.get_type_arguments ()) {
index 361fb00652d02661ffa9a42776ef65be4f67fb23..6bf75b3a953674150123fb6ff6ee7baa5f002117 100644 (file)
@@ -177,6 +177,8 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
                        return;
                }
 
+               generate_type_declaration (new MethodType (m), decl_space);
+
                var function = new CCodeFunction (get_ccode_name (m));
 
                if (m.is_private_symbol () && !m.external) {
index 21f72dee1338dda1bbe253876039a362e01b3bd5..a3022532ac918499c58afce802e6359eadad6df5 100644 (file)
@@ -394,6 +394,8 @@ public class Vala.GAsyncModule : GtkModule {
                                return;
                        }
 
+                       generate_type_declaration (new MethodType (m), decl_space);
+
                        var cl = m.parent_symbol as Class;
 
                        var asyncfunc = new CCodeFunction (get_ccode_name (m), "void");