[gnome-builder] foundry: rediagnose after pipeline loads



commit 08ba8c560ab78092c33c3dfed197a98daab2cb6b
Author: Christian Hergert <chergert redhat com>
Date:   Fri Jan 14 15:16:25 2022 -0800

    foundry: rediagnose after pipeline loads
    
    When restoring a document as we reload a project, we have a situation where
    the build-flags will not yet be available. They won't be available until
    the build has advanced or the pipeline finishes loading.
    
    Previously, we would diagnose with an empty set of build flags, so things
    like `#include "config.h"` would break. We still have that initially, but
    now as soon as the pipeline finishes loading (or reloading after build
    preference changes), those will go away without user interaction.

 src/libide/foundry/ide-build-manager.c | 65 +++++++++++++++++++---------------
 1 file changed, 36 insertions(+), 29 deletions(-)
---
diff --git a/src/libide/foundry/ide-build-manager.c b/src/libide/foundry/ide-build-manager.c
index c0aa9590d..2d35e722d 100644
--- a/src/libide/foundry/ide-build-manager.c
+++ b/src/libide/foundry/ide-build-manager.c
@@ -146,6 +146,29 @@ enum {
 static GParamSpec *properties [N_PROPS];
 static guint signals [N_SIGNALS];
 
+static void
+ide_build_manager_rediagnose (IdeBuildManager *self)
+{
+  IdeDiagnosticsManager *diagnostics;
+  IdeBufferManager *buffer_manager;
+  IdeContext *context;
+  guint n_items;
+
+  g_assert (IDE_IS_BUILD_MANAGER (self));
+
+  context = ide_object_get_context (IDE_OBJECT (self));
+  buffer_manager = ide_buffer_manager_from_context (context);
+  diagnostics = ide_diagnostics_manager_from_context (context);
+  n_items = g_list_model_get_n_items (G_LIST_MODEL (buffer_manager));
+
+  for (guint i = 0; i < n_items; i++)
+    {
+      g_autoptr(IdeBuffer) buffer = g_list_model_get_item (G_LIST_MODEL (buffer_manager), i);
+
+      ide_diagnostics_manager_rediagnose (diagnostics, buffer);
+    }
+}
+
 static gboolean
 timer_callback (gpointer data)
 {
@@ -400,9 +423,19 @@ ide_build_manager_ensure_toolchain_cb (GObject      *object,
 
   ide_build_manager_set_can_build (self, TRUE);
 
+  if (ide_pipeline_is_ready (pipeline))
+    ide_build_manager_rediagnose (self);
+  else
+    g_signal_connect_object (pipeline,
+                             "loaded",
+                             G_CALLBACK (ide_build_manager_rediagnose),
+                             self,
+                             G_CONNECT_SWAPPED);
+
   g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_PIPELINE]);
 
   ide_task_return_boolean (task, TRUE);
+
   IDE_EXIT;
 
 failure:
@@ -765,42 +798,16 @@ static void
 ide_build_manager_real_build_finished (IdeBuildManager *self,
                                        IdePipeline     *pipeline)
 {
-  IdeDiagnosticsManager *diagnostics;
-  IdeBufferManager *bufmgr;
-  IdeContext *context;
-  guint n_items;
-
   g_assert (IDE_IS_BUILD_MANAGER (self));
   g_assert (IDE_IS_PIPELINE (pipeline));
 
   ide_build_manager_stop_timer (self);
 
-  /*
-   * If this was not a full build (such as advancing to just the configure
-   * phase or so), then there is nothing more to do.
-   */
-  if (!self->needs_rediagnose)
-    return;
-
-  /*
-   * We had a successful build, so lets notify the build manager to reload
-   * dianostics on loaded buffers so the user doesn't have to make a change
-   * to force the update.
-   */
-
-  context = ide_object_get_context (IDE_OBJECT (self));
-  diagnostics = ide_diagnostics_manager_from_context (context);
-  bufmgr = ide_buffer_manager_from_context (context);
-  n_items = g_list_model_get_n_items (G_LIST_MODEL (bufmgr));
-
-  for (guint i = 0; i < n_items; i++)
+  if (self->needs_rediagnose)
     {
-      g_autoptr(IdeBuffer) buffer = g_list_model_get_item (G_LIST_MODEL (bufmgr), i);
-
-      ide_diagnostics_manager_rediagnose (diagnostics, buffer);
+      self->needs_rediagnose = FALSE;
+      ide_build_manager_rediagnose (self);
     }
-
-  self->needs_rediagnose = FALSE;
 }
 
 static void


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