[gnome-builder/wip/slaf/colored-build-output: 13/36] xml-pack: IdeXmlService wait for the buffer to be loaded



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]