[gnome-builder/wip/slaf/colored-build-output: 13/36] xml-pack: IdeXmlService wait for the buffer to be loaded
- From: Sébastien Lafargue <slafargue src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/slaf/colored-build-output: 13/36] xml-pack: IdeXmlService wait for the buffer to be loaded
- Date: Sat, 11 Feb 2017 21:36:51 +0000 (UTC)
commit 150554e732fdb450fb90c2c367c67ad7d944f42b
Author: Sebastien Lafargue <slafargue gnome org>
Date: Wed Jan 18 18:07:16 2017 +0100
xml-pack: IdeXmlService wait for the buffer to be loaded
As the buffer is loaded async, and we need it fully loaded
for the resolver/service to work, we check and wait if
necessary. Once loaded, we get back to the normal process
of getting the xml symbol tree.
libide/langserv/ide-langserv-symbol-resolver.c | 1 +
libide/symbols/ide-symbol-resolver.c | 7 ++-
libide/symbols/ide-symbol-resolver.h | 2 +
plugins/clang/ide-clang-symbol-resolver.c | 1 +
plugins/ctags/ide-ctags-symbol-resolver.c | 1 +
plugins/symbol-tree/symbol-tree-panel.c | 1 +
plugins/xml-pack/ide-xml-service.c | 90 +++++++++++++++++++++--
plugins/xml-pack/ide-xml-service.h | 1 +
plugins/xml-pack/ide-xml-symbol-resolver.c | 5 +-
9 files changed, 97 insertions(+), 12 deletions(-)
---
diff --git a/libide/langserv/ide-langserv-symbol-resolver.c b/libide/langserv/ide-langserv-symbol-resolver.c
index 4adc82b..a4ebc85 100644
--- a/libide/langserv/ide-langserv-symbol-resolver.c
+++ b/libide/langserv/ide-langserv-symbol-resolver.c
@@ -442,6 +442,7 @@ ide_langserv_symbol_resolver_document_symbol_cb (GObject *object,
static void
ide_langserv_symbol_resolver_get_symbol_tree_async (IdeSymbolResolver *resolver,
GFile *file,
+ IdeBuffer *buffer,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
diff --git a/libide/symbols/ide-symbol-resolver.c b/libide/symbols/ide-symbol-resolver.c
index 986dd32..0da4a20 100644
--- a/libide/symbols/ide-symbol-resolver.c
+++ b/libide/symbols/ide-symbol-resolver.c
@@ -19,6 +19,7 @@
#define G_LOG_DOMAIN "ide-symbol-resolver"
#include "ide-context.h"
+#include "buffers/ide-buffer.h"
#include "files/ide-file.h"
#include "symbols/ide-symbol-resolver.h"
@@ -28,6 +29,7 @@ G_DEFINE_INTERFACE (IdeSymbolResolver, ide_symbol_resolver, IDE_TYPE_OBJECT)
static void
ide_symbol_resolver_real_get_symbol_tree_async (IdeSymbolResolver *self,
GFile *file,
+ IdeBuffer *buffer,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
@@ -36,6 +38,7 @@ ide_symbol_resolver_real_get_symbol_tree_async (IdeSymbolResolver *self,
g_assert (IDE_IS_SYMBOL_RESOLVER (self));
g_assert (G_IS_FILE (file));
+ g_assert (buffer == NULL || IDE_IS_BUFFER (buffer));
g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
task = g_task_new (self, cancellable, callback, user_data);
@@ -123,6 +126,7 @@ ide_symbol_resolver_lookup_symbol_finish (IdeSymbolResolver *self,
* ide_symbol_resolver_get_symbol_tree_async:
* @self: An #IdeSymbolResolver
* @file: A #GFile
+ * @buffer: A #IdeBuffer or %NULL
* @cancellable: (allow-none): a #GCancellable or %NULL.
* @callback: (allow-none): a callback to execute upon completion
* @user_data: user data for @callback
@@ -132,6 +136,7 @@ ide_symbol_resolver_lookup_symbol_finish (IdeSymbolResolver *self,
void
ide_symbol_resolver_get_symbol_tree_async (IdeSymbolResolver *self,
GFile *file,
+ IdeBuffer *buffer,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
@@ -139,7 +144,7 @@ ide_symbol_resolver_get_symbol_tree_async (IdeSymbolResolver *self,
g_return_if_fail (IDE_IS_SYMBOL_RESOLVER (self));
g_return_if_fail (G_IS_FILE (file));
- IDE_SYMBOL_RESOLVER_GET_IFACE (self)->get_symbol_tree_async (self, file, cancellable, callback, user_data);
+ IDE_SYMBOL_RESOLVER_GET_IFACE (self)->get_symbol_tree_async (self, file, buffer, cancellable, callback,
user_data);
}
/**
diff --git a/libide/symbols/ide-symbol-resolver.h b/libide/symbols/ide-symbol-resolver.h
index edac98b..f7bd84f 100644
--- a/libide/symbols/ide-symbol-resolver.h
+++ b/libide/symbols/ide-symbol-resolver.h
@@ -44,6 +44,7 @@ struct _IdeSymbolResolverInterface
GError **error);
void (*get_symbol_tree_async) (IdeSymbolResolver *self,
GFile *file,
+ IdeBuffer *buffer,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
@@ -64,6 +65,7 @@ IdeSymbol *ide_symbol_resolver_lookup_symbol_finish (IdeSymbolResolver
GError **error);
void ide_symbol_resolver_get_symbol_tree_async (IdeSymbolResolver *self,
GFile *file,
+ IdeBuffer *buffer,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
diff --git a/plugins/clang/ide-clang-symbol-resolver.c b/plugins/clang/ide-clang-symbol-resolver.c
index dbff264..153574f 100644
--- a/plugins/clang/ide-clang-symbol-resolver.c
+++ b/plugins/clang/ide-clang-symbol-resolver.c
@@ -177,6 +177,7 @@ ide_clang_symbol_resolver_get_symbol_tree_cb (GObject *object,
static void
ide_clang_symbol_resolver_get_symbol_tree_async (IdeSymbolResolver *resolver,
GFile *file,
+ IdeBuffer *buffer,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
diff --git a/plugins/ctags/ide-ctags-symbol-resolver.c b/plugins/ctags/ide-ctags-symbol-resolver.c
index d7e5c82..bf1fd33 100644
--- a/plugins/ctags/ide-ctags-symbol-resolver.c
+++ b/plugins/ctags/ide-ctags-symbol-resolver.c
@@ -615,6 +615,7 @@ ide_ctags_symbol_resolver_get_symbol_tree_worker (GTask *task,
static void
ide_ctags_symbol_resolver_get_symbol_tree_async (IdeSymbolResolver *resolver,
GFile *file,
+ IdeBuffer *buffer,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
diff --git a/plugins/symbol-tree/symbol-tree-panel.c b/plugins/symbol-tree/symbol-tree-panel.c
index b64500b..60d8345 100644
--- a/plugins/symbol-tree/symbol-tree-panel.c
+++ b/plugins/symbol-tree/symbol-tree-panel.c
@@ -262,6 +262,7 @@ populate_cache_cb (EggTaskCache *cache,
{
ide_symbol_resolver_get_symbol_tree_async (resolver,
ide_file_get_file (file),
+ document,
g_task_get_cancellable (task),
get_symbol_tree_cb,
g_object_ref (task));
diff --git a/plugins/xml-pack/ide-xml-service.c b/plugins/xml-pack/ide-xml-service.c
index cefce65..af7e015 100644
--- a/plugins/xml-pack/ide-xml-service.c
+++ b/plugins/xml-pack/ide-xml-service.c
@@ -26,6 +26,8 @@
#include "ide-xml-service.h"
#include "xml-reader.h"
+gboolean _ide_buffer_get_loading (IdeBuffer *self);
+
#define DEFAULT_EVICTION_MSEC (60 * 1000)
typedef GPtrArray IdeXmlStack;
@@ -319,6 +321,42 @@ ide_xml_service_get_root_node_cb (GObject *object,
}
}
+typedef struct
+{
+ IdeXmlService *self;
+ GTask *task;
+ GCancellable *cancellable;
+ IdeFile *ifile;
+ IdeBuffer *buffer;
+} TaskState;
+
+static void
+ide_xml_service__buffer_loaded_cb (IdeBuffer *buffer,
+ TaskState *state)
+{
+ IdeXmlService *self = (IdeXmlService *)state->self;
+ g_autoptr(GTask) task = state->task;
+
+ g_assert (IDE_IS_XML_SERVICE (self));
+ g_assert (G_IS_TASK (state->task));
+ g_assert (state->cancellable == NULL || G_IS_CANCELLABLE (state->cancellable));
+ g_assert (IDE_IS_FILE (state->ifile));
+ g_assert (IDE_IS_BUFFER (state->buffer));
+
+ printf ("buffer loaded\n");
+
+ egg_task_cache_get_async (self->trees,
+ state->ifile,
+ TRUE,
+ state->cancellable,
+ ide_xml_service_get_root_node_cb,
+ g_steal_pointer (&task));
+
+ g_object_unref (state->buffer);
+ g_object_unref (state->ifile);
+ g_slice_free (TaskState, state);
+}
+
/**
* ide_xml_service_get_root_node_async:
*
@@ -330,10 +368,14 @@ ide_xml_service_get_root_node_cb (GObject *object,
*
* If the root node is out of date, then the source file(s) will be
* parsed asynchronously.
+ *
+ * The xml service is meant to be used with buffers, that is,
+ * by extension, loaded views.
*/
void
ide_xml_service_get_root_node_async (IdeXmlService *self,
IdeFile *file,
+ IdeBuffer *buffer,
gint64 min_serial,
GCancellable *cancellable,
GAsyncReadyCallback callback,
@@ -341,19 +383,22 @@ ide_xml_service_get_root_node_async (IdeXmlService *self,
{
IdeXmlSymbolNode *cached;
g_autoptr(GTask) task = NULL;
+ IdeContext *context;
+ IdeBufferManager *manager;
+ GFile *gfile;
g_return_if_fail (IDE_IS_XML_SERVICE (self));
g_return_if_fail (IDE_IS_FILE (file));
+ g_return_if_fail (IDE_IS_BUFFER (buffer));
g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
task = g_task_new (self, cancellable, callback, user_data);
+ context = ide_object_get_context (IDE_OBJECT (self));
if (min_serial == 0)
{
- IdeContext *context;
IdeUnsavedFiles *unsaved_files;
- context = ide_object_get_context (IDE_OBJECT (self));
unsaved_files = ide_context_get_unsaved_files (context);
min_serial = ide_unsaved_files_get_sequence (unsaved_files);
}
@@ -370,12 +415,41 @@ ide_xml_service_get_root_node_async (IdeXmlService *self,
}
printf ("egg_task_cache_get_async\n");
- egg_task_cache_get_async (self->trees,
- file,
- TRUE,
- cancellable,
- ide_xml_service_get_root_node_cb,
- g_object_ref (task));
+ manager = ide_context_get_buffer_manager (context);
+ gfile = ide_file_get_file (file);
+ if (!ide_buffer_manager_has_file (manager, gfile))
+ {
+ TaskState *state;
+
+ if (!_ide_buffer_get_loading (buffer))
+ {
+ g_task_return_new_error (task,
+ G_IO_ERROR,
+ G_IO_ERROR_NOT_SUPPORTED,
+ _("Buffer loaded but not in buffer manager."));
+ return;
+ }
+
+ /* Wait for the buffer to be fully loaded */
+ state = g_slice_new0 (TaskState);
+ state->self = self;
+ state->task = g_object_ref (task);
+ state->cancellable = cancellable;
+ state->ifile = g_object_ref (file);
+ state->buffer = g_object_ref (buffer);
+
+ g_signal_connect (buffer,
+ "loaded",
+ G_CALLBACK (ide_xml_service__buffer_loaded_cb),
+ state);
+ }
+ else
+ egg_task_cache_get_async (self->trees,
+ file,
+ TRUE,
+ cancellable,
+ ide_xml_service_get_root_node_cb,
+ g_object_ref (task));
}
/**
diff --git a/plugins/xml-pack/ide-xml-service.h b/plugins/xml-pack/ide-xml-service.h
index c49ed7e..d0bdd17 100644
--- a/plugins/xml-pack/ide-xml-service.h
+++ b/plugins/xml-pack/ide-xml-service.h
@@ -34,6 +34,7 @@ IdeXmlSymbolNode *ide_xml_service_get_cached_root_node (IdeXmlService
GFile *file);
void ide_xml_service_get_root_node_async (IdeXmlService *self,
IdeFile *file,
+ IdeBuffer *buffer,
gint64 min_serial,
GCancellable *cancellable,
GAsyncReadyCallback callback,
diff --git a/plugins/xml-pack/ide-xml-symbol-resolver.c b/plugins/xml-pack/ide-xml-symbol-resolver.c
index e14c272..ad375b1 100644
--- a/plugins/xml-pack/ide-xml-symbol-resolver.c
+++ b/plugins/xml-pack/ide-xml-symbol-resolver.c
@@ -78,7 +78,6 @@ ide_xml_symbol_resolver_get_symbol_tree_cb (GObject *object,
{
IdeXmlService *service = (IdeXmlService *)object;
g_autoptr(GTask) task = user_data;
- IdeContext *context;
IdeXmlSymbolNode *root_node;
IdeXmlSymbolTree *symbol_tree;
GError *error = NULL;
@@ -88,12 +87,10 @@ ide_xml_symbol_resolver_get_symbol_tree_cb (GObject *object,
g_assert (G_IS_TASK (task));
g_assert (IDE_IS_XML_SERVICE (service));
- context = ide_object_get_context (IDE_OBJECT (service));
root_node = ide_xml_service_get_root_node_finish (service, result, &error);
if (root_node != NULL)
{
symbol_tree = ide_xml_symbol_tree_new (root_node);
-
g_task_return_pointer (task, symbol_tree, g_object_unref);
}
else
@@ -105,6 +102,7 @@ ide_xml_symbol_resolver_get_symbol_tree_cb (GObject *object,
static void
ide_xml_symbol_resolver_get_symbol_tree_async (IdeSymbolResolver *resolver,
GFile *file,
+ IdeBuffer *buffer,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
@@ -136,6 +134,7 @@ ide_xml_symbol_resolver_get_symbol_tree_async (IdeSymbolResolver *resolver,
ide_xml_service_get_root_node_async (service,
ifile,
+ buffer,
0,
cancellable,
ide_xml_symbol_resolver_get_symbol_tree_cb,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]