summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMason Bogue <scythe@ortsz.com>2020-03-21 19:14:51 -0400
committerRico Tzschichholz <ricotz@ubuntu.com>2020-04-05 11:06:56 +0200
commit3d7760835e56a04a939c17a35a6db1c542415d6d (patch)
treebf22ab494290e02aef011a23d49f07759427e622
parentd02167aff9da38e85d7cdc21fff2b91ba9e35e9d (diff)
downloadvala-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.vala14
-rw-r--r--codegen/valaccodebasemodule.vala10
-rw-r--r--codegen/valagtypemodule.vala6
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 ());
}