[gnome-builder] libide/search: add unload vfunc and remove context parameter



commit cd1e0501317ea24c5e9c3768db355a927a3af621
Author: Christian Hergert <chergert redhat com>
Date:   Fri Jul 15 15:05:35 2022 -0700

    libide/search: add unload vfunc and remove context parameter
    
    The are IdeObjects now so they can just get the context from the IdeObject
    rather than the parameter.
    
    Unfortunately, we can't guarantee IdeContext object at unload time, so we
    won't pass a parameter to that anyway. Things that need it should keep a
    reference to what they use as members instead.

 src/libide/gui/ide-workbench.c                     |  3 +
 src/libide/search/ide-search-engine.c              | 37 ++++++-----
 src/libide/search/ide-search-provider.c            | 25 ++++----
 src/libide/search/ide-search-provider.h            |  9 +--
 src/plugins/file-search/gbp-file-search-provider.c | 40 ++++++------
 .../rust-analyzer/rust-analyzer-search-provider.c  | 14 ++---
 .../shellcmd/gbp-shellcmd-search-provider.c        | 71 +++++++++++++++++++++-
 src/plugins/vls/gbp-vls-search-provider.c          |  8 ++-
 8 files changed, 142 insertions(+), 65 deletions(-)
---
diff --git a/src/libide/gui/ide-workbench.c b/src/libide/gui/ide-workbench.c
index 0369761b9..42efc4a30 100644
--- a/src/libide/gui/ide-workbench.c
+++ b/src/libide/gui/ide-workbench.c
@@ -1662,6 +1662,9 @@ ide_workbench_unload_async (IdeWorkbench        *self,
                            G_CONNECT_SWAPPED);
   g_application_hold (app);
 
+  /* Release the search engine early to help it cleanup */
+  ide_clear_and_destroy_object (&self->search_engine);
+
   /*
    * Remove our workbench from the application, so that no new
    * open-file requests can keep us alive while we're shutting
diff --git a/src/libide/search/ide-search-engine.c b/src/libide/search/ide-search-engine.c
index bd420eaec..d0c8c9f61 100644
--- a/src/libide/search/ide-search-engine.c
+++ b/src/libide/search/ide-search-engine.c
@@ -89,17 +89,13 @@ on_extension_added_cb (IdeExtensionSetAdapter *set,
                        PeasExtension          *exten,
                        gpointer                user_data)
 {
-  IdeSearchEngine *self = (IdeSearchEngine *)user_data;
   IdeSearchProvider *provider = (IdeSearchProvider *)exten;
-  IdeContext *context = ide_object_get_context (IDE_OBJECT (self));
 
   g_assert (IDE_IS_MAIN_THREAD ());
   g_assert (plugin_info != NULL);
   g_assert (IDE_IS_SEARCH_PROVIDER (provider));
-  g_assert (context != NULL);
-  g_assert (IDE_IS_CONTEXT (context));
 
-  ide_search_provider_load (provider, context);
+  ide_search_provider_load (provider);
 }
 
 static void
@@ -108,7 +104,13 @@ on_extension_removed_cb (IdeExtensionSetAdapter *set,
                          PeasExtension          *exten,
                          gpointer                user_data)
 {
-// FIXME ??
+  IdeSearchProvider *provider = (IdeSearchProvider *)exten;
+
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (plugin_info != NULL);
+  g_assert (IDE_IS_SEARCH_PROVIDER (provider));
+
+  ide_search_provider_unload (provider);
 }
 
 static void
@@ -121,12 +123,9 @@ ide_search_engine_parent_set (IdeObject *object,
   g_assert (!parent || IDE_IS_OBJECT (parent));
 
   if (parent == NULL)
-    {
-      g_clear_object (&self->extensions);
-      return;
-    }
+    return;
 
-  self->extensions = ide_extension_set_adapter_new (parent,
+  self->extensions = ide_extension_set_adapter_new (object,
                                                     peas_engine_get_default (),
                                                     IDE_TYPE_SEARCH_PROVIDER,
                                                     NULL, NULL);
@@ -147,14 +146,14 @@ ide_search_engine_parent_set (IdeObject *object,
 }
 
 static void
-ide_search_engine_destroy (IdeObject *object)
+ide_search_engine_dispose (GObject *object)
 {
   IdeSearchEngine *self = (IdeSearchEngine *)object;
 
   g_clear_object (&self->extensions);
   g_clear_pointer (&self->custom_provider, g_ptr_array_unref);
 
-  IDE_OBJECT_CLASS (ide_search_engine_parent_class)->destroy (object);
+  G_OBJECT_CLASS (ide_search_engine_parent_class)->dispose (object);
 }
 
 static void
@@ -179,13 +178,13 @@ ide_search_engine_get_property (GObject    *object,
 static void
 ide_search_engine_class_init (IdeSearchEngineClass *klass)
 {
-  GObjectClass *g_object_class = G_OBJECT_CLASS (klass);
-  IdeObjectClass *object_class = IDE_OBJECT_CLASS (klass);
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  IdeObjectClass *i_object_class = IDE_OBJECT_CLASS (klass);
 
-  g_object_class->get_property = ide_search_engine_get_property;
+  object_class->dispose = ide_search_engine_dispose;
+  object_class->get_property = ide_search_engine_get_property;
 
-  object_class->destroy = ide_search_engine_destroy;
-  object_class->parent_set = ide_search_engine_parent_set;
+  i_object_class->parent_set = ide_search_engine_parent_set;
 
   properties [PROP_BUSY] =
     g_param_spec_boolean ("busy",
@@ -194,7 +193,7 @@ ide_search_engine_class_init (IdeSearchEngineClass *klass)
                           FALSE,
                           (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
 
-  g_object_class_install_properties (g_object_class, N_PROPS, properties);
+  g_object_class_install_properties (object_class, N_PROPS, properties);
 }
 
 static void
diff --git a/src/libide/search/ide-search-provider.c b/src/libide/search/ide-search-provider.c
index a24317bf5..8e359540e 100644
--- a/src/libide/search/ide-search-provider.c
+++ b/src/libide/search/ide-search-provider.c
@@ -28,12 +28,6 @@
 
 G_DEFINE_INTERFACE (IdeSearchProvider, ide_search_provider, IDE_TYPE_OBJECT)
 
-static void
-ide_search_provider_real_load (IdeSearchProvider *self,
-                               IdeContext        *context)
-{
-}
-
 static void
 ide_search_provider_real_search_async (IdeSearchProvider   *self,
                                        const gchar         *query,
@@ -68,19 +62,28 @@ ide_search_provider_real_search_finish (IdeSearchProvider  *self,
 static void
 ide_search_provider_default_init (IdeSearchProviderInterface *iface)
 {
-  iface->load = ide_search_provider_real_load;
   iface->search_async = ide_search_provider_real_search_async;
   iface->search_finish = ide_search_provider_real_search_finish;
 }
 
 void
-ide_search_provider_load (IdeSearchProvider   *self,
-                          IdeContext          *context)
+ide_search_provider_load (IdeSearchProvider *self)
+{
+  g_return_if_fail (IDE_IS_MAIN_THREAD ());
+  g_return_if_fail (IDE_IS_SEARCH_PROVIDER (self));
+
+  if (IDE_SEARCH_PROVIDER_GET_IFACE (self)->load)
+    IDE_SEARCH_PROVIDER_GET_IFACE (self)->load (self);
+}
+
+void
+ide_search_provider_unload (IdeSearchProvider *self)
 {
+  g_return_if_fail (IDE_IS_MAIN_THREAD ());
   g_return_if_fail (IDE_IS_SEARCH_PROVIDER (self));
-  g_return_if_fail (IDE_IS_CONTEXT (context));
 
-  IDE_SEARCH_PROVIDER_GET_IFACE (self)->load (self, context);
+  if (IDE_SEARCH_PROVIDER_GET_IFACE (self)->unload)
+    IDE_SEARCH_PROVIDER_GET_IFACE (self)->unload (self);
 }
 
 void
diff --git a/src/libide/search/ide-search-provider.h b/src/libide/search/ide-search-provider.h
index 9288700e7..68b18e8bc 100644
--- a/src/libide/search/ide-search-provider.h
+++ b/src/libide/search/ide-search-provider.h
@@ -37,8 +37,8 @@ struct _IdeSearchProviderInterface
 {
   GTypeInterface parent_interface;
 
-  void       (*load)          (IdeSearchProvider    *self,
-                               IdeContext           *context);
+  void       (*load)          (IdeSearchProvider    *self);
+  void       (*unload)        (IdeSearchProvider    *self);
   void       (*search_async)  (IdeSearchProvider    *self,
                                const gchar          *query,
                                guint                 max_results,
@@ -51,8 +51,9 @@ struct _IdeSearchProviderInterface
 };
 
 IDE_AVAILABLE_IN_ALL
-void       ide_search_provider_load          (IdeSearchProvider *self,
-                                              IdeContext        *context);
+void       ide_search_provider_load          (IdeSearchProvider *self);
+IDE_AVAILABLE_IN_ALL
+void       ide_search_provider_unload        (IdeSearchProvider *self);
 IDE_AVAILABLE_IN_ALL
 void       ide_search_provider_search_async  (IdeSearchProvider    *self,
                                               const gchar          *query,
diff --git a/src/plugins/file-search/gbp-file-search-provider.c 
b/src/plugins/file-search/gbp-file-search-provider.c
index b26248622..bb48a3203 100644
--- a/src/plugins/file-search/gbp-file-search-provider.c
+++ b/src/plugins/file-search/gbp-file-search-provider.c
@@ -41,22 +41,23 @@ struct _GbpFileSearchProvider
 static void search_provider_iface_init (IdeSearchProviderInterface *iface);
 
 G_DEFINE_FINAL_TYPE_WITH_CODE (GbpFileSearchProvider,
-                         gbp_file_search_provider,
-                         IDE_TYPE_OBJECT,
-                         G_IMPLEMENT_INTERFACE (IDE_TYPE_SEARCH_PROVIDER, search_provider_iface_init))
+                               gbp_file_search_provider,
+                               IDE_TYPE_OBJECT,
+                               G_IMPLEMENT_INTERFACE (IDE_TYPE_SEARCH_PROVIDER, search_provider_iface_init))
 
 static void
 gbp_file_search_provider_search_async (IdeSearchProvider   *provider,
-                                      const gchar         *search_terms,
-                                      guint                max_results,
-                                      GCancellable        *cancellable,
-                                      GAsyncReadyCallback  callback,
-                                      gpointer             user_data)
+                                       const char          *search_terms,
+                                       guint                max_results,
+                                       GCancellable        *cancellable,
+                                       GAsyncReadyCallback  callback,
+                                       gpointer             user_data)
 {
   GbpFileSearchProvider *self = (GbpFileSearchProvider *)provider;
   g_autoptr(IdeTask) task = NULL;
   g_autoptr(GPtrArray) results = NULL;
 
+  g_assert (IDE_IS_MAIN_THREAD ());
   g_assert (GBP_IS_FILE_SEARCH_PROVIDER (self));
   g_assert (search_terms != NULL);
   g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
@@ -75,11 +76,12 @@ gbp_file_search_provider_search_async (IdeSearchProvider   *provider,
 
 static GPtrArray *
 gbp_file_search_provider_search_finish (IdeSearchProvider  *provider,
-                                       GAsyncResult       *result,
-                                       GError            **error)
+                                        GAsyncResult       *result,
+                                        GError            **error)
 {
   GPtrArray *ret;
 
+  g_assert (IDE_IS_MAIN_THREAD ());
   g_assert (GBP_IS_FILE_SEARCH_PROVIDER (provider));
   g_assert (IDE_IS_TASK (result));
 
@@ -90,8 +92,8 @@ gbp_file_search_provider_search_finish (IdeSearchProvider  *provider,
 
 static void
 on_buffer_loaded (GbpFileSearchProvider *self,
-                  IdeBuffer            *buffer,
-                  IdeBufferManager     *bufmgr)
+                  IdeBuffer             *buffer,
+                  IdeBufferManager      *bufmgr)
 {
   g_autofree gchar *relative_path = NULL;
   g_autoptr(IdeContext) context = NULL;
@@ -120,9 +122,9 @@ on_buffer_loaded (GbpFileSearchProvider *self,
 
 static void
 on_file_renamed (GbpFileSearchProvider *self,
-                 GFile                *src_file,
-                 GFile                *dst_file,
-                 IdeProject           *project)
+                 GFile                 *src_file,
+                 GFile                 *dst_file,
+                 IdeProject            *project)
 {
   g_autofree gchar *old_path = NULL;
   g_autofree gchar *new_path = NULL;
@@ -147,8 +149,8 @@ on_file_renamed (GbpFileSearchProvider *self,
 
 static void
 on_file_trashed (GbpFileSearchProvider *self,
-                 GFile                *file,
-                 IdeProject           *project)
+                 GFile                 *file,
+                 IdeProject            *project)
 {
   g_autofree gchar *path = NULL;
   g_autoptr(GFile) workdir = NULL;
@@ -170,8 +172,8 @@ on_file_trashed (GbpFileSearchProvider *self,
 
 static void
 gbp_file_search_provider_build_cb (GObject      *object,
-                                  GAsyncResult *result,
-                                  gpointer      user_data)
+                                   GAsyncResult *result,
+                                   gpointer      user_data)
 {
   GbpFileSearchIndex *index = (GbpFileSearchIndex *)object;
   g_autoptr(GbpFileSearchProvider) self = user_data;
diff --git a/src/plugins/rust-analyzer/rust-analyzer-search-provider.c 
b/src/plugins/rust-analyzer/rust-analyzer-search-provider.c
index c3c9d516a..6e849cdcd 100644
--- a/src/plugins/rust-analyzer/rust-analyzer-search-provider.c
+++ b/src/plugins/rust-analyzer/rust-analyzer-search-provider.c
@@ -33,9 +33,9 @@ struct _RustAnalyzerSearchProvider
 static void provider_iface_init (IdeSearchProviderInterface *iface);
 
 G_DEFINE_FINAL_TYPE_WITH_CODE (RustAnalyzerSearchProvider,
-                         rust_analyzer_search_provider,
-                         IDE_TYPE_LSP_SEARCH_PROVIDER,
-                         G_IMPLEMENT_INTERFACE (IDE_TYPE_SEARCH_PROVIDER, provider_iface_init))
+                               rust_analyzer_search_provider,
+                               IDE_TYPE_LSP_SEARCH_PROVIDER,
+                               G_IMPLEMENT_INTERFACE (IDE_TYPE_SEARCH_PROVIDER, provider_iface_init))
 
 static void
 rust_analyzer_search_provider_class_init (RustAnalyzerSearchProviderClass *klass)
@@ -48,17 +48,17 @@ rust_analyzer_search_provider_init (RustAnalyzerSearchProvider *self)
 }
 
 static void
-rust_analyzer_search_provider_load (IdeSearchProvider *self,
-                                    IdeContext        *context)
+rust_analyzer_search_provider_load (IdeSearchProvider *self)
 {
   RustAnalyzerService *service;
+  IdeContext *context;
 
   IDE_ENTRY;
 
+  g_assert (IDE_IS_MAIN_THREAD ());
   g_assert (RUST_IS_ANALYZER_SEARCH_PROVIDER (self));
-  g_assert (context != NULL);
-  g_assert (IDE_IS_CONTEXT (context));
 
+  context = ide_object_get_context (IDE_OBJECT (self));
   service = rust_analyzer_service_from_context (context);
   g_object_bind_property (service, "client", self, "client", G_BINDING_SYNC_CREATE);
 
diff --git a/src/plugins/shellcmd/gbp-shellcmd-search-provider.c 
b/src/plugins/shellcmd/gbp-shellcmd-search-provider.c
index 53880cf98..f72aeb8bd 100644
--- a/src/plugins/shellcmd/gbp-shellcmd-search-provider.c
+++ b/src/plugins/shellcmd/gbp-shellcmd-search-provider.c
@@ -26,11 +26,14 @@
 #include <libide-search.h>
 #include <libide-threading.h>
 
+#include "gbp-shellcmd-command-model.h"
 #include "gbp-shellcmd-search-provider.h"
+#include "gbp-shellcmd-run-command.h"
 
 struct _GbpShellcmdSearchProvider
 {
-  IdeObject parent_instance;
+  IdeObject   parent_instance;
+  GListModel *commands;
 };
 
 static void
@@ -44,6 +47,8 @@ gbp_shellcmd_search_provider_search_async (IdeSearchProvider   *provider,
   GbpShellcmdSearchProvider *self = (GbpShellcmdSearchProvider *)provider;
   g_autoptr(IdeTask) task = NULL;
 
+  IDE_ENTRY;
+
   g_assert (IDE_IS_MAIN_THREAD ());
   g_assert (GBP_IS_SHELLCMD_SEARCH_PROVIDER (self));
   g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
@@ -52,6 +57,8 @@ gbp_shellcmd_search_provider_search_async (IdeSearchProvider   *provider,
   ide_task_set_source_tag (task, gbp_shellcmd_search_provider_search_async);
 
   ide_task_return_unsupported_error (task);
+
+  IDE_EXIT;
 }
 
 static GPtrArray *
@@ -59,12 +66,72 @@ gbp_shellcmd_search_provider_search_finish (IdeSearchProvider  *provider,
                                             GAsyncResult       *result,
                                             GError            **error)
 {
-  return ide_task_propagate_pointer (IDE_TASK (result), error);
+  GPtrArray *ret;
+
+  IDE_ENTRY;
+
+  g_assert (GBP_IS_SHELLCMD_SEARCH_PROVIDER (provider));
+  g_assert (IDE_IS_TASK (result));
+
+  ret = ide_task_propagate_pointer (IDE_TASK (result), error);
+
+  IDE_RETURN (ret);
+}
+
+static void
+gbp_shellcmd_search_provider_load (IdeSearchProvider *provider)
+{
+  GbpShellcmdSearchProvider *self = (GbpShellcmdSearchProvider *)provider;
+  g_autoptr(GbpShellcmdCommandModel) app_commands = NULL;
+  g_autoptr(GListStore) store = NULL;
+  IdeContext *context;
+
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (GBP_IS_SHELLCMD_SEARCH_PROVIDER (self));
+
+  context = ide_object_get_context (IDE_OBJECT (self));
+  store = g_list_store_new (G_TYPE_LIST_MODEL);
+
+  app_commands = gbp_shellcmd_command_model_new_for_app ();
+  g_list_store_append (store, app_commands);
+
+  if (ide_context_has_project (context))
+    {
+      g_autoptr(GbpShellcmdCommandModel) project_commands = NULL;
+
+      project_commands = gbp_shellcmd_command_model_new_for_project (context);
+      g_list_store_append (store, project_commands);
+    }
+
+  self->commands = g_object_new (GTK_TYPE_FLATTEN_LIST_MODEL,
+                                 "model", store,
+                                 NULL);
+
+  IDE_EXIT;
+}
+
+static void
+gbp_shellcmd_search_provider_unload (IdeSearchProvider *provider)
+{
+  GbpShellcmdSearchProvider *self = (GbpShellcmdSearchProvider *)provider;
+
+  IDE_ENTRY;
+
+  g_assert (IDE_IS_MAIN_THREAD ());
+  g_assert (GBP_IS_SHELLCMD_SEARCH_PROVIDER (self));
+
+  g_clear_object (&self->commands);
+
+  IDE_EXIT;
 }
 
 static void
 search_provider_iface_init (IdeSearchProviderInterface *iface)
 {
+  iface->load = gbp_shellcmd_search_provider_load;
+  iface->unload = gbp_shellcmd_search_provider_unload;
   iface->search_async = gbp_shellcmd_search_provider_search_async;
   iface->search_finish = gbp_shellcmd_search_provider_search_finish;
 }
diff --git a/src/plugins/vls/gbp-vls-search-provider.c b/src/plugins/vls/gbp-vls-search-provider.c
index cd2fbe4b8..8e7ac9a7e 100644
--- a/src/plugins/vls/gbp-vls-search-provider.c
+++ b/src/plugins/vls/gbp-vls-search-provider.c
@@ -34,16 +34,18 @@ struct _GbpVlsSearchProvider
 };
 
 static void
-gbp_vls_search_provider_load (IdeSearchProvider *provider,
-                              IdeContext        *context)
+gbp_vls_search_provider_load (IdeSearchProvider *provider)
 {
   g_autoptr(IdeLspServiceClass) klass = NULL;
   IdeBuildSystem *build_system;
+  IdeContext *context;
 
   IDE_ENTRY;
 
+  g_assert (IDE_IS_MAIN_THREAD ());
   g_assert (GBP_IS_VLS_SEARCH_PROVIDER (provider));
-  g_assert (IDE_IS_CONTEXT (context));
+
+  context = ide_object_get_context (IDE_OBJECT (provider));
 
   if (!ide_context_has_project (context))
     IDE_EXIT;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]