]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Use defintions of public header in internal header if available 3d7760835e56a04a939c17a35a6db1c542415d6d
authorMason Bogue <scythe@ortsz.com>
Sat, 21 Mar 2020 23:14:51 +0000 (19:14 -0400)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sun, 5 Apr 2020 09:06:56 +0000 (11:06 +0200)
Add CCode API to distinguish between public and internal header files.

See https://gitlab.gnome.org/GNOME/vala/issues/713

ccode/valaccodefile.vala
codegen/valaccodebasemodule.vala
codegen/valagtypemodule.vala

index cf4870267170ec4b6cc74ecad235035137a917ae..a82eac5c0a8b236b61a138f62d9c48aa803c1c51 100644 (file)
@@ -22,7 +22,7 @@
 
 
 public class Vala.CCodeFile {
-       public bool is_header { get; set; }
+       public CCodeFileType cfile_type { get; set; }
 
        public weak SourceFile? file { get; private set; }
 
@@ -41,6 +41,9 @@ public class Vala.CCodeFile {
 
        public CCodeFile (SourceFile? source_file = null) {
                file = source_file;
+               if (source_file != null) {
+                       cfile_type = CCodeFileType.SOURCE;
+               }
        }
 
        public bool add_declaration (string name) {
@@ -151,7 +154,7 @@ public class Vala.CCodeFile {
                        return false;
                }
 
-               if (!is_header) {
+               if (cfile_type == CCodeFileType.SOURCE) {
                        writer.line_directives = line_directives;
 
                        comments.write (writer);
@@ -210,3 +213,10 @@ public class Vala.CCodeFile {
        }
 }
 
+[Flags]
+public enum CCodeFileType {
+       SOURCE,
+       PUBLIC_HEADER,
+       INTERNAL_HEADER,
+       HEADER = PUBLIC_HEADER | INTERNAL_HEADER
+}
index 0883018e67a6fdae84788be62b520753f8c859c0..5e1b6e5f1c24f235d4e418613b17e1cdd35815d1 100644 (file)
@@ -558,9 +558,9 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                }
 
                header_file = new CCodeFile ();
-               header_file.is_header = true;
+               header_file.cfile_type = CCodeFileType.PUBLIC_HEADER;
                internal_header_file = new CCodeFile ();
-               internal_header_file.is_header = true;
+               internal_header_file.cfile_type = CCodeFileType.INTERNAL_HEADER;
 
                /* we're only interested in non-pkg source files */
                var source_files = context.get_source_files ();
@@ -672,6 +672,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
        }
 
        public bool add_symbol_declaration (CCodeFile decl_space, Symbol sym, string name) {
+               bool in_generated_header = CodeContext.get ().use_header
+                                          && (decl_space.cfile_type != CCodeFileType.PUBLIC_HEADER && !sym.is_internal_symbol ());
                if (decl_space.add_declaration (name)) {
                        return true;
                }
@@ -679,13 +681,13 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                        sym.source_reference.file.used = true;
                }
                if (sym.anonymous) {
-                       return !decl_space.is_header && CodeContext.get ().use_header;
+                       return in_generated_header;
                }
                // constants with initializer-list are special
                if (sym is Constant && ((Constant) sym).value is InitializerList) {
                        return false;
                }
-               if (sym.external_package || (!decl_space.is_header && CodeContext.get ().use_header && !sym.is_internal_symbol ())
+               if (sym.external_package || in_generated_header
                    || (sym.is_extern && get_ccode_header_filenames (sym).length > 0)) {
                        // add feature test macros
                        foreach (unowned string feature_test_macro in get_ccode_feature_test_macros (sym).split (",")) {
index 5632b82a48177ef77107c2a64116bcf7807955d3..f7433f205d891b246054e6865463424dc832cfdf 100644 (file)
@@ -198,7 +198,8 @@ public class Vala.GTypeModule : GErrorModule {
                // Custom unref-methods need to be emitted before G_DEFINE_AUTOPTR_CLEANUP_FUNC,
                // so we guard against that special case and handle it in generate_method_declaration.
                if (!(base_class.is_compact && is_reference_counting (base_class))
-                   && (!context.use_header || decl_space.is_header)) {
+                   && (!context.use_header || decl_space.cfile_type == CCodeFileType.PUBLIC_HEADER
+                       || (decl_space.cfile_type == CCodeFileType.INTERNAL_HEADER && base_class.is_internal_symbol()))) {
                        string autoptr_cleanup_func;
                        if (is_reference_counting (base_class)) {
                                autoptr_cleanup_func = get_ccode_unref_function (base_class);
@@ -425,7 +426,8 @@ public class Vala.GTypeModule : GErrorModule {
                        // in addition to the non-ref-countable case in generate_class_declaration.
                        unowned Class? cl = m.parent_symbol as Class;
                        if (cl != null && cl.is_compact && get_ccode_unref_function (cl) == get_ccode_name (m)
-                           && (!context.use_header || decl_space.is_header)) {
+                           && (!context.use_header || decl_space.cfile_type == CCodeFileType.PUBLIC_HEADER
+                               || (decl_space.cfile_type == CCodeFileType.INTERNAL_HEADER && cl.is_internal_symbol()))) {
                                decl_space.add_type_member_declaration (new CCodeIdentifier ("G_DEFINE_AUTOPTR_CLEANUP_FUNC (%s, %s)".printf (get_ccode_name (cl), get_ccode_name (m))));
                                decl_space.add_type_member_declaration (new CCodeNewline ());
                        }