[gnome-builder] libide/search: port search providers to GListModel
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] libide/search: port search providers to GListModel
- Date: Fri, 15 Jul 2022 23:16:19 +0000 (UTC)
commit 0e3c1abd6ba400fef09091c732ea13579f5abab7
Author: Christian Hergert <chergert redhat com>
Date: Fri Jul 15 16:15:01 2022 -0700
libide/search: port search providers to GListModel
A bunch of the search providers could benefit from also being made more
lazy like we do with completion engines. However, this is a good first
step to be able to get there.
src/libide/lsp/ide-lsp-search-provider.c | 55 +++++++++++++---------
src/libide/search/ide-search-engine.c | 35 +++++---------
src/libide/search/ide-search-provider.c | 23 +++++++--
src/libide/search/ide-search-provider.h | 44 ++++++++---------
src/libide/search/ide-search-result.h | 3 --
.../code-index/ide-code-index-search-provider.c | 31 +++++++-----
src/plugins/file-search/gbp-file-search-provider.c | 29 ++++++++----
.../shellcmd/gbp-shellcmd-search-provider.c | 4 +-
8 files changed, 125 insertions(+), 99 deletions(-)
---
diff --git a/src/libide/lsp/ide-lsp-search-provider.c b/src/libide/lsp/ide-lsp-search-provider.c
index 2e330f75e..18b50e65d 100644
--- a/src/libide/lsp/ide-lsp-search-provider.c
+++ b/src/libide/lsp/ide-lsp-search-provider.c
@@ -156,40 +156,46 @@ ide_lsp_search_provider_init (IdeLspSearchProvider *self)
static void
ide_lsp_search_provider_search_cb (GObject *object,
- GAsyncResult *res,
+ GAsyncResult *result,
gpointer user_data)
{
IdeLspClient *client = (IdeLspClient *)object;
g_autoptr(IdeTask) task = user_data;
- g_autoptr(GVariant) result = NULL;
g_autoptr(GVariantIter) iter = NULL;
+ g_autoptr(GListStore) store = NULL;
+ g_autoptr(GVariant) res = NULL;
g_autoptr(GError) error = NULL;
GVariant *symbol_information;
- GPtrArray *ar;
IDE_ENTRY;
- ar = g_ptr_array_new_with_free_func (g_object_unref);
+ g_assert (IDE_IS_MAIN_THREAD ());
+ g_assert (IDE_IS_LSP_CLIENT (client));
+ g_assert (G_IS_ASYNC_RESULT (result));
+ g_assert (IDE_IS_TASK (task));
- if (!ide_lsp_client_call_finish (client, res, &result, &error))
+ if (!ide_lsp_client_call_finish (client, result, &res, &error))
{
ide_task_return_error (task, g_steal_pointer (&error));
IDE_EXIT;
}
- iter = g_variant_iter_new (result);
+ store = g_list_store_new (IDE_TYPE_SEARCH_RESULT);
+ iter = g_variant_iter_new (res);
while (g_variant_iter_loop (iter, "v", &symbol_information))
{
- g_autoptr(GFile) gfile = NULL;
+ g_autoptr(IdeLspSearchResult) item = NULL;
g_autoptr(IdeLocation) location = NULL;
- g_autofree gchar *base = NULL;
- const gchar *title;
- const gchar *uri;
- gint64 kind;
- gint64 line, character;
+ g_autoptr(GFile) gfile = NULL;
+ g_autofree char *base = NULL;
IdeSymbolKind symbol_kind;
- const gchar *icon_name;
+ const char *icon_name;
+ const char *title;
+ const char *uri;
+ gint64 kind;
+ gint64 line;
+ gint64 character;
JSONRPC_MESSAGE_PARSE (symbol_information,
"name", JSONRPC_MESSAGE_GET_STRING (&title),
@@ -211,19 +217,18 @@ ide_lsp_search_provider_search_cb (GObject *object,
location = ide_location_new (gfile, line, character);
base = g_file_get_basename (gfile);
- g_ptr_array_add (ar, ide_lsp_search_result_new (title, base, location, icon_name));
+ item = ide_lsp_search_result_new (title, base, location, icon_name);
+ g_list_store_append (store, item);
}
- ide_task_return_pointer (task,
- g_steal_pointer (&ar),
- g_ptr_array_unref);
+ ide_task_return_pointer (task, g_steal_pointer (&store), g_object_unref);
IDE_EXIT;
}
static void
ide_lsp_search_provider_search_async (IdeSearchProvider *provider,
- const gchar *query,
+ const char *query,
guint max_results,
GCancellable *cancellable,
GAsyncReadyCallback callback,
@@ -265,20 +270,24 @@ ide_lsp_search_provider_search_async (IdeSearchProvider *provider,
IDE_EXIT;
}
-static GPtrArray *
+static GListModel *
ide_lsp_search_provider_search_finish (IdeSearchProvider *provider,
GAsyncResult *result,
GError **error)
{
- g_autoptr(GPtrArray) ret = NULL;
+ GListModel *ret;
+ IDE_ENTRY;
+
+ g_assert (IDE_IS_MAIN_THREAD ());
g_assert (IDE_IS_SEARCH_PROVIDER (provider));
g_assert (IDE_IS_TASK (result));
- if ((ret = ide_task_propagate_pointer (IDE_TASK (result), error)))
- return IDE_PTR_ARRAY_STEAL_FULL (&ret);
+ ret = ide_task_propagate_pointer (IDE_TASK (result), error);
+
+ g_assert (!ret || G_IS_LIST_MODEL (ret));
- return NULL;
+ IDE_RETURN (ret);
}
static void
diff --git a/src/libide/search/ide-search-engine.c b/src/libide/search/ide-search-engine.c
index d0c8c9f61..580a35f27 100644
--- a/src/libide/search/ide-search-engine.c
+++ b/src/libide/search/ide-search-engine.c
@@ -232,7 +232,7 @@ ide_search_engine_search_cb (GObject *object,
IdeSearchProvider *provider = (IdeSearchProvider *)object;
g_autoptr(IdeTask) task = user_data;
g_autoptr(GError) error = NULL;
- g_autoptr(GPtrArray) ar = NULL;
+ g_autoptr(GListModel) ret = NULL;
Request *r;
g_assert (IDE_IS_SEARCH_PROVIDER (provider));
@@ -245,35 +245,24 @@ ide_search_engine_search_cb (GObject *object,
g_assert (r->outstanding > 0);
g_assert (G_IS_LIST_STORE (r->store));
- ar = ide_search_provider_search_finish (provider, result, &error);
- IDE_PTR_ARRAY_SET_FREE_FUNC (ar, g_object_unref);
-
- if (error != NULL)
+ if (!(ret = ide_search_provider_search_finish (provider, result, &error)))
{
- if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) &&
- !g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED))
+ if (!ide_error_ignore (error))
g_warning ("%s", error->message);
goto cleanup;
}
- for (guint i = 0; i < ar->len; i++)
- {
- IdeSearchResult *item = g_ptr_array_index (ar, i);
-
- g_assert (IDE_IS_SEARCH_RESULT (item));
-
- g_list_store_insert_sorted (r->store,
- item,
- (GCompareDataFunc)ide_search_result_compare,
- NULL);
-
- }
+ g_list_store_append (r->store, ret);
cleanup:
r->outstanding--;
if (r->outstanding == 0)
- ide_task_return_pointer (task, g_steal_pointer (&r->store), g_object_unref);
+ ide_task_return_pointer (task,
+ g_object_new (GTK_TYPE_FLATTEN_LIST_MODEL,
+ "model", r->store,
+ NULL),
+ g_object_unref);
}
static void
@@ -356,7 +345,7 @@ ide_search_engine_search_async (IdeSearchEngine *self,
r->query = g_strdup (query);
r->max_results = max_results;
r->task = task;
- r->store = g_list_store_new (IDE_TYPE_SEARCH_RESULT);
+ r->store = g_list_store_new (G_TYPE_LIST_MODEL);
r->outstanding = 0;
ide_task_set_task_data (task, r, request_destroy);
@@ -370,9 +359,7 @@ ide_search_engine_search_async (IdeSearchEngine *self,
self->active_count += r->outstanding;
if (r->outstanding == 0)
- ide_task_return_pointer (task,
- g_object_ref (r->store),
- g_object_unref);
+ ide_task_return_unsupported_error (task);
g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_BUSY]);
}
diff --git a/src/libide/search/ide-search-provider.c b/src/libide/search/ide-search-provider.c
index 8e359540e..62aaf6653 100644
--- a/src/libide/search/ide-search-provider.c
+++ b/src/libide/search/ide-search-provider.c
@@ -48,7 +48,7 @@ ide_search_provider_real_search_async (IdeSearchProvider *self,
"search not implemented");
}
-static GPtrArray *
+static GListModel *
ide_search_provider_real_search_finish (IdeSearchProvider *self,
GAsyncResult *result,
GError **error)
@@ -94,11 +94,16 @@ ide_search_provider_search_async (IdeSearchProvider *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
+ IDE_ENTRY;
+
+ g_return_if_fail (IDE_IS_MAIN_THREAD ());
g_return_if_fail (IDE_IS_SEARCH_PROVIDER (self));
g_return_if_fail (query != NULL);
g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
IDE_SEARCH_PROVIDER_GET_IFACE (self)->search_async (self, query, max_results, cancellable, callback,
user_data);
+
+ IDE_EXIT;
}
/**
@@ -109,16 +114,24 @@ ide_search_provider_search_async (IdeSearchProvider *self,
*
* Completes a request to a search provider.
*
- * Returns: (transfer full) (element-type IdeSearchResult): a #GPtrArray
- * of #IdeSearchResult elements.
+ * Returns: (transfer full): a #GListModel of #IdeSearchResult
*/
-GPtrArray *
+GListModel *
ide_search_provider_search_finish (IdeSearchProvider *self,
GAsyncResult *result,
GError **error)
{
+ GListModel *ret;
+
+ IDE_ENTRY;
+
+ g_return_val_if_fail (IDE_IS_MAIN_THREAD (), NULL);
g_return_val_if_fail (IDE_IS_SEARCH_PROVIDER (self), NULL);
g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL);
- return IDE_SEARCH_PROVIDER_GET_IFACE (self)->search_finish (self, result, error);
+ ret = IDE_SEARCH_PROVIDER_GET_IFACE (self)->search_finish (self, result, error);
+
+ g_return_val_if_fail (!ret || G_IS_LIST_MODEL (ret), NULL);
+
+ IDE_RETURN (ret);
}
diff --git a/src/libide/search/ide-search-provider.h b/src/libide/search/ide-search-provider.h
index 68b18e8bc..c824a2618 100644
--- a/src/libide/search/ide-search-provider.h
+++ b/src/libide/search/ide-search-provider.h
@@ -37,33 +37,33 @@ struct _IdeSearchProviderInterface
{
GTypeInterface parent_interface;
- void (*load) (IdeSearchProvider *self);
- void (*unload) (IdeSearchProvider *self);
- void (*search_async) (IdeSearchProvider *self,
- const gchar *query,
- guint max_results,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
- GPtrArray *(*search_finish) (IdeSearchProvider *self,
- GAsyncResult *result,
- GError **error);
+ void (*load) (IdeSearchProvider *self);
+ void (*unload) (IdeSearchProvider *self);
+ void (*search_async) (IdeSearchProvider *self,
+ const gchar *query,
+ guint max_results,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+ GListModel *(*search_finish) (IdeSearchProvider *self,
+ GAsyncResult *result,
+ GError **error);
};
IDE_AVAILABLE_IN_ALL
-void ide_search_provider_load (IdeSearchProvider *self);
+void ide_search_provider_load (IdeSearchProvider *self);
IDE_AVAILABLE_IN_ALL
-void ide_search_provider_unload (IdeSearchProvider *self);
+void ide_search_provider_unload (IdeSearchProvider *self);
IDE_AVAILABLE_IN_ALL
-void ide_search_provider_search_async (IdeSearchProvider *self,
- const gchar *query,
- guint max_results,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
+void ide_search_provider_search_async (IdeSearchProvider *self,
+ const gchar *query,
+ guint max_results,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
IDE_AVAILABLE_IN_ALL
-GPtrArray *ide_search_provider_search_finish (IdeSearchProvider *self,
- GAsyncResult *result,
- GError **error);
+GListModel *ide_search_provider_search_finish (IdeSearchProvider *self,
+ GAsyncResult *result,
+ GError **error);
G_END_DECLS
diff --git a/src/libide/search/ide-search-result.h b/src/libide/search/ide-search-result.h
index 71e61bc80..b33e92dea 100644
--- a/src/libide/search/ide-search-result.h
+++ b/src/libide/search/ide-search-result.h
@@ -41,9 +41,6 @@ struct _IdeSearchResultClass
void (*activate) (IdeSearchResult *self,
GtkWidget *last_focus);
-
- /*< private >*/
- gpointer _reserved[8];
};
IDE_AVAILABLE_IN_ALL
diff --git a/src/plugins/code-index/ide-code-index-search-provider.c
b/src/plugins/code-index/ide-code-index-search-provider.c
index 5e0e6ae0e..b548af82f 100644
--- a/src/plugins/code-index/ide-code-index-search-provider.c
+++ b/src/plugins/code-index/ide-code-index-search-provider.c
@@ -35,20 +35,27 @@ populate_cb (GObject *object,
IdeCodeIndexIndex *index = (IdeCodeIndexIndex *)object;
g_autoptr(IdeTask) task = user_data;
g_autoptr(GPtrArray) results = NULL;
+ g_autoptr(GListStore) store = NULL;
g_autoptr(GError) error = NULL;
+ IDE_ENTRY;
+
+ g_assert (IDE_IS_MAIN_THREAD ());
g_assert (IDE_IS_CODE_INDEX_INDEX (index));
g_assert (G_IS_ASYNC_RESULT (result));
g_assert (IDE_IS_TASK (task));
- results = ide_code_index_index_populate_finish (index, result, &error);
+ if (!(results = ide_code_index_index_populate_finish (index, result, &error)))
+ {
+ ide_task_return_error (task, g_steal_pointer (&error));
+ IDE_EXIT;
+ }
- if (results != NULL)
- ide_task_return_pointer (task,
- g_steal_pointer (&results),
- g_ptr_array_unref);
- else
- ide_task_return_error (task, g_steal_pointer (&error));
+ store = g_list_store_new (IDE_TYPE_SEARCH_RESULT);
+ g_list_store_splice (store, 0, 0, results->pdata, results->len);
+ ide_task_return_pointer (task, g_steal_pointer (&store), g_object_unref);
+
+ IDE_EXIT;
}
static void
@@ -106,12 +113,12 @@ ide_code_index_search_provider_search_async (IdeSearchProvider *provider,
IDE_EXIT;
}
-static GPtrArray *
+static GListModel *
ide_code_index_search_provider_search_finish (IdeSearchProvider *provider,
GAsyncResult *result,
GError **error)
{
- GPtrArray *ar;
+ GListModel *ret;
IDE_ENTRY;
@@ -119,9 +126,11 @@ ide_code_index_search_provider_search_finish (IdeSearchProvider *provider,
g_return_val_if_fail (IDE_IS_CODE_INDEX_SEARCH_PROVIDER (provider), NULL);
g_return_val_if_fail (IDE_IS_TASK (result), NULL);
- ar = ide_task_propagate_pointer (IDE_TASK (result), error);
+ ret = ide_task_propagate_pointer (IDE_TASK (result), error);
+
+ g_return_val_if_fail (!ret || G_IS_LIST_MODEL (ret), NULL);
- IDE_RETURN (IDE_PTR_ARRAY_STEAL_FULL (&ar));
+ IDE_RETURN (ret);
}
static void
diff --git a/src/plugins/file-search/gbp-file-search-provider.c
b/src/plugins/file-search/gbp-file-search-provider.c
index bb48a3203..5d7e7df12 100644
--- a/src/plugins/file-search/gbp-file-search-provider.c
+++ b/src/plugins/file-search/gbp-file-search-provider.c
@@ -54,8 +54,11 @@ gbp_file_search_provider_search_async (IdeSearchProvider *provider,
gpointer user_data)
{
GbpFileSearchProvider *self = (GbpFileSearchProvider *)provider;
- g_autoptr(IdeTask) task = NULL;
+ g_autoptr(GListStore) store = NULL;
g_autoptr(GPtrArray) results = NULL;
+ g_autoptr(IdeTask) task = NULL;
+
+ IDE_ENTRY;
g_assert (IDE_IS_MAIN_THREAD ());
g_assert (GBP_IS_FILE_SEARCH_PROVIDER (self));
@@ -66,20 +69,28 @@ gbp_file_search_provider_search_async (IdeSearchProvider *provider,
ide_task_set_source_tag (task, gbp_file_search_provider_search_async);
ide_task_set_priority (task, G_PRIORITY_LOW);
- if (self->index != NULL)
- results = gbp_file_search_index_populate (self->index, search_terms, max_results);
- else
- results = g_ptr_array_new_with_free_func (g_object_unref);
+ if (self->index == NULL ||
+ !(results = gbp_file_search_index_populate (self->index, search_terms, max_results)))
+ {
+ ide_task_return_unsupported_error (task);
+ IDE_EXIT;
+ }
- ide_task_return_pointer (task, g_steal_pointer (&results), g_ptr_array_unref);
+ store = g_list_store_new (IDE_TYPE_SEARCH_RESULT);
+ g_list_store_splice (store, 0, 0, results->pdata, results->len);
+ ide_task_return_pointer (task, g_steal_pointer (&store), g_object_unref);
+
+ IDE_EXIT;
}
-static GPtrArray *
+static GListModel *
gbp_file_search_provider_search_finish (IdeSearchProvider *provider,
GAsyncResult *result,
GError **error)
{
- GPtrArray *ret;
+ GListModel *ret;
+
+ IDE_ENTRY;
g_assert (IDE_IS_MAIN_THREAD ());
g_assert (GBP_IS_FILE_SEARCH_PROVIDER (provider));
@@ -87,7 +98,7 @@ gbp_file_search_provider_search_finish (IdeSearchProvider *provider,
ret = ide_task_propagate_pointer (IDE_TASK (result), error);
- return IDE_PTR_ARRAY_STEAL_FULL (&ret);
+ IDE_RETURN (ret);
}
static void
diff --git a/src/plugins/shellcmd/gbp-shellcmd-search-provider.c
b/src/plugins/shellcmd/gbp-shellcmd-search-provider.c
index f72aeb8bd..3bf0164a9 100644
--- a/src/plugins/shellcmd/gbp-shellcmd-search-provider.c
+++ b/src/plugins/shellcmd/gbp-shellcmd-search-provider.c
@@ -61,12 +61,12 @@ gbp_shellcmd_search_provider_search_async (IdeSearchProvider *provider,
IDE_EXIT;
}
-static GPtrArray *
+static GListModel *
gbp_shellcmd_search_provider_search_finish (IdeSearchProvider *provider,
GAsyncResult *result,
GError **error)
{
- GPtrArray *ret;
+ GListModel *ret;
IDE_ENTRY;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]