[gnome-builder] code-index: be more lazy creating code indexers
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] code-index: be more lazy creating code indexers
- Date: Wed, 10 Jan 2018 01:14:07 +0000 (UTC)
commit d8cd6cf48b8e5c6210e83bfe099edc519f3be3fb
Author: Christian Hergert <chergert redhat com>
Date: Tue Jan 9 17:13:33 2018 -0800
code-index: be more lazy creating code indexers
Don't create them until necessary. We can also just store an adapter
which won't hold any objects for a given extension as a negative hit
for a given language.
We can also use const/interned strings for the key and direct pointer
comparison.
src/plugins/code-index/ide-code-index-service.c | 91 +++++++++--------------
1 files changed, 35 insertions(+), 56 deletions(-)
---
diff --git a/src/plugins/code-index/ide-code-index-service.c b/src/plugins/code-index/ide-code-index-service.c
index c056a2c..81b2479 100644
--- a/src/plugins/code-index/ide-code-index-service.c
+++ b/src/plugins/code-index/ide-code-index-service.c
@@ -346,12 +346,11 @@ static void
ide_code_index_service_context_loaded (IdeService *service)
{
IdeCodeIndexService *self = (IdeCodeIndexService *)service;
+ IdeBufferManager *bufmgr;
IdeContext *context;
IdeProject *project;
- IdeBufferManager *bufmgr;
IdeVcs *vcs;
GFile *workdir;
- const GList *plugins;
g_assert (IDE_IS_CODE_INDEX_SERVICE (self));
@@ -361,47 +360,7 @@ ide_code_index_service_context_loaded (IdeService *service)
vcs = ide_context_get_vcs (context);
workdir = ide_vcs_get_working_directory (vcs);
- self->code_indexers = g_hash_table_new_full (g_str_hash,
- g_str_equal,
- g_free,
- g_object_unref);
-
- plugins = peas_engine_get_plugin_list (peas_engine_get_default ());
-
- while (plugins != NULL)
- {
- PeasPluginInfo *plugin_info;
- const gchar *value;
-
- plugin_info = plugins->data;
-
- value = peas_plugin_info_get_external_data (plugin_info, "Code-Indexer-Languages");
-
- if (value != NULL)
- {
- g_auto(GStrv) languages = NULL;
-
- languages = g_strsplit (value, ",", 0);
-
- for (guint i = 0; languages[i] != NULL; i++)
- {
- g_autoptr(IdeExtensionAdapter) adapter = NULL;
-
- adapter = ide_extension_adapter_new (context,
- NULL,
- IDE_TYPE_CODE_INDEXER,
- "Code-Indexer-Languages",
- languages[i]);
-
- g_hash_table_insert (self->code_indexers,
- g_strdup (languages[i]),
- g_steal_pointer (&adapter));
- }
- }
-
- plugins = plugins->next;
- }
-
+ self->code_indexers = g_hash_table_new_full (NULL, NULL, NULL, g_object_unref);
self->index = ide_code_index_index_new (context);
self->builder = ide_code_index_builder_new (context, self->index, self);
self->build_dirs = g_hash_table_new_full (g_file_hash,
@@ -569,33 +528,53 @@ ide_code_index_service_get_index (IdeCodeIndexService *self)
return self->index;
}
+/**
+ * ide_code_index_service_get_code_indexer:
+ * @self: a #IdeCodeIndexService
+ * @file_name: the name of the file to index
+ *
+ * Gets an #IdeCodeIndexer suitable for @file_name.
+ *
+ * Returns: (transfer none) (nullable): an #IdeCodeIndexer or %NULL
+ *
+ * Since: 3.26
+ */
IdeCodeIndexer *
ide_code_index_service_get_code_indexer (IdeCodeIndexService *self,
const gchar *file_name)
{
- IdeExtensionAdapter *code_indexer;
GtkSourceLanguageManager *manager;
+ IdeExtensionAdapter *adapter;
GtkSourceLanguage *language;
- const gchar *lang;
+ const gchar *lang_id;
g_return_val_if_fail (IDE_IS_CODE_INDEX_SERVICE (self), NULL);
g_return_val_if_fail (file_name != NULL, NULL);
- if (self->code_indexers == NULL)
+ if (self->code_indexers == NULL ||
+ !(manager = gtk_source_language_manager_get_default ()) ||
+ !(language = gtk_source_language_manager_guess_language (manager, file_name, NULL)) ||
+ !(lang_id = gtk_source_language_get_id (language)))
return NULL;
- manager = gtk_source_language_manager_get_default ();
- language = gtk_source_language_manager_guess_language (manager, file_name, NULL);
+ lang_id = g_intern_string (lang_id);
+ adapter = g_hash_table_lookup (self->code_indexers, lang_id);
- if (language == NULL)
- return NULL;
+ g_assert (!adapter || IDE_IS_EXTENSION_ADAPTER (adapter));
- lang = gtk_source_language_get_id (language);
+ if (adapter == NULL)
+ {
+ IdeContext *context = ide_object_get_context (IDE_OBJECT (self));
+
+ adapter = ide_extension_adapter_new (context,
+ peas_engine_get_default (),
+ IDE_TYPE_CODE_INDEXER,
+ "Code-Indexer-Languages",
+ lang_id);
+ g_hash_table_insert (self->code_indexers, (gchar *)lang_id, adapter);
+ }
- code_indexer = g_hash_table_lookup (self->code_indexers, lang);
+ g_assert (IDE_IS_EXTENSION_ADAPTER (adapter));
- if (code_indexer == NULL)
- return NULL;
- else
- return ide_extension_adapter_get_extension (code_indexer);
+ return ide_extension_adapter_get_extension (adapter);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]