[geany/geany] bf17c9: Improve tag searching for "typedef struct {...}" cases

Jiří Techet git-noreply at xxxxx
Thu Feb 11 14:35:53 UTC 2016


Branch:      refs/heads/master
Author:      Jiří Techet <techet at gmail.com>
Committer:   Jiří Techet <techet at gmail.com>
Date:        Sun, 10 Jan 2016 11:31:47 UTC
Commit:      bf17c90bd66d17811d1a25c454af3115c14318ee
             https://github.com/geany/geany/commit/bf17c90bd66d17811d1a25c454af3115c14318ee

Log Message:
-----------
Improve tag searching for "typedef struct {...}" cases

When resolving typedef, search for the subsequent type in the file where
the typedef was defined. For more info see the comment in the patch.


Modified Paths:
--------------
    tagmanager/src/tm_workspace.c

Modified: tagmanager/src/tm_workspace.c
38 lines changed, 25 insertions(+), 13 deletions(-)
===================================================================
@@ -762,10 +762,11 @@ GPtrArray *tm_workspace_find(const char *name, const char *scope, TMTagType type
 
 
 static GPtrArray *
-find_scope_members_tags (const GPtrArray * all, const char *scope, langType lang)
+find_scope_members_tags (const GPtrArray * all, const char *scope, langType lang,
+	TMSourceFile *tag_file)
 {
 	GPtrArray *tags = g_ptr_array_new();
-	TMSourceFile *last_file = NULL;
+	TMSourceFile *last_file = tag_file;
 	guint i;
 
 	for (i = 0; i < all->len; ++i)
@@ -801,6 +802,7 @@ static GPtrArray *
 find_scope_members (const GPtrArray *tags_array, GPtrArray *member_array,
 	const char *name, langType lang)
 {
+	TMSourceFile *typedef_file = NULL;
 	gboolean has_members = FALSE;
 	GPtrArray *tags = NULL;
 	gchar *type_name;
@@ -818,6 +820,7 @@ find_scope_members (const GPtrArray *tags_array, GPtrArray *member_array,
 	 * loop when typedefs create a cycle by adding some limits. */
 	for (i = 0; i < 5; i++)
 	{
+		guint j;
 		TMTag *tag = NULL;
 		GPtrArray *type_tags;
 		TMTagType types = (tm_tag_class_t | tm_tag_namespace_t |
@@ -825,17 +828,25 @@ find_scope_members (const GPtrArray *tags_array, GPtrArray *member_array,
 						   tm_tag_union_t | tm_tag_enum_t);
 
 		type_tags = g_ptr_array_new();
-		fill_find_tags_array(type_tags, tags_array, type_name, NULL, types, FALSE, lang);
-		if (type_tags)
+		if (typedef_file)
 		{
-			guint j;
-			for (j = 0; j < type_tags->len; j++)
-			{
-				tag = TM_TAG(type_tags->pdata[j]);
-				/* prefer non-typedef tags because we can be sure they contain members */
-				if (tag->type != tm_tag_typedef_t)
-					break;
-			}
+			/* If we have typedef_file, which is the file where the typedef was
+			 * defined, search in the file first. This helps for
+			 * "typedef struct {...}" cases where the typedef resolves to
+			 * anon_struct_* and searching for it in the whole workspace returns
+			 * too many (wrong) results. */
+			fill_find_tags_array(type_tags, typedef_file->tags_array, type_name,
+								 NULL, types, FALSE, lang);
+		}
+		if (type_tags->len == 0)
+			fill_find_tags_array(type_tags, tags_array, type_name, NULL, types, FALSE, lang);
+
+		for (j = 0; j < type_tags->len; j++)
+		{
+			tag = TM_TAG(type_tags->pdata[j]);
+			/* prefer non-typedef tags because we can be sure they contain members */
+			if (tag->type != tm_tag_typedef_t)
+				break;
 		}
 
 		g_ptr_array_free(type_tags, TRUE);
@@ -848,6 +859,7 @@ find_scope_members (const GPtrArray *tags_array, GPtrArray *member_array,
 		{
 			g_free(type_name);
 			type_name = g_strdup(tag->var_type);
+			typedef_file = tag->file;
 			continue;
 		}
 		else /* real type with members */
@@ -865,7 +877,7 @@ find_scope_members (const GPtrArray *tags_array, GPtrArray *member_array,
 	}
 
 	if (has_members)
-		tags = find_scope_members_tags(member_array, type_name, lang);
+		tags = find_scope_members_tags(member_array, type_name, lang, typedef_file);
 
 	g_free(type_name);
 



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Commits mailing list