[gnome-builder] diagnostics: fix some incorrect assumptions in manager



commit 7d694aeadcc9c78b6fa4da0cd382bfe641675399
Author: Christian Hergert <chergert redhat com>
Date:   Mon Jul 24 15:01:22 2017 -0700

    diagnostics: fix some incorrect assumptions in manager
    
    This avoids recreating some objects in the group after they've been set
    as well as stomping over a previously initialized weak ref.

 libide/diagnostics/ide-diagnostics-manager.c |   77 +++++++++++++++-----------
 1 files changed, 44 insertions(+), 33 deletions(-)
---
diff --git a/libide/diagnostics/ide-diagnostics-manager.c b/libide/diagnostics/ide-diagnostics-manager.c
index 5ae10d5..338d2e2 100644
--- a/libide/diagnostics/ide-diagnostics-manager.c
+++ b/libide/diagnostics/ide-diagnostics-manager.c
@@ -950,8 +950,6 @@ ide_diagnostics_manager_buffer_loaded (IdeDiagnosticsManager *self,
                                        IdeBufferManager      *buffer_manager)
 {
   IdeDiagnosticsGroup *group;
-  GtkSourceLanguage *language;
-  const gchar *language_id = NULL;
   IdeContext *context;
   IdeFile *ifile;
   GFile *gfile;
@@ -1001,39 +999,47 @@ ide_diagnostics_manager_buffer_loaded (IdeDiagnosticsManager *self,
       g_hash_table_insert (self->groups_by_file, group->file, group);
     }
 
-  g_weak_ref_init (&group->buffer_wr, buffer);
-
-  language = gtk_source_buffer_get_language (GTK_SOURCE_BUFFER (buffer));
-
-  if (language != NULL)
-    language_id = gtk_source_language_get_id (language);
-
-  group->diagnostics_by_provider = g_hash_table_new_full (NULL,
-                                                          NULL,
-                                                          NULL,
-                                                          free_diagnostics);
+  g_weak_ref_set (&group->buffer_wr, buffer);
 
-  group->adapter = ide_extension_set_adapter_new (context,
-                                                  peas_engine_get_default (),
-                                                  IDE_TYPE_DIAGNOSTIC_PROVIDER,
-                                                  "Diagnostic-Provider-Languages",
-                                                  language_id);
-
-  g_signal_connect_object (group->adapter,
-                           "extension-added",
-                           G_CALLBACK (ide_diagnostics_manager_extension_added),
-                           self,
-                           0);
+  if (group->diagnostics_by_provider == NULL)
+    {
+      group->diagnostics_by_provider =
+        g_hash_table_new_full (NULL, NULL, NULL, free_diagnostics);
+    }
 
-  g_signal_connect_object (group->adapter,
-                           "extension-removed",
-                           G_CALLBACK (ide_diagnostics_manager_extension_removed),
-                           self,
-                           0);
+  if (group->adapter == NULL)
+    {
+      GtkSourceLanguage *language;
+      const gchar *language_id = NULL;
+
+      language = gtk_source_buffer_get_language (GTK_SOURCE_BUFFER (buffer));
+      if (language != NULL)
+        language_id = gtk_source_language_get_id (language);
+
+      group->adapter = ide_extension_set_adapter_new (context,
+                                                      peas_engine_get_default (),
+                                                      IDE_TYPE_DIAGNOSTIC_PROVIDER,
+                                                      "Diagnostic-Provider-Languages",
+                                                      language_id);
+
+      g_signal_connect_object (group->adapter,
+                               "extension-added",
+                               G_CALLBACK (ide_diagnostics_manager_extension_added),
+                               self,
+                               0);
+
+      g_signal_connect_object (group->adapter,
+                               "extension-removed",
+                               G_CALLBACK (ide_diagnostics_manager_extension_removed),
+                               self,
+                               0);
+
+      ide_extension_set_adapter_foreach (group->adapter,
+                                         ide_diagnostics_manager_extension_added,
+                                         self);
+    }
 
-  ide_extension_set_adapter_foreach (group->adapter,
-                                     ide_diagnostics_manager_extension_added,
-                                     self);
+  g_assert (g_hash_table_lookup (self->groups_by_file, gfile) == group);
 
   ide_diagnostics_group_queue_diagnose (group, self);
 
@@ -1125,11 +1131,16 @@ ide_diagnostics_manager_initable_init (GInitable     *initable,
   context = ide_object_get_context (IDE_OBJECT (self));
   buffer_manager = ide_context_get_buffer_manager (context);
 
+  /* We can start processing things when the buffer is loaded,
+   * but we do so after buffer-loaded because we don't really
+   * care to be before other subscribers. Our plugins might be
+   * dependent on other things that are buffer specific.
+   */
   g_signal_connect_object (buffer_manager,
                            "buffer-loaded",
                            G_CALLBACK (ide_diagnostics_manager_buffer_loaded),
                            self,
-                           G_CONNECT_SWAPPED);
+                           G_CONNECT_SWAPPED | G_CONNECT_AFTER);
 
   g_signal_connect_object (buffer_manager,
                            "buffer-unloaded",


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