]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Include header for base-symbols when connecting vfuncs
authorRico Tzschichholz <ricotz@ubuntu.com>
Wed, 5 Aug 2020 05:27:53 +0000 (07:27 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Mon, 10 Aug 2020 08:14:02 +0000 (10:14 +0200)
This eases the handling of types which are split over different headers.

codegen/valagtypemodule.vala

index ba35b4f97d01288a3cb4363102242f52866c118c..6c43090c18637b8d1386ceba0dfc02e7e621dacd 100644 (file)
@@ -1280,6 +1280,8 @@ public class Vala.GTypeModule : GErrorModule {
 
                        // there is currently no default handler for abstract async methods
                        if (!m.is_abstract || !m.coroutine) {
+                               generate_method_declaration (m.base_method, cfile);
+
                                CCodeExpression cfunc = new CCodeIdentifier (get_ccode_real_name (m));
                                cfunc = cast_method_pointer (m.base_method, cfunc, base_type, (m.coroutine ? 1 : 3));
                                var ccast = new CCodeCastExpression (new CCodeIdentifier ("klass"), "%sClass *".printf (get_ccode_name (base_type)));
@@ -1298,6 +1300,8 @@ public class Vala.GTypeModule : GErrorModule {
                        if (sig.default_handler == null) {
                                continue;
                        }
+                       generate_method_declaration (sig.default_handler, cfile);
+
                        var ccast = new CCodeCastExpression (new CCodeIdentifier ("klass"), "%sClass *".printf (get_ccode_name (cl)));
                        ccode.add_assignment (new CCodeMemberAccess.pointer (ccast, get_ccode_vfunc_name (sig.default_handler)), new CCodeIdentifier (get_ccode_real_name (sig.default_handler)));
                }
@@ -1314,10 +1318,14 @@ public class Vala.GTypeModule : GErrorModule {
 
                        if (!get_ccode_no_accessor_method (prop.base_property) && !get_ccode_concrete_accessor (prop.base_property)) {
                                if (prop.get_accessor != null) {
+                                       generate_property_accessor_declaration (prop.base_property.get_accessor, cfile);
+
                                        string cname = get_ccode_real_name (prop.get_accessor);
                                        ccode.add_assignment (new CCodeMemberAccess.pointer (ccast, "get_%s".printf (prop.name)), new CCodeIdentifier (cname));
                                }
                                if (prop.set_accessor != null) {
+                                       generate_property_accessor_declaration (prop.base_property.set_accessor, cfile);
+
                                        string cname = get_ccode_real_name (prop.set_accessor);
                                        ccode.add_assignment (new CCodeMemberAccess.pointer (ccast, "set_%s".printf (prop.name)), new CCodeIdentifier (cname));
                                }
@@ -1394,7 +1402,9 @@ public class Vala.GTypeModule : GErrorModule {
                        if (base_type != iface) {
                                continue;
                        }
-                       
+
+                       generate_method_declaration (m.base_interface_method, cfile);
+
                        var ciface = new CCodeIdentifier ("iface");
                        CCodeExpression cfunc;
                        if (m.is_abstract || m.is_virtual) {
@@ -1482,6 +1492,8 @@ public class Vala.GTypeModule : GErrorModule {
 
                        if (!get_ccode_no_accessor_method (prop.base_interface_property) && !get_ccode_concrete_accessor (prop.base_interface_property)) {
                                if (prop.get_accessor != null) {
+                                       generate_property_accessor_declaration (prop.base_interface_property.get_accessor, cfile);
+
                                        string cname = get_ccode_real_name (prop.get_accessor);
                                        if (prop.is_abstract || prop.is_virtual) {
                                                cname = get_ccode_name (prop.get_accessor);
@@ -1494,6 +1506,8 @@ public class Vala.GTypeModule : GErrorModule {
                                        ccode.add_assignment (new CCodeMemberAccess.pointer (ciface, "get_%s".printf (prop.name)), cfunc);
                                }
                                if (prop.set_accessor != null) {
+                                       generate_property_accessor_declaration (prop.base_interface_property.set_accessor, cfile);
+
                                        string cname = get_ccode_real_name (prop.set_accessor);
                                        if (prop.is_abstract || prop.is_virtual) {
                                                cname = get_ccode_name (prop.set_accessor);
@@ -1641,6 +1655,8 @@ public class Vala.GTypeModule : GErrorModule {
 
                                // there is currently no default handler for abstract async methods
                                if (!m.is_abstract || !m.coroutine) {
+                                       generate_method_declaration (m.base_method, cfile);
+
                                        CCodeExpression cfunc = new CCodeIdentifier (get_ccode_real_name (m));
                                        cfunc = cast_method_pointer (m.base_method, cfunc, base_type, (m.coroutine ? 1 : 3));
                                        var ccast = new CCodeCastExpression (new CCodeIdentifier ("self"), "%s *".printf (get_ccode_name (base_type)));
@@ -1665,10 +1681,14 @@ public class Vala.GTypeModule : GErrorModule {
 
                                if (!get_ccode_no_accessor_method (prop.base_property) && !get_ccode_concrete_accessor (prop.base_property)) {
                                        if (prop.get_accessor != null) {
+                                               generate_property_accessor_declaration (prop.base_property.get_accessor, cfile);
+
                                                string cname = get_ccode_real_name (prop.get_accessor);
                                                ccode.add_assignment (new CCodeMemberAccess.pointer (ccast, "get_%s".printf (prop.name)), new CCodeIdentifier (cname));
                                        }
                                        if (prop.set_accessor != null) {
+                                               generate_property_accessor_declaration (prop.base_property.set_accessor, cfile);
+
                                                string cname = get_ccode_real_name (prop.set_accessor);
                                                ccode.add_assignment (new CCodeMemberAccess.pointer (ccast, "set_%s".printf (prop.name)), new CCodeIdentifier (cname));
                                        }