[gnome-builder] libide/search: add unload vfunc and remove context parameter
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] libide/search: add unload vfunc and remove context parameter
- Date: Fri, 15 Jul 2022 22:05:44 +0000 (UTC)
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]