I've been running this (well, almost… see below :grin:) for a couple days and it seems to work nicely
My "small" patch on top just because: ```diff diff --git a/src/tagmanager/tm_ctags.c b/src/tagmanager/tm_ctags.c index a5cb9531e..16e2ebf04 100644 --- a/src/tagmanager/tm_ctags.c +++ b/src/tagmanager/tm_ctags.c @@ -119,12 +119,7 @@ static gboolean init_tag(TMTag *tag, TMSourceFile *file, const tagEntryInfo *tag
tag->name = g_strdup(tag_entry->name); tag->type = type; - /* ctags sets "isFileScope" also for files with an unknown extension - - * make sure we set "local" only for files with a known C/C++ extension */ - if (file->lang == TM_PARSER_C || file->lang == TM_PARSER_CPP) - tag->local = tag_entry->isFileScope && file->is_c_source; - else - tag->local = tag_entry->isFileScope; + tag->local = tag_entry->isFileScope && file->trust_file_scope; tag->flags = tm_tag_flag_none_t; if (isTagExtraBitMarked(tag_entry, XTAG_ANONYMOUS)) tag->flags |= tm_tag_flag_anon_t; diff --git a/src/tagmanager/tm_source_file.c b/src/tagmanager/tm_source_file.c index 599ae4fa7..e5a27419b 100644 --- a/src/tagmanager/tm_source_file.c +++ b/src/tagmanager/tm_source_file.c @@ -609,20 +609,28 @@ static gboolean tm_source_file_init(TMSourceFile *source_file, const char *file_ else source_file->lang = tm_ctags_get_named_lang(name);
- source_file->is_c_source = FALSE; + source_file->trust_file_scope = TRUE;
+ /* ctags sets "isFileScope" for all C/C++ files without a known header + * extension, but we don't want to use it for files with a less conventional + * extension, not to exclude symbols we shouldn't */ if (source_file->lang == TM_PARSER_C || source_file->lang == TM_PARSER_CPP) { - const gchar **ext; - const gchar *common_src_exts[] = - {".c", ".C", ".cc", ".cp", ".cpp", ".cxx", ".c++", ".CPP", ".CXX", NULL}; + const gchar *ext = strrchr(source_file->short_name, '.');
- for (ext = common_src_exts; *ext; ext++) + source_file->trust_file_scope = FALSE; + if (ext) { - if (g_str_has_suffix(source_file->short_name, *ext)) + const gchar *common_src_exts[] = + {"c", "C", "cc", "cp", "cpp", "cxx", "c++", "CPP", "CXX"}; + + for (guint i = 0; i < G_N_ELEMENTS(common_src_exts); i++) { - source_file->is_c_source = TRUE; - break; + if (strcmp(ext + 1, common_src_exts[i]) == 0) + { + source_file->trust_file_scope = TRUE; + break; + } } } } diff --git a/src/tagmanager/tm_source_file.h b/src/tagmanager/tm_source_file.h index f3ca0cbc8..342d1259c 100644 --- a/src/tagmanager/tm_source_file.h +++ b/src/tagmanager/tm_source_file.h @@ -36,7 +36,7 @@ typedef struct TMSourceFile char *short_name; /**< Just the name of the file (without the path) */ GPtrArray *tags_array; /**< Sorted tag array obtained by parsing the object. @elementtype{TMTag} */ /* Flag indicating whether the file is a C/C++ source (i.e. not a header) based on its extension */ - gboolean is_c_source; + gboolean trust_file_scope; } TMSourceFile;
GType tm_source_file_get_type(void); ```