From b6c068f56b65d16670836127e1524c4c960b923f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Techet?= Date: Sat, 8 Nov 2014 19:54:55 +0100 Subject: [PATCH 1/3] geanygendoc: Update to the latest Geany tagmanager API --- geanygendoc/src/ggd-plugin.c | 4 ++-- geanygendoc/src/ggd-tag-utils.c | 22 +++++++++++----------- geanygendoc/src/ggd.c | 14 +++++++------- 3 files changed, 20 insertions(+), 20 deletions(-) diff --git a/geanygendoc/src/ggd-plugin.c b/geanygendoc/src/ggd-plugin.c index 78c31e328..93bcfece7 100644 --- a/geanygendoc/src/ggd-plugin.c +++ b/geanygendoc/src/ggd-plugin.c @@ -50,7 +50,7 @@ GeanyData *geany_data; GeanyFunctions *geany_functions; /* TODO check minimum requierment */ -PLUGIN_VERSION_CHECK (188) +PLUGIN_VERSION_CHECK (221) PLUGIN_SET_TRANSLATABLE_INFO ( LOCALEDIR, GETTEXT_PACKAGE, @@ -114,7 +114,7 @@ ggd_plugin_get_doctype (filetype_id id) /* FIXME: tm_source_file_buffer_update() is not found in symbols table */ /* (tries to) refresh the tag list to the file's current state */ static void -refresh_tag_list (TMWorkObject *tm_wo, +refresh_tag_list (TMSourceFile *tm_wo, ScintillaObject *sci, GeanyDocument *doc) { diff --git a/geanygendoc/src/ggd-tag-utils.c b/geanygendoc/src/ggd-tag-utils.c index 529abe2d5..c37e0e126 100644 --- a/geanygendoc/src/ggd-tag-utils.c +++ b/geanygendoc/src/ggd-tag-utils.c @@ -59,9 +59,9 @@ tag_cmp_by_line (gconstpointer a, if (t1->type & tm_tag_file_t || t2->type & tm_tag_file_t) { rv = 0; } else { - if (t1->atts.entry.line > t2->atts.entry.line) { + if (t1->line > t2->line) { rv = +direction; - } else if (t1->atts.entry.line < t2->atts.entry.line) { + } else if (t1->line < t2->line) { rv = -direction; } else { rv = 0; @@ -159,8 +159,8 @@ ggd_tag_find_from_line (const GPtrArray *tags, GGD_PTR_ARRAY_FOR (tags, i, el) { if (! (el->type & tm_tag_file_t)) { - if (el->atts.entry.line <= line && - (! tag || el->atts.entry.line > tag->atts.entry.line)) { + if (el->line <= line && + (! tag || el->line > tag->line)) { tag = el; } } @@ -211,7 +211,7 @@ ggd_tag_find_parent (const GPtrArray *tags, g_return_val_if_fail (tags != NULL, NULL); g_return_val_if_fail (child != NULL, NULL); - if (! child->atts.entry.scope) { + if (! child->scope) { /* tag has no parent, we're done */ } else { gchar *parent_scope = NULL; @@ -223,17 +223,17 @@ ggd_tag_find_parent (const GPtrArray *tags, gsize separator_len; /* scope is of the form abc */ - parent_name = child->atts.entry.scope; + parent_name = child->scope; separator = symbols_get_context_separator (geany_ft); separator_len = strlen (separator); while ((tmp = strstr (parent_name, separator)) != NULL) { parent_name = &tmp[separator_len]; } /* if parent have scope */ - if (parent_name != child->atts.entry.scope) { + if (parent_name != child->scope) { /* the parent scope is the "dirname" of the child's scope */ - parent_scope = g_strndup (child->atts.entry.scope, - parent_name - child->atts.entry.scope - + parent_scope = g_strndup (child->scope, + parent_name - child->scope - separator_len); } /*g_debug ("%s: parent_name = %s", G_STRFUNC, parent_name); @@ -241,8 +241,8 @@ ggd_tag_find_parent (const GPtrArray *tags, GGD_PTR_ARRAY_FOR (tags, i, el) { if (! (el->type & tm_tag_file_t) && (utils_str_equal (el->name, parent_name) && - utils_str_equal (el->atts.entry.scope, parent_scope) && - el->atts.entry.line <= child->atts.entry.line)) { + utils_str_equal (el->scope, parent_scope) && + el->line <= child->line)) { tag = el; } } diff --git a/geanygendoc/src/ggd.c b/geanygendoc/src/ggd.c index c468dbb90..acc8bd5b0 100644 --- a/geanygendoc/src/ggd.c +++ b/geanygendoc/src/ggd.c @@ -162,10 +162,10 @@ get_env_for_tag (GgdFileType *ft, ctpl_environ_push_string (env, "cursor", GGD_CURSOR_IDENTIFIER); ctpl_environ_push_string (env, "symbol", tag->name); /* get argument list it it exists */ - if (tag->atts.entry.arglist) { + if (tag->arglist) { CtplValue *v; - v = get_arg_list_from_string (ft, tag->atts.entry.arglist); + v = get_arg_list_from_string (ft, tag->arglist); if (v) { ctpl_environ_push (env, "argument_list", v); ctpl_value_free (v); @@ -173,9 +173,9 @@ get_env_for_tag (GgdFileType *ft, } /* get return type -- no matter if the return concept is pointless for that * particular tag, it's up to the rule to use it when it makes sense */ - returns = ! (tag->atts.entry.var_type != NULL && + returns = ! (tag->var_type != NULL && /* C-style none return type hack */ - strcmp ("void", tag->atts.entry.var_type) == 0); + strcmp ("void", tag->var_type) == 0); ctpl_environ_push_int (env, "returns", returns); /* get direct children tags */ children = ggd_tag_find_children (tag_array, tag, @@ -344,13 +344,13 @@ do_insert_comment (GeanyDocument *doc, switch (setting->position) { case GGD_POS_AFTER: - pos = sci_get_line_end_position (sci, tag->atts.entry.line - 1); + pos = sci_get_line_end_position (sci, tag->line - 1); break; case GGD_POS_BEFORE: { gint line; - line = tag->atts.entry.line - 1; + line = tag->line - 1; line = adjust_start_line (sci, tag_array, tag, line); pos = sci_get_position_from_line (sci, line); if (GGD_OPT_indent) { @@ -487,7 +487,7 @@ insert_multiple_comments (GeanyDocument *doc, msgwin_status_add (_("No setting applies to symbol \"%s\" of type \"%s\" " "at line %lu."), tag->name, ggd_tag_get_type_name (tag), - tag->atts.entry.line); + tag->line); } } sci_end_undo_action (sci); From 7de8265bf2eb0c663c0838c77c63242fc02dc1d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Techet?= Date: Sat, 8 Nov 2014 19:56:16 +0100 Subject: [PATCH 2/3] geanyprj: Update to the latest Geany tagmanager API --- geanyprj/src/geanyprj.c | 2 +- geanyprj/src/project.c | 68 +++++++++++++++++++++++++++-------------- geanyprj/src/xproject.c | 49 +++++++++++++++-------------- 3 files changed, 70 insertions(+), 49 deletions(-) diff --git a/geanyprj/src/geanyprj.c b/geanyprj/src/geanyprj.c index 4e6a7b048..44b9e3a98 100644 --- a/geanyprj/src/geanyprj.c +++ b/geanyprj/src/geanyprj.c @@ -34,7 +34,7 @@ #include "geanyprj.h" -PLUGIN_VERSION_CHECK(147) +PLUGIN_VERSION_CHECK(221) PLUGIN_SET_INFO(_("Project"), _("Alternative project support."), VERSION, "Yura Siamashka ") diff --git a/geanyprj/src/project.c b/geanyprj/src/project.c index 401ef4494..27a2ca17c 100644 --- a/geanyprj/src/project.c +++ b/geanyprj/src/project.c @@ -83,7 +83,11 @@ gboolean (*project_type_filter[NEW_PROJECT_TYPE_SIZE]) (const gchar *) = { static void free_tag_object(gpointer obj) { - tm_workspace_remove_object((TMWorkObject *) obj, TRUE, FALSE); + if (obj != NULL) + { + tm_workspace_remove_source_file((TMSourceFile *) obj); + tm_source_file_free((TMSourceFile *) obj); + } } @@ -101,7 +105,7 @@ struct GeanyPrj *geany_project_new(void) struct GeanyPrj *geany_project_load(const gchar *path) { struct GeanyPrj *ret; - TMWorkObject *tm_obj = NULL; + TMSourceFile *tm_obj = NULL; GKeyFile *config; gint i = 0; gchar *file; @@ -153,6 +157,8 @@ struct GeanyPrj *geany_project_load(const gchar *path) } else { + GPtrArray *to_add = g_ptr_array_new(); + /* Create tag files */ key = g_strdup_printf("file%d", i); while ((file = g_key_file_get_string(config, "files", key, NULL))) @@ -160,13 +166,13 @@ struct GeanyPrj *geany_project_load(const gchar *path) filename = get_full_path(path, file); locale_filename = utils_get_locale_from_utf8(filename); - tm_obj = tm_source_file_new(locale_filename, FALSE, + tm_obj = tm_source_file_new(locale_filename, filetypes_detect_from_file(filename)->name); g_free(locale_filename); if (tm_obj) { g_hash_table_insert(ret->tags, filename, tm_obj); - tm_source_file_update(tm_obj, TRUE, FALSE, TRUE); + g_ptr_array_add(to_add, tm_obj); } else g_free(filename); @@ -175,6 +181,8 @@ struct GeanyPrj *geany_project_load(const gchar *path) g_free(file); key = g_strdup_printf("file%d", i); } + tm_workspace_add_source_files(to_add); + g_ptr_array_free(to_add, TRUE); g_free(key); } g_key_file_free(config); @@ -182,18 +190,28 @@ struct GeanyPrj *geany_project_load(const gchar *path) } -#if !GLIB_CHECK_VERSION(2, 12, 0) -static gboolean get_true(gpointer key, gpointer value, gpointer user_data) -{ - return TRUE; -} - - -static void g_hash_table_remove_all(GHashTable *hash_table) +static void remove_all_tags(struct GeanyPrj *prj) { - g_hash_table_foreach_remove(hash_table, get_true, NULL); + GPtrArray *to_remove, *keys; + GHashTableIter iter; + gpointer key, value; + + /* instead of relatively slow removal of source files by one from the tag manager, + * use the bulk operations - this requires that the normal destroy function + * of GHashTable is skipped - steal the keys and values and handle them manually */ + to_remove = g_ptr_array_new_with_free_func((GFreeFunc)tm_source_file_free); + keys = g_ptr_array_new_with_free_func(g_free); + g_hash_table_iter_init(&iter, prj->tags); + while (g_hash_table_iter_next(&iter, &key, &value)) + { + g_ptr_array_add(to_remove, value); + g_ptr_array_add(keys, key); + } + tm_workspace_remove_source_files(to_remove); + g_hash_table_steal_all(prj->tags); + g_ptr_array_free(to_remove, TRUE); + g_ptr_array_free(keys, TRUE); } -#endif void geany_project_regenerate_file_list(struct GeanyPrj *prj) @@ -201,7 +219,7 @@ void geany_project_regenerate_file_list(struct GeanyPrj *prj) GSList *lst; debug("%s path=%s\n", __FUNCTION__, prj->base_path); - g_hash_table_remove_all(prj->tags); + remove_all_tags(prj); lst = get_file_list(prj->base_path, NULL, project_type_filter[prj->type], NULL); geany_project_set_tags_from_list(prj, lst); @@ -298,24 +316,25 @@ void geany_project_set_tags_from_list(struct GeanyPrj *prj, GSList *files) { GSList *tmp; gchar *locale_filename; - TMWorkObject *tm_obj = NULL; + TMSourceFile *tm_obj = NULL; + GPtrArray *to_add = g_ptr_array_new(); - if (prj->tags) - g_hash_table_destroy(prj->tags); prj->tags = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, free_tag_object); for (tmp = files; tmp != NULL; tmp = g_slist_next(tmp)) { locale_filename = utils_get_locale_from_utf8(tmp->data); - tm_obj = tm_source_file_new(locale_filename, FALSE, + tm_obj = tm_source_file_new(locale_filename, filetypes_detect_from_file(tmp->data)->name); g_free(locale_filename); if (tm_obj) { g_hash_table_insert(prj->tags, g_strdup(tmp->data), tm_obj); - tm_source_file_update(tm_obj, TRUE, FALSE, TRUE); + g_ptr_array_add(to_add, tm_obj); } } + tm_workspace_add_source_files(to_add); + g_ptr_array_free(to_add, TRUE); } @@ -335,7 +354,10 @@ void geany_project_free(struct GeanyPrj *prj) if (prj->run_cmd) g_free(prj->run_cmd); if (prj->tags) + { + remove_all_tags(prj); g_hash_table_destroy(prj->tags); + } g_free(prj); } @@ -344,7 +366,7 @@ void geany_project_free(struct GeanyPrj *prj) gboolean geany_project_add_file(struct GeanyPrj *prj, const gchar *path) { gchar *filename; - TMWorkObject *tm_obj = NULL; + TMSourceFile *tm_obj = NULL; GKeyFile *config; @@ -363,12 +385,12 @@ gboolean geany_project_add_file(struct GeanyPrj *prj, const gchar *path) g_key_file_free(config); filename = utils_get_locale_from_utf8(path); - tm_obj = tm_source_file_new(filename, FALSE, filetypes_detect_from_file(path)->name); + tm_obj = tm_source_file_new(filename, filetypes_detect_from_file(path)->name); g_free(filename); if (tm_obj) { g_hash_table_insert(prj->tags, g_strdup(path), tm_obj); - tm_source_file_update(tm_obj, TRUE, FALSE, TRUE); + tm_workspace_add_source_file(tm_obj); } geany_project_save(prj); return TRUE; diff --git a/geanyprj/src/xproject.c b/geanyprj/src/xproject.c index 9621e4b0c..bf0038c47 100644 --- a/geanyprj/src/xproject.c +++ b/geanyprj/src/xproject.c @@ -35,17 +35,15 @@ struct GeanyPrj *g_current_project = NULL; static GPtrArray *g_projects = NULL; -static void add_tag(G_GNUC_UNUSED gpointer key, gpointer value, G_GNUC_UNUSED gpointer user_data) +static void collect_tags(G_GNUC_UNUSED gpointer key, gpointer value, gpointer user_data) { + GPtrArray *array = user_data; + debug("%s file=%s\n", __FUNCTION__, (const gchar *)key); - tm_workspace_add_object((TMWorkObject *)value); -} - - -static void remove_tag(G_GNUC_UNUSED gpointer key, gpointer value, G_GNUC_UNUSED gpointer user_data) -{ - debug("%s file=%s\n", __FUNCTION__, (const gchar *)key); - tm_workspace_remove_object((TMWorkObject *)value, FALSE, FALSE); + if (value != NULL) + { + g_ptr_array_add(array, value); + } } @@ -59,7 +57,6 @@ void xproject_close(gboolean cache) if (cache) { - g_hash_table_foreach(g_current_project->tags, remove_tag, NULL); g_ptr_array_add(g_projects, g_current_project); } else @@ -76,6 +73,7 @@ void xproject_open(const gchar *path) { guint i; struct GeanyPrj *p = NULL; + GPtrArray *to_reload; debug("%s\n", __FUNCTION__); for (i = 0; i < g_projects->len; i++) @@ -94,7 +92,11 @@ void xproject_open(const gchar *path) return; ui_set_statusbar(TRUE, _("Project \"%s\" opened."), p->name); - g_hash_table_foreach(p->tags, add_tag, NULL); + to_reload = g_ptr_array_new(); + g_hash_table_foreach(p->tags, collect_tags, to_reload); + tm_workspace_remove_source_files(to_reload); + tm_workspace_add_source_files(to_reload); + g_ptr_array_free(to_reload, TRUE); g_current_project = p; sidebar_refresh(); @@ -104,23 +106,27 @@ void xproject_open(const gchar *path) void xproject_update_tag(const gchar *filename) { guint i; - TMWorkObject *tm_obj; + TMSourceFile *tm_obj; if (g_current_project) { tm_obj = g_hash_table_lookup(g_current_project->tags, filename); if (tm_obj) { - tm_source_file_update(tm_obj, TRUE, FALSE, TRUE); + /* force tag update */ + tm_workspace_remove_source_file(tm_obj); + tm_workspace_add_source_file(tm_obj); } } for (i = 0; i < g_projects->len; i++) { - tm_obj = (TMWorkObject *)g_hash_table_lookup(((struct GeanyPrj *)(g_projects->pdata[i]))->tags, filename); + tm_obj = (TMSourceFile *)g_hash_table_lookup(((struct GeanyPrj *)(g_projects->pdata[i]))->tags, filename); if (tm_obj) { - tm_source_file_update(tm_obj, TRUE, FALSE, TRUE); + /* force tag update */ + tm_workspace_remove_source_file(tm_obj); + tm_workspace_add_source_file(tm_obj); } } } @@ -128,8 +134,6 @@ void xproject_update_tag(const gchar *filename) gboolean xproject_add_file(const gchar *path) { - TMWorkObject *tm_obj; - debug("%s path=%s\n", __FUNCTION__, path); if (!g_current_project) @@ -137,11 +141,6 @@ gboolean xproject_add_file(const gchar *path) if (geany_project_add_file(g_current_project, path)) { - tm_obj = (TMWorkObject *) g_hash_table_lookup(g_current_project->tags, path); - if (tm_obj) - { - tm_workspace_add_object((TMWorkObject *) tm_obj); - } sidebar_refresh(); return TRUE; } @@ -151,17 +150,17 @@ gboolean xproject_add_file(const gchar *path) gboolean xproject_remove_file(const gchar *path) { - TMWorkObject *tm_obj; + TMSourceFile *tm_obj; debug("%s path=%s\n", __FUNCTION__, path); if (!g_current_project) return FALSE; - tm_obj = (TMWorkObject *) g_hash_table_lookup(g_current_project->tags, path); + tm_obj = (TMSourceFile *) g_hash_table_lookup(g_current_project->tags, path); if (tm_obj) { - tm_workspace_remove_object(tm_obj, FALSE, FALSE); + tm_workspace_remove_source_file(tm_obj); } if (geany_project_remove_file(g_current_project, path)) From c466fba9c1ce79ee8812292393ffb8f3bc32a2fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Techet?= Date: Sat, 8 Nov 2014 19:57:50 +0100 Subject: [PATCH 3/3] gproject: Update to the latest Geany tagmanager API --- gproject/src/gproject-main.c | 2 +- gproject/src/gproject-project.c | 115 +++++++++++++++++++++----------- gproject/src/gproject-project.h | 2 +- 3 files changed, 78 insertions(+), 41 deletions(-) diff --git a/gproject/src/gproject-main.c b/gproject/src/gproject-main.c index 3df95b0dd..cf2c9d45c 100644 --- a/gproject/src/gproject-main.c +++ b/gproject/src/gproject-main.c @@ -32,7 +32,7 @@ #include "gproject-sidebar.h" #include "gproject-menu.h" -PLUGIN_VERSION_CHECK(214) +PLUGIN_VERSION_CHECK(221) PLUGIN_SET_INFO(_("GProject"), _("Glob-pattern-based project management plugin for Geany."), VERSION, diff --git a/gproject/src/gproject-project.c b/gproject/src/gproject-project.c index 4365c9626..4cb46a38f 100644 --- a/gproject/src/gproject-project.c +++ b/gproject/src/gproject-project.c @@ -72,48 +72,29 @@ static void deferred_op_queue_clean(void) } -static void workspace_add_tag(gchar *filename, TagObject *obj, gpointer foo) -{ - TMWorkObject *tm_obj = NULL; - - if (!document_find_by_filename(filename)) - { - gchar *locale_filename; - - locale_filename = utils_get_locale_from_utf8(filename); - tm_obj = tm_source_file_new(locale_filename, FALSE, filetypes_detect_from_file(filename)->name); - g_free(locale_filename); - - if (tm_obj) - { - tm_workspace_add_object(tm_obj); - tm_source_file_update(tm_obj, TRUE, FALSE, TRUE); - } - } - - if (obj->tag) - tm_workspace_remove_object(obj->tag, TRUE, TRUE); - - obj->tag = tm_obj; -} - - static void workspace_add_file_tag(gchar *filename) { TagObject *obj; obj = g_hash_table_lookup(g_prj->file_tag_table, filename); if (obj) - workspace_add_tag(filename, obj, NULL); -} + { + TMSourceFile *tm_obj = NULL; + + if (!document_find_by_filename(filename)) + { + tm_obj = tm_source_file_new(filename, filetypes_detect_from_file(filename)->name); + if (tm_obj) + tm_workspace_add_source_file(tm_obj); + } + if (obj->tag) + { + tm_workspace_remove_source_file(obj->tag); + tm_source_file_free(obj->tag); + } -static void workspace_remove_tag(gchar *filename, TagObject *obj, gpointer foo) -{ - if (obj->tag) - { - tm_workspace_remove_object(obj->tag, TRUE, TRUE); - obj->tag = NULL; + obj->tag = tm_obj; } } @@ -123,8 +104,12 @@ static void workspace_remove_file_tag(gchar *filename) TagObject *obj; obj = g_hash_table_lookup(g_prj->file_tag_table, filename); - if (obj) - workspace_remove_tag(filename, obj, NULL); + if (obj && obj->tag) + { + tm_workspace_remove_source_file(obj->tag); + tm_source_file_free(obj->tag); + obj->tag = NULL; + } } @@ -217,6 +202,58 @@ static GSList *get_file_list(const gchar * path, GSList *patterns, GSList *ignor } +static void remove_all_tags() +{ + GPtrArray *to_update; + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init (&iter, g_prj->file_tag_table); + to_update = g_ptr_array_new(); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + TagObject *obj = value; + + g_ptr_array_add(to_update, obj->tag); + obj->tag = NULL; + } + + tm_workspace_remove_source_files(to_update); + g_ptr_array_foreach(to_update, (GFunc)tm_source_file_free, NULL); + g_ptr_array_free(to_update, TRUE); +} + + +static void add_all_tags() +{ + GPtrArray *to_update; + GHashTableIter iter; + gpointer key, value; + + g_hash_table_iter_init (&iter, g_prj->file_tag_table); + to_update = g_ptr_array_new(); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + TagObject *obj = value; + gchar *filename = key; + TMSourceFile *tm_obj = NULL; + + if (!document_find_by_filename(filename)) + { + tm_obj = tm_source_file_new(filename, filetypes_detect_from_file(filename)->name); + + if (tm_obj) + g_ptr_array_add(to_update, tm_obj); + } + + obj->tag = tm_obj; + } + + tm_workspace_add_source_files(to_update); + g_ptr_array_free(to_update, TRUE); +} + + void gprj_project_rescan(void) { GSList *pattern_list = NULL; @@ -228,7 +265,7 @@ void gprj_project_rescan(void) return; if (g_prj->generate_tags) - g_hash_table_foreach(g_prj->file_tag_table, (GHFunc)workspace_remove_tag, NULL); + remove_all_tags(); g_hash_table_destroy(g_prj->file_tag_table); g_prj->file_tag_table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); @@ -257,7 +294,7 @@ void gprj_project_rescan(void) } if (g_prj->generate_tags) - g_hash_table_foreach(g_prj->file_tag_table, (GHFunc)workspace_add_tag, NULL); + add_all_tags(); g_slist_foreach(lst, (GFunc) g_free, NULL); g_slist_free(lst); @@ -470,7 +507,7 @@ void gprj_project_close(void) return; /* can happen on plugin reload */ if (g_prj->generate_tags) - g_hash_table_foreach(g_prj->file_tag_table, (GHFunc)workspace_remove_tag, NULL); + remove_all_tags(); deferred_op_queue_clean(); diff --git a/gproject/src/gproject-project.h b/gproject/src/gproject-project.h index 9f44cf97b..6d6d41951 100644 --- a/gproject/src/gproject-project.h +++ b/gproject/src/gproject-project.h @@ -22,7 +22,7 @@ typedef struct { - TMWorkObject *tag; + TMSourceFile *tag; } TagObject;