I've been running this (well, almost… see below 😁) for a couple days and it seems to work nicely

My "small" patch on top just because:

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);


Reply to this email directly, view it on GitHub, or unsubscribe.
You are receiving this because you are subscribed to this thread.Message ID: <geany/geany/pull/3490/c1541830319@github.com>