From c05e3eabf14df61d7de54a18f713cb50ef2dc8b8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ji=C5=99=C3=AD=20Techet?= Date: Fri, 6 May 2016 17:29:54 +0200 Subject: [PATCH] Split tm_ctags_callback into two One to inform about a new tag, the other informing about a start of a new pass. --- tagmanager/src/tm_ctags_wrappers.c | 12 ++++++------ tagmanager/src/tm_ctags_wrappers.h | 14 ++++++++++---- tagmanager/src/tm_source_file.c | 28 ++++++++++++---------------- 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/tagmanager/src/tm_ctags_wrappers.c b/tagmanager/src/tm_ctags_wrappers.c index 2a55c247d..385ba3586 100644 --- a/tagmanager/src/tm_ctags_wrappers.c +++ b/tagmanager/src/tm_ctags_wrappers.c @@ -27,7 +27,7 @@ typedef struct { - tm_ctags_callback callback; + TMCtagsNewTagCallback tag_callback; gpointer user_data; } CallbackUserData; @@ -43,15 +43,15 @@ static gboolean parse_callback(const tagEntryInfo *tag, gpointer user_data) { CallbackUserData *callback_data = user_data; - return callback_data->callback(tag, FALSE, callback_data->user_data); + return callback_data->tag_callback(tag, callback_data->user_data); } void tm_ctags_parse(guchar *buffer, gsize buffer_size, - const gchar *file_name, TMParserType lang, tm_ctags_callback callback, - gpointer user_data) + const gchar *file_name, TMParserType lang, TMCtagsNewTagCallback tag_callback, + TMCtagsPassStartCallback pass_callback, gpointer user_data) { - CallbackUserData callback_data = {callback, user_data}; + CallbackUserData callback_data = {tag_callback, user_data}; gboolean retry = TRUE; guint passCount = 0; @@ -68,7 +68,7 @@ void tm_ctags_parse(guchar *buffer, gsize buffer_size, setTagEntryFunction(parse_callback, &callback_data); while (retry && passCount < 3) { - callback(NULL, TRUE, user_data); + pass_callback(user_data); if (!buffer && fileOpen (file_name, lang)) { if (LanguageTable [lang]->parser != NULL) diff --git a/tagmanager/src/tm_ctags_wrappers.h b/tagmanager/src/tm_ctags_wrappers.h index 0b92a1fab..0b2ebdfe2 100644 --- a/tagmanager/src/tm_ctags_wrappers.h +++ b/tagmanager/src/tm_ctags_wrappers.h @@ -30,15 +30,21 @@ G_BEGIN_DECLS -typedef gboolean (*tm_ctags_callback) (const tagEntryInfo *const tag, - gboolean invalidate, void *user_data); +/* Callback invoked for every tag found by the parser. The return value is + * currently unused. */ +typedef gboolean (*TMCtagsNewTagCallback) (const tagEntryInfo *const tag, + void *user_data); + +/* Callback invoked at the beginning of every parsing pass. The return value is + * currently unused */ +typedef gboolean (*TMCtagsPassStartCallback) (void *user_data); void tm_ctags_init(void); void tm_ctags_parse(guchar *buffer, gsize buffer_size, - const gchar *file_name, TMParserType lang, tm_ctags_callback callback, - gpointer user_data); + const gchar *file_name, TMParserType lang, TMCtagsNewTagCallback tag_callback, + TMCtagsPassStartCallback pass_callback, gpointer user_data); const gchar *tm_ctags_get_lang_name(TMParserType lang); diff --git a/tagmanager/src/tm_source_file.c b/tagmanager/src/tm_source_file.c index c8efa18a5..ab6d6be07 100644 --- a/tagmanager/src/tm_source_file.c +++ b/tagmanager/src/tm_source_file.c @@ -627,25 +627,21 @@ static void update_python_arglist(const TMTag *tag, TMSourceFile *current_source } } -/* - This function is registered into the ctags parser when a file is parsed for - the first time. The function is then called by the ctags parser each time - it finds a new tag. You should not have to use this function. - @see tm_source_file_parse() -*/ -static gboolean tm_source_file_tags(const tagEntryInfo *const tag, - gboolean invalidate, void *user_data) +/* new parsing pass ctags callback function */ +static gboolean ctags_pass_start(void *user_data) { TMSourceFile *current_source_file = user_data; - TMTag *tm_tag; - if (invalidate) - { - tm_tags_array_free(current_source_file->tags_array, FALSE); - return TRUE; - } + tm_tags_array_free(current_source_file->tags_array, FALSE); + return TRUE; +} - tm_tag = tm_tag_new(); +/* new tag ctags callback function */ +static gboolean ctags_new_tag(const tagEntryInfo *const tag, + void *user_data) +{ + TMSourceFile *current_source_file = user_data; + TMTag *tm_tag = tm_tag_new(); if (!init_tag(tm_tag, current_source_file, tag)) { @@ -838,7 +834,7 @@ gboolean tm_source_file_parse(TMSourceFile *source_file, guchar* text_buf, gsize tm_tags_array_free(source_file->tags_array, FALSE); tm_ctags_parse(parse_file ? NULL : text_buf, buf_size, file_name, - source_file->lang, tm_source_file_tags, source_file); + source_file->lang, ctags_new_tag, ctags_pass_start, source_file); if (free_buf) g_free(text_buf); -- 2.11.4.GIT