Skip to content

Commit

Permalink
Determine anonymous tags based on name only when necessary
Browse files Browse the repository at this point in the history
At this point all built in parsers should report anonymous tags correctly
so for them we don't need to determine anonymous tags based on tag name.
Since tag files might be generated without this information, we still
have to determine anonymous tags based on name for them.
  • Loading branch information
techee committed Jan 10, 2022
1 parent b4afb8e commit ea660f8
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 17 deletions.
2 changes: 1 addition & 1 deletion src/tagmanager/tm_ctags.c
Expand Up @@ -122,7 +122,7 @@ static gboolean init_tag(TMTag *tag, TMSourceFile *file, const tagEntryInfo *tag
tag->local = tag_entry->isFileScope;
tag->flags = tm_tag_flag_none_t;
if (isTagExtraBitMarked(tag_entry, XTAG_ANONYMOUS))
tag->flags = tm_tag_flag_anon_t;
tag->flags |= tm_tag_flag_anon_t;
tag->line = tag_entry->lineNumber;
if (NULL != tag_entry->extensionFields.signature)
tag->arglist = g_strdup(tag_entry->extensionFields.signature);
Expand Down
21 changes: 21 additions & 0 deletions src/tagmanager/tm_parser.c
Expand Up @@ -862,6 +862,27 @@ const gchar *tm_parser_get_constructor_method(TMParserType lang)
}


/* determine anonymous tags from tag names only when corresponding
* ctags information is not available */
gboolean tm_parser_is_anon_name(TMParserType lang, gchar *name)
{
guint i;
char dummy;

if (sscanf(name, "__anon%u%c", &i, &dummy) == 1) /* uctags tags files */
return TRUE;
else if (lang == TM_PARSER_C || lang == TM_PARSER_CPP) /* legacy Geany tags files */
return sscanf(name, "anon_%*[a-z]_%u%c", &i, &dummy) == 1;
else if (lang == TM_PARSER_FORTRAN || lang == TM_PARSER_F77) /* legacy Geany tags files */
{
return sscanf(name, "Structure#%u%c", &i, &dummy) == 1 ||
sscanf(name, "Interface#%u%c", &i, &dummy) == 1 ||
sscanf(name, "Enum#%u%c", &i, &dummy) == 1;
}
return FALSE;
}


static gchar *replace_string_if_present(gchar *haystack, gchar *needle, gchar *subst)
{
if (strstr(haystack, needle))
Expand Down
2 changes: 2 additions & 0 deletions src/tagmanager/tm_parser.h
Expand Up @@ -128,6 +128,8 @@ gint tm_parser_scope_autocomplete_suffix(TMParserType lang, const gchar *str);

const gchar *tm_parser_get_constructor_method(TMParserType lang);

gboolean tm_parser_is_anon_name(TMParserType lang, gchar *name);

gchar *tm_parser_update_scope(TMParserType lang, gchar *scope);

gboolean tm_parser_enable_role(TMParserType lang, gchar kind);
Expand Down
13 changes: 10 additions & 3 deletions src/tagmanager/tm_source_file.c
Expand Up @@ -175,7 +175,7 @@ gchar tm_source_file_get_tag_access(const gchar *access)
@param fp FILE pointer from where the tag line is read
@return TRUE on success, FALSE on FAILURE
*/
static gboolean init_tag_from_file(TMTag *tag, TMSourceFile *file, FILE *fp)
static gboolean init_tag_from_file(TMTag *tag, TMSourceFile *file, FILE *fp, TMParserType lang)
{
guchar buf[BUFSIZ];
guchar *start, *end;
Expand All @@ -198,7 +198,11 @@ static gboolean init_tag_from_file(TMTag *tag, TMSourceFile *file, FILE *fp)
if (!isprint(*start))
return FALSE;
else
{
tag->name = g_strdup((gchar*)start);
if (tm_parser_is_anon_name(lang, tag->name))
tag->flags |= tm_tag_flag_anon_t;
}
}
else
{
Expand All @@ -220,7 +224,7 @@ static gboolean init_tag_from_file(TMTag *tag, TMSourceFile *file, FILE *fp)
tag->scope = g_strdup((gchar*)start + 1);
break;
case TA_FLAGS:
tag->flags = atoi((gchar*)start + 1);
tag->flags |= atoi((gchar*)start + 1);
break;
case TA_VARTYPE:
tag->var_type = g_strdup((gchar*)start + 1);
Expand Down Expand Up @@ -324,6 +328,9 @@ static gboolean init_tag_from_file_ctags(TMTag *tag, TMSourceFile *file, FILE *f
tag->name = g_strndup(p, (gsize)(tab - p));
p = tab + 1;

if (tm_parser_is_anon_name(lang, tag->name))
tag->flags |= tm_tag_flag_anon_t;

/* tagfile, unused */
if (! (tab = strchr(p, '\t')))
{
Expand Down Expand Up @@ -422,7 +429,7 @@ static TMTag *new_tag_from_tags_file(TMSourceFile *file, FILE *fp, TMParserType
switch (format)
{
case TM_FILE_FORMAT_TAGMANAGER:
result = init_tag_from_file(tag, file, fp);
result = init_tag_from_file(tag, file, fp, mode);
break;
case TM_FILE_FORMAT_PIPE:
result = init_tag_from_file_alt(tag, file, fp);
Expand Down
15 changes: 2 additions & 13 deletions src/tagmanager/tm_tag.c
Expand Up @@ -665,21 +665,10 @@ tm_get_current_tag (GPtrArray * file_tags, const gulong line, const TMTagType ta
return matching_tag;
}


gboolean tm_tag_is_anon(const TMTag *tag)
{
guint i;
char dummy;

if (tag->flags & tm_tag_flag_anon_t)
return TRUE;

if (tag->lang == TM_PARSER_C || tag->lang == TM_PARSER_CPP)
return sscanf(tag->name, "__anon%u%c", &i, &dummy) == 1;
else if (tag->lang == TM_PARSER_FORTRAN || tag->lang == TM_PARSER_F77)
return sscanf(tag->name, "Structure#%u%c", &i, &dummy) == 1 ||
sscanf(tag->name, "Interface#%u%c", &i, &dummy) == 1 ||
sscanf(tag->name, "Enum#%u%c", &i, &dummy) == 1;
return FALSE;
return tag->flags & tm_tag_flag_anon_t;
}


Expand Down

0 comments on commit ea660f8

Please sign in to comment.