[gnome-builder] libide/search: port search providers to GListModel



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]