diff options
author | Mason Bogue <scythe@ortsz.com> | 2020-03-21 19:14:51 -0400 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2020-04-05 11:06:56 +0200 |
commit | 3d7760835e56a04a939c17a35a6db1c542415d6d (patch) | |
tree | bf22ab494290e02aef011a23d49f07759427e622 | |
parent | d02167aff9da38e85d7cdc21fff2b91ba9e35e9d (diff) | |
download | vala-3d7760835e56a04a939c17a35a6db1c542415d6d.tar.gz |
codegen: Use defintions of public header in internal header if available
Add CCode API to distinguish between public and internal header files.
See https://gitlab.gnome.org/GNOME/vala/issues/713
-rw-r--r-- | ccode/valaccodefile.vala | 14 | ||||
-rw-r--r-- | codegen/valaccodebasemodule.vala | 10 | ||||
-rw-r--r-- | codegen/valagtypemodule.vala | 6 |
3 files changed, 22 insertions, 8 deletions
diff --git a/ccode/valaccodefile.vala b/ccode/valaccodefile.vala index cf4870267..a82eac5c0 100644 --- a/ccode/valaccodefile.vala +++ b/ccode/valaccodefile.vala @@ -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 +} diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 0883018e6..5e1b6e5f1 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -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 (",")) { diff --git a/codegen/valagtypemodule.vala b/codegen/valagtypemodule.vala index 5632b82a4..f7433f205 100644 --- a/codegen/valagtypemodule.vala +++ b/codegen/valagtypemodule.vala @@ -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 ()); } |