[gnome-builder] IdeDebugManager: check the programming language to see if the debugger is compatible



commit 81410f2088f4a32182ba0379e81675a101d407ec
Author: Giovanni Campagna <gcampagn cs stanford edu>
Date:   Sun Nov 26 16:42:10 2017 -0800

    IdeDebugManager: check the programming language to see if the debugger is compatible
    
    Make it possible to retrieve the IdeBuildTarget from the IdeRunner,
    and use it to retrieve the programming language of the program
    being run. Compare it to the list of languages claimed by the
    debugger to see if the debugger is compatible.
    
    Tested with npm on host (correctly claims no debugger is available)
    and meson on flatpak (correctly starts gdb)
    
    https://bugzilla.gnome.org/show_bug.cgi?id=790846

 src/libide/debugger/ide-debug-manager.c   |   32 +++++++++++++
 src/libide/runner/ide-runner.c            |   70 +++++++++++++++++++++++++++++
 src/libide/runner/ide-runner.h            |    6 +++
 src/libide/runtimes/ide-runtime.c         |    2 +
 src/plugins/flatpak/gbp-flatpak-runtime.c |    7 +++-
 src/plugins/gdb/gdb.plugin                |    2 +-
 6 files changed, 117 insertions(+), 2 deletions(-)
---
diff --git a/src/libide/debugger/ide-debug-manager.c b/src/libide/debugger/ide-debug-manager.c
index 72d394e..98f8feb 100644
--- a/src/libide/debugger/ide-debug-manager.c
+++ b/src/libide/debugger/ide-debug-manager.c
@@ -27,6 +27,7 @@
 
 #include "buffers/ide-buffer.h"
 #include "buffers/ide-buffer-manager.h"
+#include "buildsystem/ide-build-target.h"
 #include "debugger/ide-debug-manager.h"
 #include "debugger/ide-debugger.h"
 #include "debugger/ide-debugger-private.h"
@@ -699,6 +700,27 @@ ide_debug_manager_init (IdeDebugManager *self)
                                     self);
 }
 
+static gboolean
+debugger_supports_language (PeasPluginInfo *plugin_info,
+                            const gchar    *language)
+{
+  const gchar *supported;
+
+  supported = peas_plugin_info_get_external_data (plugin_info, "Debugger-Languages");
+
+  if (supported != NULL)
+    {
+      g_auto(GStrv) languages = g_strsplit (supported, ",", 0);
+      for (guint i = 0; languages[i]; i++)
+        {
+          if (g_strcmp0 (languages[i], language) == 0)
+            return TRUE;
+        }
+    }
+
+  return FALSE;
+}
+
 static void
 debugger_lookup (PeasExtensionSet *set,
                  PeasPluginInfo   *plugin_info,
@@ -716,6 +738,16 @@ debugger_lookup (PeasExtensionSet *set,
 
   if (ide_debugger_supports_runner (debugger, lookup->runner, &priority))
     {
+      IdeBuildTarget *build_target = ide_runner_get_build_target (lookup->runner);
+
+      if (build_target != NULL)
+        {
+          g_autofree gchar *language = ide_build_target_get_language (build_target);
+
+          if (!debugger_supports_language (plugin_info, language))
+            return;
+        }
+
       if (lookup->debugger == NULL || priority < lookup->priority)
         {
           g_set_object (&lookup->debugger, debugger);
diff --git a/src/libide/runner/ide-runner.c b/src/libide/runner/ide-runner.c
index 64ef525..55c3f79 100644
--- a/src/libide/runner/ide-runner.c
+++ b/src/libide/runner/ide-runner.c
@@ -40,6 +40,7 @@ typedef struct
 {
   PeasExtensionSet *addins;
   IdeEnvironment *env;
+  IdeBuildTarget *build_target;
 
   GArray *fd_mapping;
 
@@ -78,6 +79,7 @@ enum {
   PROP_ENV,
   PROP_FAILED,
   PROP_RUN_ON_HOST,
+  PROP_BUILD_TARGET,
   N_PROPS
 };
 
@@ -489,6 +491,7 @@ ide_runner_finalize (GObject *object)
   g_queue_clear (&priv->argv);
   g_clear_object (&priv->env);
   g_clear_object (&priv->subprocess);
+  g_clear_object (&priv->build_target);
 
   if (priv->fd_mapping != NULL)
     {
@@ -549,6 +552,10 @@ ide_runner_get_property (GObject    *object,
       g_value_set_boolean (value, ide_runner_get_run_on_host (self));
       break;
 
+    case PROP_BUILD_TARGET:
+      g_value_set_object (value, ide_runner_get_build_target (self));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -584,6 +591,10 @@ ide_runner_set_property (GObject      *object,
       ide_runner_set_run_on_host (self, g_value_get_boolean (value));
       break;
 
+    case PROP_BUILD_TARGET:
+      ide_runner_set_build_target (self, g_value_get_object (value));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -664,6 +675,25 @@ ide_runner_class_init (IdeRunnerClass *klass)
                           FALSE,
                           (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
+  /**
+   * IdeRunner:build-target:
+   *
+   * The %IdeBuildTarget from which this %IdeRunner was constructed.
+   *
+   * This is useful to retrieve various properties related to the program
+   * that will be launched, such as what programming language it uses,
+   * or whether it's a graphical application, a command line tool or a test
+   * program.
+   *
+   * Since: 3.28
+   */
+  properties [PROP_BUILD_TARGET] =
+    g_param_spec_object ("build-target",
+                         "Build Target",
+                         "Build Target",
+                         IDE_TYPE_BUILD_TARGET,
+                         (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
   g_object_class_install_properties (object_class, N_PROPS, properties);
 
   signals [EXITED] =
@@ -1388,3 +1418,43 @@ ide_runner_push_args (IdeRunner           *self,
   for (guint i = 0; args[i] != NULL; i++)
     ide_runner_append_argv (self, args[i]);
 }
+
+/**
+ * ide_runner_get_build_target:
+ * @self: a #IdeRunner
+ *
+ * Returns: (nullable) (transfer none): The %IdeBuildTarget associated with this %IdeRunner, or %NULL.
+ *   See #IdeRunner:build-target for details.
+ *
+ * Since: 3.28
+ */
+IdeBuildTarget *
+ide_runner_get_build_target (IdeRunner *self)
+{
+  IdeRunnerPrivate *priv = ide_runner_get_instance_private (self);
+
+  g_return_val_if_fail (IDE_IS_RUNNER (self), NULL);
+
+  return priv->build_target;
+}
+
+/**
+ * ide_runner_set_build_target:
+ * @self: a #IdeRunner
+ * @build_target: (nullable): The build target, or %NULL
+ *
+ * Sets the build target associated with this runner.
+ *
+ * Since: 3.28
+ */
+void
+ide_runner_set_build_target (IdeRunner      *self,
+                             IdeBuildTarget *build_target)
+{
+  IdeRunnerPrivate *priv = ide_runner_get_instance_private (self);
+
+  g_return_if_fail (IDE_IS_RUNNER (self));
+
+  if (g_set_object (&priv->build_target, build_target))
+    g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_BUILD_TARGET]);
+}
diff --git a/src/libide/runner/ide-runner.h b/src/libide/runner/ide-runner.h
index 2b02c37..9e33a0c 100644
--- a/src/libide/runner/ide-runner.h
+++ b/src/libide/runner/ide-runner.h
@@ -135,4 +135,10 @@ void               ide_runner_set_tty         (IdeRunner            *self,
 IDE_AVAILABLE_IN_ALL
 gint               ide_runner_steal_tty       (IdeRunner            *self);
 
+IDE_AVAILABLE_IN_3_28
+IdeBuildTarget    *ide_runner_get_build_target(IdeRunner            *self);
+IDE_AVAILABLE_IN_3_28
+void               ide_runner_set_build_target(IdeRunner            *self,
+                                               IdeBuildTarget       *build_target);
+
 G_END_DECLS
diff --git a/src/libide/runtimes/ide-runtime.c b/src/libide/runtimes/ide-runtime.c
index ce182b7..7109276 100644
--- a/src/libide/runtimes/ide-runtime.c
+++ b/src/libide/runtimes/ide-runtime.c
@@ -187,6 +187,8 @@ ide_runtime_real_create_runner (IdeRuntime     *self,
 
   if (build_target != NULL)
     {
+      ide_runner_set_build_target (runner, build_target);
+
       installdir = ide_build_target_get_install_directory (build_target);
       argv = ide_build_target_get_argv (build_target);
       cwd = ide_build_target_get_cwd (build_target);
diff --git a/src/plugins/flatpak/gbp-flatpak-runtime.c b/src/plugins/flatpak/gbp-flatpak-runtime.c
index 97536c2..33f5d87 100644
--- a/src/plugins/flatpak/gbp-flatpak-runtime.c
+++ b/src/plugins/flatpak/gbp-flatpak-runtime.c
@@ -275,6 +275,7 @@ gbp_flatpak_runtime_create_runner (IdeRuntime     *runtime,
   g_autofree gchar *build_path = NULL;
   g_autofree gchar *binary_name = NULL;
   IdeContext *context;
+  IdeRunner *runner;
 
   g_assert (GBP_IS_FLATPAK_RUNTIME (self));
   g_assert (!build_target || IDE_IS_BUILD_TARGET (build_target));
@@ -285,7 +286,11 @@ gbp_flatpak_runtime_create_runner (IdeRuntime     *runtime,
   if (build_target != NULL)
     binary_name = get_binary_name (self, build_target);
 
-  return IDE_RUNNER (gbp_flatpak_runner_new (context, build_path, binary_name));
+  runner = IDE_RUNNER (gbp_flatpak_runner_new (context, build_path, binary_name));
+  if (build_target != NULL)
+    ide_runner_set_build_target (runner, build_target);
+
+  return runner;
 }
 
 static void
diff --git a/src/plugins/gdb/gdb.plugin b/src/plugins/gdb/gdb.plugin
index 7912ab2..2406f9a 100644
--- a/src/plugins/gdb/gdb.plugin
+++ b/src/plugins/gdb/gdb.plugin
@@ -7,4 +7,4 @@ Copyright=Copyright © 2017 Christian Hergert
 Depends=debugger;editor;terminal;
 Builtin=true
 Embedded=gbp_gdb_register_types
-X-Debugger-Languages=c,chdr,cpp,cpphdr,fortran,rust,vala
+X-Debugger-Languages=c,chdr,cpp,cpphdr,fortran,rust,vala,asm


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