[gnome-builder/wip/libide] libide: start on IdeGcaService



commit 2f3bfde2d8791717655e2d5052acce5656ad2c25
Author: Christian Hergert <christian hergert me>
Date:   Sat Feb 14 21:35:33 2015 -0800

    libide: start on IdeGcaService
    
    This service will help us manage connecting to GCA and providing proxy
    structures. Doing so will allow us to progress towards creating an
    IdeGcaDiagnosticsProvider. Once that is in place, we basically have
    everything we have today in src/gca, but with the ability to bring some
    parts in process (like clang).

 libide/Makefile.am           |    9 +
 libide/gca/gca-diagnostics.c | 1039 +++++++++++++++++++++++++++++++++
 libide/gca/gca-diagnostics.h |  170 ++++++
 libide/gca/gca-service.c     | 1291 ++++++++++++++++++++++++++++++++++++++++++
 libide/gca/gca-service.h     |  209 +++++++
 libide/gca/gca-structs.c     |  106 ++++
 libide/gca/gca-structs.h     |   67 +++
 libide/gca/ide-gca-service.c |  155 +++++
 libide/gca/ide-gca-service.h |   43 ++
 libide/ide.c                 |    5 +
 10 files changed, 3094 insertions(+), 0 deletions(-)
---
diff --git a/libide/Makefile.am b/libide/Makefile.am
index 5c942ad..9394df5 100644
--- a/libide/Makefile.am
+++ b/libide/Makefile.am
@@ -138,6 +138,14 @@ libide_la_SOURCES = \
        $(libide_la_public_sources) \
        libide/editorconfig/editorconfig-glib.c \
        libide/editorconfig/editorconfig-glib.h \
+       libide/gca/ide-gca-service.c \
+       libide/gca/ide-gca-service.h \
+       libide/gca/gca-diagnostics.c \
+       libide/gca/gca-diagnostics.h \
+       libide/gca/gca-service.c \
+       libide/gca/gca-service.h \
+       libide/gca/gca-structs.c \
+       libide/gca/gca-structs.h \
        libide/gconstructor.h \
        libide/ide-async-helper.c \
        libide/ide-async-helper.h \
@@ -152,6 +160,7 @@ libide_la_CFLAGS = \
        -I$(top_srcdir)/libide/c \
        -I$(top_srcdir)/libide/clang \
        -I$(top_srcdir)/libide/directory \
+       -I$(top_srcdir)/libide/gca \
        -I$(top_srcdir)/libide/editorconfig \
        -I$(top_srcdir)/libide/editorconfig/libeditorconfig \
        -I$(top_srcdir)/libide/git \
diff --git a/libide/gca/gca-diagnostics.c b/libide/gca/gca-diagnostics.c
new file mode 100644
index 0000000..e1219ef
--- /dev/null
+++ b/libide/gca/gca-diagnostics.c
@@ -0,0 +1,1039 @@
+/*
+ * Generated by gdbus-codegen 2.42.0. DO NOT EDIT.
+ *
+ * The license of this code is the same as for the source it was derived from.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "gca-diagnostics.h"
+
+#include <string.h>
+#ifdef G_OS_UNIX
+#  include <gio/gunixfdlist.h>
+#endif
+
+typedef struct
+{
+  GDBusArgInfo parent_struct;
+  gboolean use_gvariant;
+} _ExtendedGDBusArgInfo;
+
+typedef struct
+{
+  GDBusMethodInfo parent_struct;
+  const gchar *signal_name;
+  gboolean pass_fdlist;
+} _ExtendedGDBusMethodInfo;
+
+typedef struct
+{
+  GDBusSignalInfo parent_struct;
+  const gchar *signal_name;
+} _ExtendedGDBusSignalInfo;
+
+typedef struct
+{
+  GDBusPropertyInfo parent_struct;
+  const gchar *hyphen_name;
+  gboolean use_gvariant;
+} _ExtendedGDBusPropertyInfo;
+
+typedef struct
+{
+  GDBusInterfaceInfo parent_struct;
+  const gchar *hyphen_name;
+} _ExtendedGDBusInterfaceInfo;
+
+typedef struct
+{
+  const _ExtendedGDBusPropertyInfo *info;
+  guint prop_id;
+  GValue orig_value; /* the value before the change */
+} ChangedProperty;
+
+static void
+_changed_property_free (ChangedProperty *data)
+{
+  g_value_unset (&data->orig_value);
+  g_free (data);
+}
+
+static gboolean
+_g_strv_equal0 (gchar **a, gchar **b)
+{
+  gboolean ret = FALSE;
+  guint n;
+  if (a == NULL && b == NULL)
+    {
+      ret = TRUE;
+      goto out;
+    }
+  if (a == NULL || b == NULL)
+    goto out;
+  if (g_strv_length (a) != g_strv_length (b))
+    goto out;
+  for (n = 0; a[n] != NULL; n++)
+    if (g_strcmp0 (a[n], b[n]) != 0)
+      goto out;
+  ret = TRUE;
+out:
+  return ret;
+}
+
+static gboolean
+_g_variant_equal0 (GVariant *a, GVariant *b)
+{
+  gboolean ret = FALSE;
+  if (a == NULL && b == NULL)
+    {
+      ret = TRUE;
+      goto out;
+    }
+  if (a == NULL || b == NULL)
+    goto out;
+  ret = g_variant_equal (a, b);
+out:
+  return ret;
+}
+
+G_GNUC_UNUSED static gboolean
+_g_value_equal (const GValue *a, const GValue *b)
+{
+  gboolean ret = FALSE;
+  g_assert (G_VALUE_TYPE (a) == G_VALUE_TYPE (b));
+  switch (G_VALUE_TYPE (a))
+    {
+      case G_TYPE_BOOLEAN:
+        ret = (g_value_get_boolean (a) == g_value_get_boolean (b));
+        break;
+      case G_TYPE_UCHAR:
+        ret = (g_value_get_uchar (a) == g_value_get_uchar (b));
+        break;
+      case G_TYPE_INT:
+        ret = (g_value_get_int (a) == g_value_get_int (b));
+        break;
+      case G_TYPE_UINT:
+        ret = (g_value_get_uint (a) == g_value_get_uint (b));
+        break;
+      case G_TYPE_INT64:
+        ret = (g_value_get_int64 (a) == g_value_get_int64 (b));
+        break;
+      case G_TYPE_UINT64:
+        ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b));
+        break;
+      case G_TYPE_DOUBLE:
+        {
+          /* Avoid -Wfloat-equal warnings by doing a direct bit compare */
+          gdouble da = g_value_get_double (a);
+          gdouble db = g_value_get_double (b);
+          ret = memcmp (&da, &db, sizeof (gdouble)) == 0;
+        }
+        break;
+      case G_TYPE_STRING:
+        ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0);
+        break;
+      case G_TYPE_VARIANT:
+        ret = _g_variant_equal0 (g_value_get_variant (a), g_value_get_variant (b));
+        break;
+      default:
+        if (G_VALUE_TYPE (a) == G_TYPE_STRV)
+          ret = _g_strv_equal0 (g_value_get_boxed (a), g_value_get_boxed (b));
+        else
+          g_critical ("_g_value_equal() does not handle type %s", g_type_name (G_VALUE_TYPE (a)));
+        break;
+    }
+  return ret;
+}
+
+/* ------------------------------------------------------------------------
+ * Code for interface org.gnome.CodeAssist.v1.Diagnostics
+ * ------------------------------------------------------------------------
+ */
+
+/**
+ * SECTION:GcaDiagnostics
+ * @title: GcaDiagnostics
+ * @short_description: Generated C code for the org.gnome.CodeAssist.v1.Diagnostics D-Bus interface
+ *
+ * This section contains code for working with the <link 
linkend="gdbus-interface-org-gnome-CodeAssist-v1-Diagnostics.top_of_page">org.gnome.CodeAssist.v1.Diagnostics</link>
 D-Bus interface in C.
+ */
+
+/* ---- Introspection data for org.gnome.CodeAssist.v1.Diagnostics ---- */
+
+static const _ExtendedGDBusArgInfo _gca_diagnostics_method_info_diagnostics_OUT_ARG_unnamed_arg0 =
+{
+  {
+    -1,
+    (gchar *) "unnamed_arg0",
+    (gchar *) "a(ua((x(xx)(xx))s)a(x(xx)(xx))s)",
+    NULL
+  },
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const _gca_diagnostics_method_info_diagnostics_OUT_ARG_pointers[] =
+{
+  &_gca_diagnostics_method_info_diagnostics_OUT_ARG_unnamed_arg0,
+  NULL
+};
+
+static const _ExtendedGDBusMethodInfo _gca_diagnostics_method_info_diagnostics =
+{
+  {
+    -1,
+    (gchar *) "Diagnostics",
+    NULL,
+    (GDBusArgInfo **) &_gca_diagnostics_method_info_diagnostics_OUT_ARG_pointers,
+    NULL
+  },
+  "handle-diagnostics",
+  FALSE
+};
+
+static const _ExtendedGDBusMethodInfo * const _gca_diagnostics_method_info_pointers[] =
+{
+  &_gca_diagnostics_method_info_diagnostics,
+  NULL
+};
+
+static const _ExtendedGDBusInterfaceInfo _gca_diagnostics_interface_info =
+{
+  {
+    -1,
+    (gchar *) "org.gnome.CodeAssist.v1.Diagnostics",
+    (GDBusMethodInfo **) &_gca_diagnostics_method_info_pointers,
+    NULL,
+    NULL,
+    NULL
+  },
+  "diagnostics",
+};
+
+
+/**
+ * gca_diagnostics_interface_info:
+ *
+ * Gets a machine-readable description of the <link 
linkend="gdbus-interface-org-gnome-CodeAssist-v1-Diagnostics.top_of_page">org.gnome.CodeAssist.v1.Diagnostics</link>
 D-Bus interface.
+ *
+ * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free.
+ */
+GDBusInterfaceInfo *
+gca_diagnostics_interface_info (void)
+{
+  return (GDBusInterfaceInfo *) &_gca_diagnostics_interface_info.parent_struct;
+}
+
+/**
+ * gca_diagnostics_override_properties:
+ * @klass: The class structure for a #GObject<!-- -->-derived class.
+ * @property_id_begin: The property id to assign to the first overridden property.
+ *
+ * Overrides all #GObject properties in the #GcaDiagnostics interface for a concrete class.
+ * The properties are overridden in the order they are defined.
+ *
+ * Returns: The last property id.
+ */
+guint
+gca_diagnostics_override_properties (GObjectClass *klass, guint property_id_begin)
+{
+  return property_id_begin - 1;
+}
+
+
+
+/**
+ * GcaDiagnostics:
+ *
+ * Abstract interface type for the D-Bus interface <link 
linkend="gdbus-interface-org-gnome-CodeAssist-v1-Diagnostics.top_of_page">org.gnome.CodeAssist.v1.Diagnostics</link>.
+ */
+
+/**
+ * GcaDiagnosticsIface:
+ * @parent_iface: The parent interface.
+ * @handle_diagnostics: Handler for the #GcaDiagnostics::handle-diagnostics signal.
+ *
+ * Virtual table for the D-Bus interface <link 
linkend="gdbus-interface-org-gnome-CodeAssist-v1-Diagnostics.top_of_page">org.gnome.CodeAssist.v1.Diagnostics</link>.
+ */
+
+typedef GcaDiagnosticsIface GcaDiagnosticsInterface;
+G_DEFINE_INTERFACE (GcaDiagnostics, gca_diagnostics, G_TYPE_OBJECT);
+
+static void
+gca_diagnostics_default_init (GcaDiagnosticsIface *iface)
+{
+  /* GObject signals for incoming D-Bus method calls: */
+  /**
+   * GcaDiagnostics::handle-diagnostics:
+   * @object: A #GcaDiagnostics.
+   * @invocation: A #GDBusMethodInvocation.
+   *
+   * Signal emitted when a remote caller is invoking the <link 
linkend="gdbus-method-org-gnome-CodeAssist-v1-Diagnostics.Diagnostics">Diagnostics()</link> D-Bus method.
+   *
+   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a 
reference to @invocation and eventually call gca_diagnostics_complete_diagnostics() or e.g. 
g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler 
handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+   *
+   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+   */
+  g_signal_new ("handle-diagnostics",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (GcaDiagnosticsIface, handle_diagnostics),
+    g_signal_accumulator_true_handled,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_BOOLEAN,
+    1,
+    G_TYPE_DBUS_METHOD_INVOCATION);
+
+}
+
+/**
+ * gca_diagnostics_call_diagnostics:
+ * @proxy: A #GcaDiagnosticsProxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link 
linkend="gdbus-method-org-gnome-CodeAssist-v1-Diagnostics.Diagnostics">Diagnostics()</link> D-Bus method on 
@proxy.
+ * When the operation is finished, @callback will be invoked in the <link 
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling 
this method from.
+ * You can then call gca_diagnostics_call_diagnostics_finish() to get the result of the operation.
+ *
+ * See gca_diagnostics_call_diagnostics_sync() for the synchronous, blocking version of this method.
+ */
+void
+gca_diagnostics_call_diagnostics (
+    GcaDiagnostics *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+    "Diagnostics",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    callback,
+    user_data);
+}
+
+/**
+ * gca_diagnostics_call_diagnostics_finish:
+ * @proxy: A #GcaDiagnosticsProxy.
+ * @out_unnamed_arg0: (out): Return location for return parameter or %NULL to ignore.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to 
gca_diagnostics_call_diagnostics().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with gca_diagnostics_call_diagnostics().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+gca_diagnostics_call_diagnostics_finish (
+    GcaDiagnostics *proxy,
+    GVariant **out_unnamed_arg0,
+    GAsyncResult *res,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "(@a(ua((x(xx)(xx))s)a(x(xx)(xx))s))",
+                 out_unnamed_arg0);
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * gca_diagnostics_call_diagnostics_sync:
+ * @proxy: A #GcaDiagnosticsProxy.
+ * @out_unnamed_arg0: (out): Return location for return parameter or %NULL to ignore.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link 
linkend="gdbus-method-org-gnome-CodeAssist-v1-Diagnostics.Diagnostics">Diagnostics()</link> D-Bus method on 
@proxy. The calling thread is blocked until a reply is received.
+ *
+ * See gca_diagnostics_call_diagnostics() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+gca_diagnostics_call_diagnostics_sync (
+    GcaDiagnostics *proxy,
+    GVariant **out_unnamed_arg0,
+    GCancellable *cancellable,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+    "Diagnostics",
+    g_variant_new ("()"),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "(@a(ua((x(xx)(xx))s)a(x(xx)(xx))s))",
+                 out_unnamed_arg0);
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * gca_diagnostics_complete_diagnostics:
+ * @object: A #GcaDiagnostics.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ * @unnamed_arg0: Parameter to return.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link 
linkend="gdbus-method-org-gnome-CodeAssist-v1-Diagnostics.Diagnostics">Diagnostics()</link> D-Bus method. If 
you instead want to finish handling an invocation by returning an error, use 
g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+gca_diagnostics_complete_diagnostics (
+    GcaDiagnostics *object,
+    GDBusMethodInvocation *invocation,
+    GVariant *unnamed_arg0)
+{
+  g_dbus_method_invocation_return_value (invocation,
+    g_variant_new ("(@a(ua((x(xx)(xx))s)a(x(xx)(xx))s))",
+                   unnamed_arg0));
+}
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * GcaDiagnosticsProxy:
+ *
+ * The #GcaDiagnosticsProxy structure contains only private data and should only be accessed using the 
provided API.
+ */
+
+/**
+ * GcaDiagnosticsProxyClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #GcaDiagnosticsProxy.
+ */
+
+struct _GcaDiagnosticsProxyPrivate
+{
+  GData *qdata;
+};
+
+static void gca_diagnostics_proxy_iface_init (GcaDiagnosticsIface *iface);
+
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (GcaDiagnosticsProxy, gca_diagnostics_proxy, G_TYPE_DBUS_PROXY,
+                         G_ADD_PRIVATE (GcaDiagnosticsProxy)
+                         G_IMPLEMENT_INTERFACE (GCA_TYPE_DIAGNOSTICS, gca_diagnostics_proxy_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (GcaDiagnosticsProxy, gca_diagnostics_proxy, G_TYPE_DBUS_PROXY,
+                         G_IMPLEMENT_INTERFACE (GCA_TYPE_DIAGNOSTICS, gca_diagnostics_proxy_iface_init));
+
+#endif
+static void
+gca_diagnostics_proxy_finalize (GObject *object)
+{
+  GcaDiagnosticsProxy *proxy = GCA_DIAGNOSTICS_PROXY (object);
+  g_datalist_clear (&proxy->priv->qdata);
+  G_OBJECT_CLASS (gca_diagnostics_proxy_parent_class)->finalize (object);
+}
+
+static void
+gca_diagnostics_proxy_get_property (GObject      *object,
+  guint         prop_id,
+  GValue       *value,
+  GParamSpec   *pspec G_GNUC_UNUSED)
+{
+}
+
+static void
+gca_diagnostics_proxy_set_property (GObject      *object,
+  guint         prop_id,
+  const GValue *value,
+  GParamSpec   *pspec G_GNUC_UNUSED)
+{
+}
+
+static void
+gca_diagnostics_proxy_g_signal (GDBusProxy *proxy,
+  const gchar *sender_name G_GNUC_UNUSED,
+  const gchar *signal_name,
+  GVariant *parameters)
+{
+  _ExtendedGDBusSignalInfo *info;
+  GVariantIter iter;
+  GVariant *child;
+  GValue *paramv;
+  guint num_params;
+  guint n;
+  guint signal_id;
+  info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) 
&_gca_diagnostics_interface_info.parent_struct, signal_name);
+  if (info == NULL)
+    return;
+  num_params = g_variant_n_children (parameters);
+  paramv = g_new0 (GValue, num_params + 1);
+  g_value_init (&paramv[0], GCA_TYPE_DIAGNOSTICS);
+  g_value_set_object (&paramv[0], proxy);
+  g_variant_iter_init (&iter, parameters);
+  n = 1;
+  while ((child = g_variant_iter_next_value (&iter)) != NULL)
+    {
+      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1];
+      if (arg_info->use_gvariant)
+        {
+          g_value_init (&paramv[n], G_TYPE_VARIANT);
+          g_value_set_variant (&paramv[n], child);
+          n++;
+        }
+      else
+        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
+      g_variant_unref (child);
+    }
+  signal_id = g_signal_lookup (info->signal_name, GCA_TYPE_DIAGNOSTICS);
+  g_signal_emitv (paramv, signal_id, 0, NULL);
+  for (n = 0; n < num_params + 1; n++)
+    g_value_unset (&paramv[n]);
+  g_free (paramv);
+}
+
+static void
+gca_diagnostics_proxy_g_properties_changed (GDBusProxy *_proxy,
+  GVariant *changed_properties,
+  const gchar *const *invalidated_properties)
+{
+  GcaDiagnosticsProxy *proxy = GCA_DIAGNOSTICS_PROXY (_proxy);
+  guint n;
+  const gchar *key;
+  GVariantIter *iter;
+  _ExtendedGDBusPropertyInfo *info;
+  g_variant_get (changed_properties, "a{sv}", &iter);
+  while (g_variant_iter_next (iter, "{&sv}", &key, NULL))
+    {
+      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) 
&_gca_diagnostics_interface_info.parent_struct, key);
+      g_datalist_remove_data (&proxy->priv->qdata, key);
+      if (info != NULL)
+        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+    }
+  g_variant_iter_free (iter);
+  for (n = 0; invalidated_properties[n] != NULL; n++)
+    {
+      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) 
&_gca_diagnostics_interface_info.parent_struct, invalidated_properties[n]);
+      g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]);
+      if (info != NULL)
+        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+    }
+}
+
+static void
+gca_diagnostics_proxy_init (GcaDiagnosticsProxy *proxy)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+  proxy->priv = gca_diagnostics_proxy_get_instance_private (proxy);
+#else
+  proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, GCA_TYPE_DIAGNOSTICS_PROXY, GcaDiagnosticsProxyPrivate);
+#endif
+
+  g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), gca_diagnostics_interface_info ());
+}
+
+static void
+gca_diagnostics_proxy_class_init (GcaDiagnosticsProxyClass *klass)
+{
+  GObjectClass *gobject_class;
+  GDBusProxyClass *proxy_class;
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize     = gca_diagnostics_proxy_finalize;
+  gobject_class->get_property = gca_diagnostics_proxy_get_property;
+  gobject_class->set_property = gca_diagnostics_proxy_set_property;
+
+  proxy_class = G_DBUS_PROXY_CLASS (klass);
+  proxy_class->g_signal = gca_diagnostics_proxy_g_signal;
+  proxy_class->g_properties_changed = gca_diagnostics_proxy_g_properties_changed;
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+  g_type_class_add_private (klass, sizeof (GcaDiagnosticsProxyPrivate));
+#endif
+}
+
+static void
+gca_diagnostics_proxy_iface_init (GcaDiagnosticsIface *iface)
+{
+}
+
+/**
+ * gca_diagnostics_proxy_new:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus 
connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously creates a proxy for the D-Bus interface <link 
linkend="gdbus-interface-org-gnome-CodeAssist-v1-Diagnostics.top_of_page">org.gnome.CodeAssist.v1.Diagnostics</link>.
 See g_dbus_proxy_new() for more details.
+ *
+ * When the operation is finished, @callback will be invoked in the <link 
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling 
this method from.
+ * You can then call gca_diagnostics_proxy_new_finish() to get the result of the operation.
+ *
+ * See gca_diagnostics_proxy_new_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+gca_diagnostics_proxy_new (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data)
+{
+  g_async_initable_new_async (GCA_TYPE_DIAGNOSTICS_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, 
user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, 
"g-interface-name", "org.gnome.CodeAssist.v1.Diagnostics", NULL);
+}
+
+/**
+ * gca_diagnostics_proxy_new_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gca_diagnostics_proxy_new().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with gca_diagnostics_proxy_new().
+ *
+ * Returns: (transfer full) (type GcaDiagnosticsProxy): The constructed proxy object or %NULL if @error is 
set.
+ */
+GcaDiagnostics *
+gca_diagnostics_proxy_new_finish (
+    GAsyncResult        *res,
+    GError             **error)
+{
+  GObject *ret;
+  GObject *source_object;
+  source_object = g_async_result_get_source_object (res);
+  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+  g_object_unref (source_object);
+  if (ret != NULL)
+    return GCA_DIAGNOSTICS (ret);
+  else
+    return NULL;
+}
+
+/**
+ * gca_diagnostics_proxy_new_sync:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus 
connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Synchronously creates a proxy for the D-Bus interface <link 
linkend="gdbus-interface-org-gnome-CodeAssist-v1-Diagnostics.top_of_page">org.gnome.CodeAssist.v1.Diagnostics</link>.
 See g_dbus_proxy_new_sync() for more details.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See gca_diagnostics_proxy_new() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type GcaDiagnosticsProxy): The constructed proxy object or %NULL if @error is 
set.
+ */
+GcaDiagnostics *
+gca_diagnostics_proxy_new_sync (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error)
+{
+  GInitable *ret;
+  ret = g_initable_new (GCA_TYPE_DIAGNOSTICS_PROXY, cancellable, error, "g-flags", flags, "g-name", name, 
"g-connection", connection, "g-object-path", object_path, "g-interface-name", 
"org.gnome.CodeAssist.v1.Diagnostics", NULL);
+  if (ret != NULL)
+    return GCA_DIAGNOSTICS (ret);
+  else
+    return NULL;
+}
+
+
+/**
+ * gca_diagnostics_proxy_new_for_bus:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Like gca_diagnostics_proxy_new() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * When the operation is finished, @callback will be invoked in the <link 
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling 
this method from.
+ * You can then call gca_diagnostics_proxy_new_for_bus_finish() to get the result of the operation.
+ *
+ * See gca_diagnostics_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+gca_diagnostics_proxy_new_for_bus (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data)
+{
+  g_async_initable_new_async (GCA_TYPE_DIAGNOSTICS_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, 
user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, 
"g-interface-name", "org.gnome.CodeAssist.v1.Diagnostics", NULL);
+}
+
+/**
+ * gca_diagnostics_proxy_new_for_bus_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to 
gca_diagnostics_proxy_new_for_bus().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with gca_diagnostics_proxy_new_for_bus().
+ *
+ * Returns: (transfer full) (type GcaDiagnosticsProxy): The constructed proxy object or %NULL if @error is 
set.
+ */
+GcaDiagnostics *
+gca_diagnostics_proxy_new_for_bus_finish (
+    GAsyncResult        *res,
+    GError             **error)
+{
+  GObject *ret;
+  GObject *source_object;
+  source_object = g_async_result_get_source_object (res);
+  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+  g_object_unref (source_object);
+  if (ret != NULL)
+    return GCA_DIAGNOSTICS (ret);
+  else
+    return NULL;
+}
+
+/**
+ * gca_diagnostics_proxy_new_for_bus_sync:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Like gca_diagnostics_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See gca_diagnostics_proxy_new_for_bus() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type GcaDiagnosticsProxy): The constructed proxy object or %NULL if @error is 
set.
+ */
+GcaDiagnostics *
+gca_diagnostics_proxy_new_for_bus_sync (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error)
+{
+  GInitable *ret;
+  ret = g_initable_new (GCA_TYPE_DIAGNOSTICS_PROXY, cancellable, error, "g-flags", flags, "g-name", name, 
"g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", 
"org.gnome.CodeAssist.v1.Diagnostics", NULL);
+  if (ret != NULL)
+    return GCA_DIAGNOSTICS (ret);
+  else
+    return NULL;
+}
+
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * GcaDiagnosticsSkeleton:
+ *
+ * The #GcaDiagnosticsSkeleton structure contains only private data and should only be accessed using the 
provided API.
+ */
+
+/**
+ * GcaDiagnosticsSkeletonClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #GcaDiagnosticsSkeleton.
+ */
+
+struct _GcaDiagnosticsSkeletonPrivate
+{
+  GValue *properties;
+  GList *changed_properties;
+  GSource *changed_properties_idle_source;
+  GMainContext *context;
+  GMutex lock;
+};
+
+static void
+_gca_diagnostics_skeleton_handle_method_call (
+  GDBusConnection *connection G_GNUC_UNUSED,
+  const gchar *sender G_GNUC_UNUSED,
+  const gchar *object_path G_GNUC_UNUSED,
+  const gchar *interface_name,
+  const gchar *method_name,
+  GVariant *parameters,
+  GDBusMethodInvocation *invocation,
+  gpointer user_data)
+{
+  GcaDiagnosticsSkeleton *skeleton = GCA_DIAGNOSTICS_SKELETON (user_data);
+  _ExtendedGDBusMethodInfo *info;
+  GVariantIter iter;
+  GVariant *child;
+  GValue *paramv;
+  guint num_params;
+  guint num_extra;
+  guint n;
+  guint signal_id;
+  GValue return_value = G_VALUE_INIT;
+  info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation);
+  g_assert (info != NULL);
+  num_params = g_variant_n_children (parameters);
+  num_extra = info->pass_fdlist ? 3 : 2;  paramv = g_new0 (GValue, num_params + num_extra);
+  n = 0;
+  g_value_init (&paramv[n], GCA_TYPE_DIAGNOSTICS);
+  g_value_set_object (&paramv[n++], skeleton);
+  g_value_init (&paramv[n], G_TYPE_DBUS_METHOD_INVOCATION);
+  g_value_set_object (&paramv[n++], invocation);
+  if (info->pass_fdlist)
+    {
+#ifdef G_OS_UNIX
+      g_value_init (&paramv[n], G_TYPE_UNIX_FD_LIST);
+      g_value_set_object (&paramv[n++], g_dbus_message_get_unix_fd_list 
(g_dbus_method_invocation_get_message (invocation)));
+#else
+      g_assert_not_reached ();
+#endif
+    }
+  g_variant_iter_init (&iter, parameters);
+  while ((child = g_variant_iter_next_value (&iter)) != NULL)
+    {
+      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra];
+      if (arg_info->use_gvariant)
+        {
+          g_value_init (&paramv[n], G_TYPE_VARIANT);
+          g_value_set_variant (&paramv[n], child);
+          n++;
+        }
+      else
+        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
+      g_variant_unref (child);
+    }
+  signal_id = g_signal_lookup (info->signal_name, GCA_TYPE_DIAGNOSTICS);
+  g_value_init (&return_value, G_TYPE_BOOLEAN);
+  g_signal_emitv (paramv, signal_id, 0, &return_value);
+  if (!g_value_get_boolean (&return_value))
+    g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s 
is not implemented on interface %s", method_name, interface_name);
+  g_value_unset (&return_value);
+  for (n = 0; n < num_params + num_extra; n++)
+    g_value_unset (&paramv[n]);
+  g_free (paramv);
+}
+
+static GVariant *
+_gca_diagnostics_skeleton_handle_get_property (
+  GDBusConnection *connection G_GNUC_UNUSED,
+  const gchar *sender G_GNUC_UNUSED,
+  const gchar *object_path G_GNUC_UNUSED,
+  const gchar *interface_name G_GNUC_UNUSED,
+  const gchar *property_name,
+  GError **error,
+  gpointer user_data)
+{
+  GcaDiagnosticsSkeleton *skeleton = GCA_DIAGNOSTICS_SKELETON (user_data);
+  GValue value = G_VALUE_INIT;
+  GParamSpec *pspec;
+  _ExtendedGDBusPropertyInfo *info;
+  GVariant *ret;
+  ret = NULL;
+  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) 
&_gca_diagnostics_interface_info.parent_struct, property_name);
+  g_assert (info != NULL);
+  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+  if (pspec == NULL)
+    {
+      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", 
property_name);
+    }
+  else
+    {
+      g_value_init (&value, pspec->value_type);
+      g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+      ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature));
+      g_value_unset (&value);
+    }
+  return ret;
+}
+
+static gboolean
+_gca_diagnostics_skeleton_handle_set_property (
+  GDBusConnection *connection G_GNUC_UNUSED,
+  const gchar *sender G_GNUC_UNUSED,
+  const gchar *object_path G_GNUC_UNUSED,
+  const gchar *interface_name G_GNUC_UNUSED,
+  const gchar *property_name,
+  GVariant *variant,
+  GError **error,
+  gpointer user_data)
+{
+  GcaDiagnosticsSkeleton *skeleton = GCA_DIAGNOSTICS_SKELETON (user_data);
+  GValue value = G_VALUE_INIT;
+  GParamSpec *pspec;
+  _ExtendedGDBusPropertyInfo *info;
+  gboolean ret;
+  ret = FALSE;
+  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) 
&_gca_diagnostics_interface_info.parent_struct, property_name);
+  g_assert (info != NULL);
+  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+  if (pspec == NULL)
+    {
+      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", 
property_name);
+    }
+  else
+    {
+      if (info->use_gvariant)
+        g_value_set_variant (&value, variant);
+      else
+        g_dbus_gvariant_to_gvalue (variant, &value);
+      g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+      g_value_unset (&value);
+      ret = TRUE;
+    }
+  return ret;
+}
+
+static const GDBusInterfaceVTable _gca_diagnostics_skeleton_vtable =
+{
+  _gca_diagnostics_skeleton_handle_method_call,
+  _gca_diagnostics_skeleton_handle_get_property,
+  _gca_diagnostics_skeleton_handle_set_property,
+  {NULL}
+};
+
+static GDBusInterfaceInfo *
+gca_diagnostics_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
+{
+  return gca_diagnostics_interface_info ();
+}
+
+static GDBusInterfaceVTable *
+gca_diagnostics_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
+{
+  return (GDBusInterfaceVTable *) &_gca_diagnostics_skeleton_vtable;
+}
+
+static GVariant *
+gca_diagnostics_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton)
+{
+  GcaDiagnosticsSkeleton *skeleton = GCA_DIAGNOSTICS_SKELETON (_skeleton);
+
+  GVariantBuilder builder;
+  guint n;
+  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+  if (_gca_diagnostics_interface_info.parent_struct.properties == NULL)
+    goto out;
+  for (n = 0; _gca_diagnostics_interface_info.parent_struct.properties[n] != NULL; n++)
+    {
+      GDBusPropertyInfo *info = _gca_diagnostics_interface_info.parent_struct.properties[n];
+      if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)
+        {
+          GVariant *value;
+          value = _gca_diagnostics_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection 
(G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path 
(G_DBUS_INTERFACE_SKELETON (skeleton)), "org.gnome.CodeAssist.v1.Diagnostics", info->name, NULL, skeleton);
+          if (value != NULL)
+            {
+              g_variant_take_ref (value);
+              g_variant_builder_add (&builder, "{sv}", info->name, value);
+              g_variant_unref (value);
+            }
+        }
+    }
+out:
+  return g_variant_builder_end (&builder);
+}
+
+static void
+gca_diagnostics_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)
+{
+}
+
+static void gca_diagnostics_skeleton_iface_init (GcaDiagnosticsIface *iface);
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (GcaDiagnosticsSkeleton, gca_diagnostics_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
+                         G_ADD_PRIVATE (GcaDiagnosticsSkeleton)
+                         G_IMPLEMENT_INTERFACE (GCA_TYPE_DIAGNOSTICS, gca_diagnostics_skeleton_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (GcaDiagnosticsSkeleton, gca_diagnostics_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
+                         G_IMPLEMENT_INTERFACE (GCA_TYPE_DIAGNOSTICS, gca_diagnostics_skeleton_iface_init));
+
+#endif
+static void
+gca_diagnostics_skeleton_finalize (GObject *object)
+{
+  GcaDiagnosticsSkeleton *skeleton = GCA_DIAGNOSTICS_SKELETON (object);
+  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
+  if (skeleton->priv->changed_properties_idle_source != NULL)
+    g_source_destroy (skeleton->priv->changed_properties_idle_source);
+  g_main_context_unref (skeleton->priv->context);
+  g_mutex_clear (&skeleton->priv->lock);
+  G_OBJECT_CLASS (gca_diagnostics_skeleton_parent_class)->finalize (object);
+}
+
+static void
+gca_diagnostics_skeleton_init (GcaDiagnosticsSkeleton *skeleton)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+  skeleton->priv = gca_diagnostics_skeleton_get_instance_private (skeleton);
+#else
+  skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, GCA_TYPE_DIAGNOSTICS_SKELETON, 
GcaDiagnosticsSkeletonPrivate);
+#endif
+
+  g_mutex_init (&skeleton->priv->lock);
+  skeleton->priv->context = g_main_context_ref_thread_default ();
+}
+
+static void
+gca_diagnostics_skeleton_class_init (GcaDiagnosticsSkeletonClass *klass)
+{
+  GObjectClass *gobject_class;
+  GDBusInterfaceSkeletonClass *skeleton_class;
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize = gca_diagnostics_skeleton_finalize;
+
+  skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);
+  skeleton_class->get_info = gca_diagnostics_skeleton_dbus_interface_get_info;
+  skeleton_class->get_properties = gca_diagnostics_skeleton_dbus_interface_get_properties;
+  skeleton_class->flush = gca_diagnostics_skeleton_dbus_interface_flush;
+  skeleton_class->get_vtable = gca_diagnostics_skeleton_dbus_interface_get_vtable;
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+  g_type_class_add_private (klass, sizeof (GcaDiagnosticsSkeletonPrivate));
+#endif
+}
+
+static void
+gca_diagnostics_skeleton_iface_init (GcaDiagnosticsIface *iface)
+{
+}
+
+/**
+ * gca_diagnostics_skeleton_new:
+ *
+ * Creates a skeleton object for the D-Bus interface <link 
linkend="gdbus-interface-org-gnome-CodeAssist-v1-Diagnostics.top_of_page">org.gnome.CodeAssist.v1.Diagnostics</link>.
+ *
+ * Returns: (transfer full) (type GcaDiagnosticsSkeleton): The skeleton object.
+ */
+GcaDiagnostics *
+gca_diagnostics_skeleton_new (void)
+{
+  return GCA_DIAGNOSTICS (g_object_new (GCA_TYPE_DIAGNOSTICS_SKELETON, NULL));
+}
+
diff --git a/libide/gca/gca-diagnostics.h b/libide/gca/gca-diagnostics.h
new file mode 100644
index 0000000..23af79e
--- /dev/null
+++ b/libide/gca/gca-diagnostics.h
@@ -0,0 +1,170 @@
+/*
+ * Generated by gdbus-codegen 2.42.0. DO NOT EDIT.
+ *
+ * The license of this code is the same as for the source it was derived from.
+ */
+
+#ifndef __GCA_DIAGNOSTICS_H__
+#define __GCA_DIAGNOSTICS_H__
+
+#include <gio/gio.h>
+
+G_BEGIN_DECLS
+
+
+/* ------------------------------------------------------------------------ */
+/* Declarations for org.gnome.CodeAssist.v1.Diagnostics */
+
+#define GCA_TYPE_DIAGNOSTICS (gca_diagnostics_get_type ())
+#define GCA_DIAGNOSTICS(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GCA_TYPE_DIAGNOSTICS, GcaDiagnostics))
+#define GCA_IS_DIAGNOSTICS(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GCA_TYPE_DIAGNOSTICS))
+#define GCA_DIAGNOSTICS_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), GCA_TYPE_DIAGNOSTICS, 
GcaDiagnosticsIface))
+
+struct _GcaDiagnostics;
+typedef struct _GcaDiagnostics GcaDiagnostics;
+typedef struct _GcaDiagnosticsIface GcaDiagnosticsIface;
+
+struct _GcaDiagnosticsIface
+{
+  GTypeInterface parent_iface;
+
+  gboolean (*handle_diagnostics) (
+    GcaDiagnostics *object,
+    GDBusMethodInvocation *invocation);
+
+};
+
+GType gca_diagnostics_get_type (void);
+
+GDBusInterfaceInfo *gca_diagnostics_interface_info (void);
+guint gca_diagnostics_override_properties (GObjectClass *klass, guint property_id_begin);
+
+
+/* D-Bus method call completion functions: */
+void gca_diagnostics_complete_diagnostics (
+    GcaDiagnostics *object,
+    GDBusMethodInvocation *invocation,
+    GVariant *unnamed_arg0);
+
+
+
+/* D-Bus method calls: */
+void gca_diagnostics_call_diagnostics (
+    GcaDiagnostics *proxy,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean gca_diagnostics_call_diagnostics_finish (
+    GcaDiagnostics *proxy,
+    GVariant **out_unnamed_arg0,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean gca_diagnostics_call_diagnostics_sync (
+    GcaDiagnostics *proxy,
+    GVariant **out_unnamed_arg0,
+    GCancellable *cancellable,
+    GError **error);
+
+
+
+/* ---- */
+
+#define GCA_TYPE_DIAGNOSTICS_PROXY (gca_diagnostics_proxy_get_type ())
+#define GCA_DIAGNOSTICS_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GCA_TYPE_DIAGNOSTICS_PROXY, 
GcaDiagnosticsProxy))
+#define GCA_DIAGNOSTICS_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GCA_TYPE_DIAGNOSTICS_PROXY, 
GcaDiagnosticsProxyClass))
+#define GCA_DIAGNOSTICS_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GCA_TYPE_DIAGNOSTICS_PROXY, 
GcaDiagnosticsProxyClass))
+#define GCA_IS_DIAGNOSTICS_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GCA_TYPE_DIAGNOSTICS_PROXY))
+#define GCA_IS_DIAGNOSTICS_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GCA_TYPE_DIAGNOSTICS_PROXY))
+
+typedef struct _GcaDiagnosticsProxy GcaDiagnosticsProxy;
+typedef struct _GcaDiagnosticsProxyClass GcaDiagnosticsProxyClass;
+typedef struct _GcaDiagnosticsProxyPrivate GcaDiagnosticsProxyPrivate;
+
+struct _GcaDiagnosticsProxy
+{
+  /*< private >*/
+  GDBusProxy parent_instance;
+  GcaDiagnosticsProxyPrivate *priv;
+};
+
+struct _GcaDiagnosticsProxyClass
+{
+  GDBusProxyClass parent_class;
+};
+
+GType gca_diagnostics_proxy_get_type (void);
+
+void gca_diagnostics_proxy_new (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data);
+GcaDiagnostics *gca_diagnostics_proxy_new_finish (
+    GAsyncResult        *res,
+    GError             **error);
+GcaDiagnostics *gca_diagnostics_proxy_new_sync (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error);
+
+void gca_diagnostics_proxy_new_for_bus (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data);
+GcaDiagnostics *gca_diagnostics_proxy_new_for_bus_finish (
+    GAsyncResult        *res,
+    GError             **error);
+GcaDiagnostics *gca_diagnostics_proxy_new_for_bus_sync (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error);
+
+
+/* ---- */
+
+#define GCA_TYPE_DIAGNOSTICS_SKELETON (gca_diagnostics_skeleton_get_type ())
+#define GCA_DIAGNOSTICS_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GCA_TYPE_DIAGNOSTICS_SKELETON, 
GcaDiagnosticsSkeleton))
+#define GCA_DIAGNOSTICS_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GCA_TYPE_DIAGNOSTICS_SKELETON, 
GcaDiagnosticsSkeletonClass))
+#define GCA_DIAGNOSTICS_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), 
GCA_TYPE_DIAGNOSTICS_SKELETON, GcaDiagnosticsSkeletonClass))
+#define GCA_IS_DIAGNOSTICS_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GCA_TYPE_DIAGNOSTICS_SKELETON))
+#define GCA_IS_DIAGNOSTICS_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GCA_TYPE_DIAGNOSTICS_SKELETON))
+
+typedef struct _GcaDiagnosticsSkeleton GcaDiagnosticsSkeleton;
+typedef struct _GcaDiagnosticsSkeletonClass GcaDiagnosticsSkeletonClass;
+typedef struct _GcaDiagnosticsSkeletonPrivate GcaDiagnosticsSkeletonPrivate;
+
+struct _GcaDiagnosticsSkeleton
+{
+  /*< private >*/
+  GDBusInterfaceSkeleton parent_instance;
+  GcaDiagnosticsSkeletonPrivate *priv;
+};
+
+struct _GcaDiagnosticsSkeletonClass
+{
+  GDBusInterfaceSkeletonClass parent_class;
+};
+
+GType gca_diagnostics_skeleton_get_type (void);
+
+GcaDiagnostics *gca_diagnostics_skeleton_new (void);
+
+
+G_END_DECLS
+
+#endif /* __GCA_DIAGNOSTICS_H__ */
diff --git a/libide/gca/gca-service.c b/libide/gca/gca-service.c
new file mode 100644
index 0000000..680ec9a
--- /dev/null
+++ b/libide/gca/gca-service.c
@@ -0,0 +1,1291 @@
+/*
+ * Generated by gdbus-codegen 2.42.0. DO NOT EDIT.
+ *
+ * The license of this code is the same as for the source it was derived from.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "gca-service.h"
+
+#include <string.h>
+#ifdef G_OS_UNIX
+#  include <gio/gunixfdlist.h>
+#endif
+
+typedef struct
+{
+  GDBusArgInfo parent_struct;
+  gboolean use_gvariant;
+} _ExtendedGDBusArgInfo;
+
+typedef struct
+{
+  GDBusMethodInfo parent_struct;
+  const gchar *signal_name;
+  gboolean pass_fdlist;
+} _ExtendedGDBusMethodInfo;
+
+typedef struct
+{
+  GDBusSignalInfo parent_struct;
+  const gchar *signal_name;
+} _ExtendedGDBusSignalInfo;
+
+typedef struct
+{
+  GDBusPropertyInfo parent_struct;
+  const gchar *hyphen_name;
+  gboolean use_gvariant;
+} _ExtendedGDBusPropertyInfo;
+
+typedef struct
+{
+  GDBusInterfaceInfo parent_struct;
+  const gchar *hyphen_name;
+} _ExtendedGDBusInterfaceInfo;
+
+typedef struct
+{
+  const _ExtendedGDBusPropertyInfo *info;
+  guint prop_id;
+  GValue orig_value; /* the value before the change */
+} ChangedProperty;
+
+static void
+_changed_property_free (ChangedProperty *data)
+{
+  g_value_unset (&data->orig_value);
+  g_free (data);
+}
+
+static gboolean
+_g_strv_equal0 (gchar **a, gchar **b)
+{
+  gboolean ret = FALSE;
+  guint n;
+  if (a == NULL && b == NULL)
+    {
+      ret = TRUE;
+      goto out;
+    }
+  if (a == NULL || b == NULL)
+    goto out;
+  if (g_strv_length (a) != g_strv_length (b))
+    goto out;
+  for (n = 0; a[n] != NULL; n++)
+    if (g_strcmp0 (a[n], b[n]) != 0)
+      goto out;
+  ret = TRUE;
+out:
+  return ret;
+}
+
+static gboolean
+_g_variant_equal0 (GVariant *a, GVariant *b)
+{
+  gboolean ret = FALSE;
+  if (a == NULL && b == NULL)
+    {
+      ret = TRUE;
+      goto out;
+    }
+  if (a == NULL || b == NULL)
+    goto out;
+  ret = g_variant_equal (a, b);
+out:
+  return ret;
+}
+
+G_GNUC_UNUSED static gboolean
+_g_value_equal (const GValue *a, const GValue *b)
+{
+  gboolean ret = FALSE;
+  g_assert (G_VALUE_TYPE (a) == G_VALUE_TYPE (b));
+  switch (G_VALUE_TYPE (a))
+    {
+      case G_TYPE_BOOLEAN:
+        ret = (g_value_get_boolean (a) == g_value_get_boolean (b));
+        break;
+      case G_TYPE_UCHAR:
+        ret = (g_value_get_uchar (a) == g_value_get_uchar (b));
+        break;
+      case G_TYPE_INT:
+        ret = (g_value_get_int (a) == g_value_get_int (b));
+        break;
+      case G_TYPE_UINT:
+        ret = (g_value_get_uint (a) == g_value_get_uint (b));
+        break;
+      case G_TYPE_INT64:
+        ret = (g_value_get_int64 (a) == g_value_get_int64 (b));
+        break;
+      case G_TYPE_UINT64:
+        ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b));
+        break;
+      case G_TYPE_DOUBLE:
+        {
+          /* Avoid -Wfloat-equal warnings by doing a direct bit compare */
+          gdouble da = g_value_get_double (a);
+          gdouble db = g_value_get_double (b);
+          ret = memcmp (&da, &db, sizeof (gdouble)) == 0;
+        }
+        break;
+      case G_TYPE_STRING:
+        ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0);
+        break;
+      case G_TYPE_VARIANT:
+        ret = _g_variant_equal0 (g_value_get_variant (a), g_value_get_variant (b));
+        break;
+      default:
+        if (G_VALUE_TYPE (a) == G_TYPE_STRV)
+          ret = _g_strv_equal0 (g_value_get_boxed (a), g_value_get_boxed (b));
+        else
+          g_critical ("_g_value_equal() does not handle type %s", g_type_name (G_VALUE_TYPE (a)));
+        break;
+    }
+  return ret;
+}
+
+/* ------------------------------------------------------------------------
+ * Code for interface org.gnome.CodeAssist.v1.Service
+ * ------------------------------------------------------------------------
+ */
+
+/**
+ * SECTION:GcaService
+ * @title: GcaService
+ * @short_description: Generated C code for the org.gnome.CodeAssist.v1.Service D-Bus interface
+ *
+ * This section contains code for working with the <link 
linkend="gdbus-interface-org-gnome-CodeAssist-v1-Service.top_of_page">org.gnome.CodeAssist.v1.Service</link> 
D-Bus interface in C.
+ */
+
+/* ---- Introspection data for org.gnome.CodeAssist.v1.Service ---- */
+
+static const _ExtendedGDBusArgInfo _gca_service_method_info_dispose_IN_ARG_path =
+{
+  {
+    -1,
+    (gchar *) "path",
+    (gchar *) "s",
+    NULL
+  },
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const _gca_service_method_info_dispose_IN_ARG_pointers[] =
+{
+  &_gca_service_method_info_dispose_IN_ARG_path,
+  NULL
+};
+
+static const _ExtendedGDBusMethodInfo _gca_service_method_info_dispose =
+{
+  {
+    -1,
+    (gchar *) "Dispose",
+    (GDBusArgInfo **) &_gca_service_method_info_dispose_IN_ARG_pointers,
+    NULL,
+    NULL
+  },
+  "handle-dispose",
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo _gca_service_method_info_parse_IN_ARG_path =
+{
+  {
+    -1,
+    (gchar *) "path",
+    (gchar *) "s",
+    NULL
+  },
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo _gca_service_method_info_parse_IN_ARG_data_path =
+{
+  {
+    -1,
+    (gchar *) "data_path",
+    (gchar *) "s",
+    NULL
+  },
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo _gca_service_method_info_parse_IN_ARG_cursor =
+{
+  {
+    -1,
+    (gchar *) "cursor",
+    (gchar *) "(xx)",
+    NULL
+  },
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo _gca_service_method_info_parse_IN_ARG_options =
+{
+  {
+    -1,
+    (gchar *) "options",
+    (gchar *) "a{sv}",
+    NULL
+  },
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const _gca_service_method_info_parse_IN_ARG_pointers[] =
+{
+  &_gca_service_method_info_parse_IN_ARG_path,
+  &_gca_service_method_info_parse_IN_ARG_data_path,
+  &_gca_service_method_info_parse_IN_ARG_cursor,
+  &_gca_service_method_info_parse_IN_ARG_options,
+  NULL
+};
+
+static const _ExtendedGDBusArgInfo _gca_service_method_info_parse_OUT_ARG_unnamed_arg4 =
+{
+  {
+    -1,
+    (gchar *) "unnamed_arg4",
+    (gchar *) "o",
+    NULL
+  },
+  FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const _gca_service_method_info_parse_OUT_ARG_pointers[] =
+{
+  &_gca_service_method_info_parse_OUT_ARG_unnamed_arg4,
+  NULL
+};
+
+static const _ExtendedGDBusMethodInfo _gca_service_method_info_parse =
+{
+  {
+    -1,
+    (gchar *) "Parse",
+    (GDBusArgInfo **) &_gca_service_method_info_parse_IN_ARG_pointers,
+    (GDBusArgInfo **) &_gca_service_method_info_parse_OUT_ARG_pointers,
+    NULL
+  },
+  "handle-parse",
+  FALSE
+};
+
+static const _ExtendedGDBusMethodInfo * const _gca_service_method_info_pointers[] =
+{
+  &_gca_service_method_info_dispose,
+  &_gca_service_method_info_parse,
+  NULL
+};
+
+static const _ExtendedGDBusInterfaceInfo _gca_service_interface_info =
+{
+  {
+    -1,
+    (gchar *) "org.gnome.CodeAssist.v1.Service",
+    (GDBusMethodInfo **) &_gca_service_method_info_pointers,
+    NULL,
+    NULL,
+    NULL
+  },
+  "service",
+};
+
+
+/**
+ * gca_service_interface_info:
+ *
+ * Gets a machine-readable description of the <link 
linkend="gdbus-interface-org-gnome-CodeAssist-v1-Service.top_of_page">org.gnome.CodeAssist.v1.Service</link> 
D-Bus interface.
+ *
+ * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free.
+ */
+GDBusInterfaceInfo *
+gca_service_interface_info (void)
+{
+  return (GDBusInterfaceInfo *) &_gca_service_interface_info.parent_struct;
+}
+
+/**
+ * gca_service_override_properties:
+ * @klass: The class structure for a #GObject<!-- -->-derived class.
+ * @property_id_begin: The property id to assign to the first overridden property.
+ *
+ * Overrides all #GObject properties in the #GcaService interface for a concrete class.
+ * The properties are overridden in the order they are defined.
+ *
+ * Returns: The last property id.
+ */
+guint
+gca_service_override_properties (GObjectClass *klass, guint property_id_begin)
+{
+  return property_id_begin - 1;
+}
+
+
+
+/**
+ * GcaService:
+ *
+ * Abstract interface type for the D-Bus interface <link 
linkend="gdbus-interface-org-gnome-CodeAssist-v1-Service.top_of_page">org.gnome.CodeAssist.v1.Service</link>.
+ */
+
+/**
+ * GcaServiceIface:
+ * @parent_iface: The parent interface.
+ * @handle_dispose: Handler for the #GcaService::handle-dispose signal.
+ * @handle_parse: Handler for the #GcaService::handle-parse signal.
+ *
+ * Virtual table for the D-Bus interface <link 
linkend="gdbus-interface-org-gnome-CodeAssist-v1-Service.top_of_page">org.gnome.CodeAssist.v1.Service</link>.
+ */
+
+typedef GcaServiceIface GcaServiceInterface;
+G_DEFINE_INTERFACE (GcaService, gca_service, G_TYPE_OBJECT);
+
+static void
+gca_service_default_init (GcaServiceIface *iface)
+{
+  /* GObject signals for incoming D-Bus method calls: */
+  /**
+   * GcaService::handle-dispose:
+   * @object: A #GcaService.
+   * @invocation: A #GDBusMethodInvocation.
+   * @arg_path: Argument passed by remote caller.
+   *
+   * Signal emitted when a remote caller is invoking the <link 
linkend="gdbus-method-org-gnome-CodeAssist-v1-Service.Dispose">Dispose()</link> D-Bus method.
+   *
+   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a 
reference to @invocation and eventually call gca_service_complete_dispose() or e.g. 
g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler 
handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+   *
+   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+   */
+  g_signal_new ("handle-dispose",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (GcaServiceIface, handle_dispose),
+    g_signal_accumulator_true_handled,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_BOOLEAN,
+    2,
+    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING);
+
+  /**
+   * GcaService::handle-parse:
+   * @object: A #GcaService.
+   * @invocation: A #GDBusMethodInvocation.
+   * @arg_path: Argument passed by remote caller.
+   * @arg_data_path: Argument passed by remote caller.
+   * @arg_cursor: Argument passed by remote caller.
+   * @arg_options: Argument passed by remote caller.
+   *
+   * Signal emitted when a remote caller is invoking the <link 
linkend="gdbus-method-org-gnome-CodeAssist-v1-Service.Parse">Parse()</link> D-Bus method.
+   *
+   * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a 
reference to @invocation and eventually call gca_service_complete_parse() or e.g. 
g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler 
handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+   *
+   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+   */
+  g_signal_new ("handle-parse",
+    G_TYPE_FROM_INTERFACE (iface),
+    G_SIGNAL_RUN_LAST,
+    G_STRUCT_OFFSET (GcaServiceIface, handle_parse),
+    g_signal_accumulator_true_handled,
+    NULL,
+    g_cclosure_marshal_generic,
+    G_TYPE_BOOLEAN,
+    5,
+    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_VARIANT, G_TYPE_VARIANT);
+
+}
+
+/**
+ * gca_service_call_dispose:
+ * @proxy: A #GcaServiceProxy.
+ * @arg_path: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link 
linkend="gdbus-method-org-gnome-CodeAssist-v1-Service.Dispose">Dispose()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link 
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling 
this method from.
+ * You can then call gca_service_call_dispose_finish() to get the result of the operation.
+ *
+ * See gca_service_call_dispose_sync() for the synchronous, blocking version of this method.
+ */
+void
+gca_service_call_dispose (
+    GcaService *proxy,
+    const gchar *arg_path,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+    "Dispose",
+    g_variant_new ("(s)",
+                   arg_path),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    callback,
+    user_data);
+}
+
+/**
+ * gca_service_call_dispose_finish:
+ * @proxy: A #GcaServiceProxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gca_service_call_dispose().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with gca_service_call_dispose().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+gca_service_call_dispose_finish (
+    GcaService *proxy,
+    GAsyncResult *res,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * gca_service_call_dispose_sync:
+ * @proxy: A #GcaServiceProxy.
+ * @arg_path: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link 
linkend="gdbus-method-org-gnome-CodeAssist-v1-Service.Dispose">Dispose()</link> D-Bus method on @proxy. The 
calling thread is blocked until a reply is received.
+ *
+ * See gca_service_call_dispose() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+gca_service_call_dispose_sync (
+    GcaService *proxy,
+    const gchar *arg_path,
+    GCancellable *cancellable,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+    "Dispose",
+    g_variant_new ("(s)",
+                   arg_path),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "()");
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * gca_service_call_parse:
+ * @proxy: A #GcaServiceProxy.
+ * @arg_path: Argument to pass with the method invocation.
+ * @arg_data_path: Argument to pass with the method invocation.
+ * @arg_cursor: Argument to pass with the method invocation.
+ * @arg_options: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link 
linkend="gdbus-method-org-gnome-CodeAssist-v1-Service.Parse">Parse()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link 
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling 
this method from.
+ * You can then call gca_service_call_parse_finish() to get the result of the operation.
+ *
+ * See gca_service_call_parse_sync() for the synchronous, blocking version of this method.
+ */
+void
+gca_service_call_parse (
+    GcaService *proxy,
+    const gchar *arg_path,
+    const gchar *arg_data_path,
+    GVariant *arg_cursor,
+    GVariant *arg_options,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data)
+{
+  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+    "Parse",
+    g_variant_new ("(ss@(xx)@a{sv})",
+                   arg_path,
+                   arg_data_path,
+                   arg_cursor,
+                   arg_options),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    callback,
+    user_data);
+}
+
+/**
+ * gca_service_call_parse_finish:
+ * @proxy: A #GcaServiceProxy.
+ * @out_unnamed_arg4: (out): Return location for return parameter or %NULL to ignore.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gca_service_call_parse().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with gca_service_call_parse().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+gca_service_call_parse_finish (
+    GcaService *proxy,
+    gchar **out_unnamed_arg4,
+    GAsyncResult *res,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "(o)",
+                 out_unnamed_arg4);
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * gca_service_call_parse_sync:
+ * @proxy: A #GcaServiceProxy.
+ * @arg_path: Argument to pass with the method invocation.
+ * @arg_data_path: Argument to pass with the method invocation.
+ * @arg_cursor: Argument to pass with the method invocation.
+ * @arg_options: Argument to pass with the method invocation.
+ * @out_unnamed_arg4: (out): Return location for return parameter or %NULL to ignore.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link 
linkend="gdbus-method-org-gnome-CodeAssist-v1-Service.Parse">Parse()</link> D-Bus method on @proxy. The 
calling thread is blocked until a reply is received.
+ *
+ * See gca_service_call_parse() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+gca_service_call_parse_sync (
+    GcaService *proxy,
+    const gchar *arg_path,
+    const gchar *arg_data_path,
+    GVariant *arg_cursor,
+    GVariant *arg_options,
+    gchar **out_unnamed_arg4,
+    GCancellable *cancellable,
+    GError **error)
+{
+  GVariant *_ret;
+  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+    "Parse",
+    g_variant_new ("(ss@(xx)@a{sv})",
+                   arg_path,
+                   arg_data_path,
+                   arg_cursor,
+                   arg_options),
+    G_DBUS_CALL_FLAGS_NONE,
+    -1,
+    cancellable,
+    error);
+  if (_ret == NULL)
+    goto _out;
+  g_variant_get (_ret,
+                 "(o)",
+                 out_unnamed_arg4);
+  g_variant_unref (_ret);
+_out:
+  return _ret != NULL;
+}
+
+/**
+ * gca_service_complete_dispose:
+ * @object: A #GcaService.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link 
linkend="gdbus-method-org-gnome-CodeAssist-v1-Service.Dispose">Dispose()</link> D-Bus method. If you instead 
want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or 
similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+gca_service_complete_dispose (
+    GcaService *object,
+    GDBusMethodInvocation *invocation)
+{
+  g_dbus_method_invocation_return_value (invocation,
+    g_variant_new ("()"));
+}
+
+/**
+ * gca_service_complete_parse:
+ * @object: A #GcaService.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ * @unnamed_arg4: Parameter to return.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link 
linkend="gdbus-method-org-gnome-CodeAssist-v1-Service.Parse">Parse()</link> D-Bus method. If you instead want 
to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or 
similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+gca_service_complete_parse (
+    GcaService *object,
+    GDBusMethodInvocation *invocation,
+    const gchar *unnamed_arg4)
+{
+  g_dbus_method_invocation_return_value (invocation,
+    g_variant_new ("(o)",
+                   unnamed_arg4));
+}
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * GcaServiceProxy:
+ *
+ * The #GcaServiceProxy structure contains only private data and should only be accessed using the provided 
API.
+ */
+
+/**
+ * GcaServiceProxyClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #GcaServiceProxy.
+ */
+
+struct _GcaServiceProxyPrivate
+{
+  GData *qdata;
+};
+
+static void gca_service_proxy_iface_init (GcaServiceIface *iface);
+
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (GcaServiceProxy, gca_service_proxy, G_TYPE_DBUS_PROXY,
+                         G_ADD_PRIVATE (GcaServiceProxy)
+                         G_IMPLEMENT_INTERFACE (GCA_TYPE_SERVICE, gca_service_proxy_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (GcaServiceProxy, gca_service_proxy, G_TYPE_DBUS_PROXY,
+                         G_IMPLEMENT_INTERFACE (GCA_TYPE_SERVICE, gca_service_proxy_iface_init));
+
+#endif
+static void
+gca_service_proxy_finalize (GObject *object)
+{
+  GcaServiceProxy *proxy = GCA_SERVICE_PROXY (object);
+  g_datalist_clear (&proxy->priv->qdata);
+  G_OBJECT_CLASS (gca_service_proxy_parent_class)->finalize (object);
+}
+
+static void
+gca_service_proxy_get_property (GObject      *object,
+  guint         prop_id,
+  GValue       *value,
+  GParamSpec   *pspec G_GNUC_UNUSED)
+{
+}
+
+static void
+gca_service_proxy_set_property (GObject      *object,
+  guint         prop_id,
+  const GValue *value,
+  GParamSpec   *pspec G_GNUC_UNUSED)
+{
+}
+
+static void
+gca_service_proxy_g_signal (GDBusProxy *proxy,
+  const gchar *sender_name G_GNUC_UNUSED,
+  const gchar *signal_name,
+  GVariant *parameters)
+{
+  _ExtendedGDBusSignalInfo *info;
+  GVariantIter iter;
+  GVariant *child;
+  GValue *paramv;
+  guint num_params;
+  guint n;
+  guint signal_id;
+  info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) 
&_gca_service_interface_info.parent_struct, signal_name);
+  if (info == NULL)
+    return;
+  num_params = g_variant_n_children (parameters);
+  paramv = g_new0 (GValue, num_params + 1);
+  g_value_init (&paramv[0], GCA_TYPE_SERVICE);
+  g_value_set_object (&paramv[0], proxy);
+  g_variant_iter_init (&iter, parameters);
+  n = 1;
+  while ((child = g_variant_iter_next_value (&iter)) != NULL)
+    {
+      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1];
+      if (arg_info->use_gvariant)
+        {
+          g_value_init (&paramv[n], G_TYPE_VARIANT);
+          g_value_set_variant (&paramv[n], child);
+          n++;
+        }
+      else
+        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
+      g_variant_unref (child);
+    }
+  signal_id = g_signal_lookup (info->signal_name, GCA_TYPE_SERVICE);
+  g_signal_emitv (paramv, signal_id, 0, NULL);
+  for (n = 0; n < num_params + 1; n++)
+    g_value_unset (&paramv[n]);
+  g_free (paramv);
+}
+
+static void
+gca_service_proxy_g_properties_changed (GDBusProxy *_proxy,
+  GVariant *changed_properties,
+  const gchar *const *invalidated_properties)
+{
+  GcaServiceProxy *proxy = GCA_SERVICE_PROXY (_proxy);
+  guint n;
+  const gchar *key;
+  GVariantIter *iter;
+  _ExtendedGDBusPropertyInfo *info;
+  g_variant_get (changed_properties, "a{sv}", &iter);
+  while (g_variant_iter_next (iter, "{&sv}", &key, NULL))
+    {
+      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) 
&_gca_service_interface_info.parent_struct, key);
+      g_datalist_remove_data (&proxy->priv->qdata, key);
+      if (info != NULL)
+        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+    }
+  g_variant_iter_free (iter);
+  for (n = 0; invalidated_properties[n] != NULL; n++)
+    {
+      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) 
&_gca_service_interface_info.parent_struct, invalidated_properties[n]);
+      g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]);
+      if (info != NULL)
+        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+    }
+}
+
+static void
+gca_service_proxy_init (GcaServiceProxy *proxy)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+  proxy->priv = gca_service_proxy_get_instance_private (proxy);
+#else
+  proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, GCA_TYPE_SERVICE_PROXY, GcaServiceProxyPrivate);
+#endif
+
+  g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), gca_service_interface_info ());
+}
+
+static void
+gca_service_proxy_class_init (GcaServiceProxyClass *klass)
+{
+  GObjectClass *gobject_class;
+  GDBusProxyClass *proxy_class;
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize     = gca_service_proxy_finalize;
+  gobject_class->get_property = gca_service_proxy_get_property;
+  gobject_class->set_property = gca_service_proxy_set_property;
+
+  proxy_class = G_DBUS_PROXY_CLASS (klass);
+  proxy_class->g_signal = gca_service_proxy_g_signal;
+  proxy_class->g_properties_changed = gca_service_proxy_g_properties_changed;
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+  g_type_class_add_private (klass, sizeof (GcaServiceProxyPrivate));
+#endif
+}
+
+static void
+gca_service_proxy_iface_init (GcaServiceIface *iface)
+{
+}
+
+/**
+ * gca_service_proxy_new:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus 
connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously creates a proxy for the D-Bus interface <link 
linkend="gdbus-interface-org-gnome-CodeAssist-v1-Service.top_of_page">org.gnome.CodeAssist.v1.Service</link>. 
See g_dbus_proxy_new() for more details.
+ *
+ * When the operation is finished, @callback will be invoked in the <link 
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling 
this method from.
+ * You can then call gca_service_proxy_new_finish() to get the result of the operation.
+ *
+ * See gca_service_proxy_new_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+gca_service_proxy_new (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data)
+{
+  g_async_initable_new_async (GCA_TYPE_SERVICE_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, 
"g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, 
"g-interface-name", "org.gnome.CodeAssist.v1.Service", NULL);
+}
+
+/**
+ * gca_service_proxy_new_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gca_service_proxy_new().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with gca_service_proxy_new().
+ *
+ * Returns: (transfer full) (type GcaServiceProxy): The constructed proxy object or %NULL if @error is set.
+ */
+GcaService *
+gca_service_proxy_new_finish (
+    GAsyncResult        *res,
+    GError             **error)
+{
+  GObject *ret;
+  GObject *source_object;
+  source_object = g_async_result_get_source_object (res);
+  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+  g_object_unref (source_object);
+  if (ret != NULL)
+    return GCA_SERVICE (ret);
+  else
+    return NULL;
+}
+
+/**
+ * gca_service_proxy_new_sync:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus 
connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Synchronously creates a proxy for the D-Bus interface <link 
linkend="gdbus-interface-org-gnome-CodeAssist-v1-Service.top_of_page">org.gnome.CodeAssist.v1.Service</link>. 
See g_dbus_proxy_new_sync() for more details.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See gca_service_proxy_new() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type GcaServiceProxy): The constructed proxy object or %NULL if @error is set.
+ */
+GcaService *
+gca_service_proxy_new_sync (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error)
+{
+  GInitable *ret;
+  ret = g_initable_new (GCA_TYPE_SERVICE_PROXY, cancellable, error, "g-flags", flags, "g-name", name, 
"g-connection", connection, "g-object-path", object_path, "g-interface-name", 
"org.gnome.CodeAssist.v1.Service", NULL);
+  if (ret != NULL)
+    return GCA_SERVICE (ret);
+  else
+    return NULL;
+}
+
+
+/**
+ * gca_service_proxy_new_for_bus:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Like gca_service_proxy_new() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * When the operation is finished, @callback will be invoked in the <link 
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling 
this method from.
+ * You can then call gca_service_proxy_new_for_bus_finish() to get the result of the operation.
+ *
+ * See gca_service_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+gca_service_proxy_new_for_bus (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data)
+{
+  g_async_initable_new_async (GCA_TYPE_SERVICE_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, 
"g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", 
"org.gnome.CodeAssist.v1.Service", NULL);
+}
+
+/**
+ * gca_service_proxy_new_for_bus_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to gca_service_proxy_new_for_bus().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with gca_service_proxy_new_for_bus().
+ *
+ * Returns: (transfer full) (type GcaServiceProxy): The constructed proxy object or %NULL if @error is set.
+ */
+GcaService *
+gca_service_proxy_new_for_bus_finish (
+    GAsyncResult        *res,
+    GError             **error)
+{
+  GObject *ret;
+  GObject *source_object;
+  source_object = g_async_result_get_source_object (res);
+  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+  g_object_unref (source_object);
+  if (ret != NULL)
+    return GCA_SERVICE (ret);
+  else
+    return NULL;
+}
+
+/**
+ * gca_service_proxy_new_for_bus_sync:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Like gca_service_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See gca_service_proxy_new_for_bus() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type GcaServiceProxy): The constructed proxy object or %NULL if @error is set.
+ */
+GcaService *
+gca_service_proxy_new_for_bus_sync (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error)
+{
+  GInitable *ret;
+  ret = g_initable_new (GCA_TYPE_SERVICE_PROXY, cancellable, error, "g-flags", flags, "g-name", name, 
"g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.gnome.CodeAssist.v1.Service", 
NULL);
+  if (ret != NULL)
+    return GCA_SERVICE (ret);
+  else
+    return NULL;
+}
+
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * GcaServiceSkeleton:
+ *
+ * The #GcaServiceSkeleton structure contains only private data and should only be accessed using the 
provided API.
+ */
+
+/**
+ * GcaServiceSkeletonClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #GcaServiceSkeleton.
+ */
+
+struct _GcaServiceSkeletonPrivate
+{
+  GValue *properties;
+  GList *changed_properties;
+  GSource *changed_properties_idle_source;
+  GMainContext *context;
+  GMutex lock;
+};
+
+static void
+_gca_service_skeleton_handle_method_call (
+  GDBusConnection *connection G_GNUC_UNUSED,
+  const gchar *sender G_GNUC_UNUSED,
+  const gchar *object_path G_GNUC_UNUSED,
+  const gchar *interface_name,
+  const gchar *method_name,
+  GVariant *parameters,
+  GDBusMethodInvocation *invocation,
+  gpointer user_data)
+{
+  GcaServiceSkeleton *skeleton = GCA_SERVICE_SKELETON (user_data);
+  _ExtendedGDBusMethodInfo *info;
+  GVariantIter iter;
+  GVariant *child;
+  GValue *paramv;
+  guint num_params;
+  guint num_extra;
+  guint n;
+  guint signal_id;
+  GValue return_value = G_VALUE_INIT;
+  info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation);
+  g_assert (info != NULL);
+  num_params = g_variant_n_children (parameters);
+  num_extra = info->pass_fdlist ? 3 : 2;  paramv = g_new0 (GValue, num_params + num_extra);
+  n = 0;
+  g_value_init (&paramv[n], GCA_TYPE_SERVICE);
+  g_value_set_object (&paramv[n++], skeleton);
+  g_value_init (&paramv[n], G_TYPE_DBUS_METHOD_INVOCATION);
+  g_value_set_object (&paramv[n++], invocation);
+  if (info->pass_fdlist)
+    {
+#ifdef G_OS_UNIX
+      g_value_init (&paramv[n], G_TYPE_UNIX_FD_LIST);
+      g_value_set_object (&paramv[n++], g_dbus_message_get_unix_fd_list 
(g_dbus_method_invocation_get_message (invocation)));
+#else
+      g_assert_not_reached ();
+#endif
+    }
+  g_variant_iter_init (&iter, parameters);
+  while ((child = g_variant_iter_next_value (&iter)) != NULL)
+    {
+      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra];
+      if (arg_info->use_gvariant)
+        {
+          g_value_init (&paramv[n], G_TYPE_VARIANT);
+          g_value_set_variant (&paramv[n], child);
+          n++;
+        }
+      else
+        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
+      g_variant_unref (child);
+    }
+  signal_id = g_signal_lookup (info->signal_name, GCA_TYPE_SERVICE);
+  g_value_init (&return_value, G_TYPE_BOOLEAN);
+  g_signal_emitv (paramv, signal_id, 0, &return_value);
+  if (!g_value_get_boolean (&return_value))
+    g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s 
is not implemented on interface %s", method_name, interface_name);
+  g_value_unset (&return_value);
+  for (n = 0; n < num_params + num_extra; n++)
+    g_value_unset (&paramv[n]);
+  g_free (paramv);
+}
+
+static GVariant *
+_gca_service_skeleton_handle_get_property (
+  GDBusConnection *connection G_GNUC_UNUSED,
+  const gchar *sender G_GNUC_UNUSED,
+  const gchar *object_path G_GNUC_UNUSED,
+  const gchar *interface_name G_GNUC_UNUSED,
+  const gchar *property_name,
+  GError **error,
+  gpointer user_data)
+{
+  GcaServiceSkeleton *skeleton = GCA_SERVICE_SKELETON (user_data);
+  GValue value = G_VALUE_INIT;
+  GParamSpec *pspec;
+  _ExtendedGDBusPropertyInfo *info;
+  GVariant *ret;
+  ret = NULL;
+  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) 
&_gca_service_interface_info.parent_struct, property_name);
+  g_assert (info != NULL);
+  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+  if (pspec == NULL)
+    {
+      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", 
property_name);
+    }
+  else
+    {
+      g_value_init (&value, pspec->value_type);
+      g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+      ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature));
+      g_value_unset (&value);
+    }
+  return ret;
+}
+
+static gboolean
+_gca_service_skeleton_handle_set_property (
+  GDBusConnection *connection G_GNUC_UNUSED,
+  const gchar *sender G_GNUC_UNUSED,
+  const gchar *object_path G_GNUC_UNUSED,
+  const gchar *interface_name G_GNUC_UNUSED,
+  const gchar *property_name,
+  GVariant *variant,
+  GError **error,
+  gpointer user_data)
+{
+  GcaServiceSkeleton *skeleton = GCA_SERVICE_SKELETON (user_data);
+  GValue value = G_VALUE_INIT;
+  GParamSpec *pspec;
+  _ExtendedGDBusPropertyInfo *info;
+  gboolean ret;
+  ret = FALSE;
+  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) 
&_gca_service_interface_info.parent_struct, property_name);
+  g_assert (info != NULL);
+  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+  if (pspec == NULL)
+    {
+      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", 
property_name);
+    }
+  else
+    {
+      if (info->use_gvariant)
+        g_value_set_variant (&value, variant);
+      else
+        g_dbus_gvariant_to_gvalue (variant, &value);
+      g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+      g_value_unset (&value);
+      ret = TRUE;
+    }
+  return ret;
+}
+
+static const GDBusInterfaceVTable _gca_service_skeleton_vtable =
+{
+  _gca_service_skeleton_handle_method_call,
+  _gca_service_skeleton_handle_get_property,
+  _gca_service_skeleton_handle_set_property,
+  {NULL}
+};
+
+static GDBusInterfaceInfo *
+gca_service_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
+{
+  return gca_service_interface_info ();
+}
+
+static GDBusInterfaceVTable *
+gca_service_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
+{
+  return (GDBusInterfaceVTable *) &_gca_service_skeleton_vtable;
+}
+
+static GVariant *
+gca_service_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton)
+{
+  GcaServiceSkeleton *skeleton = GCA_SERVICE_SKELETON (_skeleton);
+
+  GVariantBuilder builder;
+  guint n;
+  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+  if (_gca_service_interface_info.parent_struct.properties == NULL)
+    goto out;
+  for (n = 0; _gca_service_interface_info.parent_struct.properties[n] != NULL; n++)
+    {
+      GDBusPropertyInfo *info = _gca_service_interface_info.parent_struct.properties[n];
+      if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)
+        {
+          GVariant *value;
+          value = _gca_service_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection 
(G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path 
(G_DBUS_INTERFACE_SKELETON (skeleton)), "org.gnome.CodeAssist.v1.Service", info->name, NULL, skeleton);
+          if (value != NULL)
+            {
+              g_variant_take_ref (value);
+              g_variant_builder_add (&builder, "{sv}", info->name, value);
+              g_variant_unref (value);
+            }
+        }
+    }
+out:
+  return g_variant_builder_end (&builder);
+}
+
+static void
+gca_service_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)
+{
+}
+
+static void gca_service_skeleton_iface_init (GcaServiceIface *iface);
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (GcaServiceSkeleton, gca_service_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
+                         G_ADD_PRIVATE (GcaServiceSkeleton)
+                         G_IMPLEMENT_INTERFACE (GCA_TYPE_SERVICE, gca_service_skeleton_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (GcaServiceSkeleton, gca_service_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
+                         G_IMPLEMENT_INTERFACE (GCA_TYPE_SERVICE, gca_service_skeleton_iface_init));
+
+#endif
+static void
+gca_service_skeleton_finalize (GObject *object)
+{
+  GcaServiceSkeleton *skeleton = GCA_SERVICE_SKELETON (object);
+  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
+  if (skeleton->priv->changed_properties_idle_source != NULL)
+    g_source_destroy (skeleton->priv->changed_properties_idle_source);
+  g_main_context_unref (skeleton->priv->context);
+  g_mutex_clear (&skeleton->priv->lock);
+  G_OBJECT_CLASS (gca_service_skeleton_parent_class)->finalize (object);
+}
+
+static void
+gca_service_skeleton_init (GcaServiceSkeleton *skeleton)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+  skeleton->priv = gca_service_skeleton_get_instance_private (skeleton);
+#else
+  skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, GCA_TYPE_SERVICE_SKELETON, 
GcaServiceSkeletonPrivate);
+#endif
+
+  g_mutex_init (&skeleton->priv->lock);
+  skeleton->priv->context = g_main_context_ref_thread_default ();
+}
+
+static void
+gca_service_skeleton_class_init (GcaServiceSkeletonClass *klass)
+{
+  GObjectClass *gobject_class;
+  GDBusInterfaceSkeletonClass *skeleton_class;
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize = gca_service_skeleton_finalize;
+
+  skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);
+  skeleton_class->get_info = gca_service_skeleton_dbus_interface_get_info;
+  skeleton_class->get_properties = gca_service_skeleton_dbus_interface_get_properties;
+  skeleton_class->flush = gca_service_skeleton_dbus_interface_flush;
+  skeleton_class->get_vtable = gca_service_skeleton_dbus_interface_get_vtable;
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+  g_type_class_add_private (klass, sizeof (GcaServiceSkeletonPrivate));
+#endif
+}
+
+static void
+gca_service_skeleton_iface_init (GcaServiceIface *iface)
+{
+}
+
+/**
+ * gca_service_skeleton_new:
+ *
+ * Creates a skeleton object for the D-Bus interface <link 
linkend="gdbus-interface-org-gnome-CodeAssist-v1-Service.top_of_page">org.gnome.CodeAssist.v1.Service</link>.
+ *
+ * Returns: (transfer full) (type GcaServiceSkeleton): The skeleton object.
+ */
+GcaService *
+gca_service_skeleton_new (void)
+{
+  return GCA_SERVICE (g_object_new (GCA_TYPE_SERVICE_SKELETON, NULL));
+}
+
diff --git a/libide/gca/gca-service.h b/libide/gca/gca-service.h
new file mode 100644
index 0000000..a9717b7
--- /dev/null
+++ b/libide/gca/gca-service.h
@@ -0,0 +1,209 @@
+/*
+ * Generated by gdbus-codegen 2.42.0. DO NOT EDIT.
+ *
+ * The license of this code is the same as for the source it was derived from.
+ */
+
+#ifndef __GCA_SERVICE_H__
+#define __GCA_SERVICE_H__
+
+#include <gio/gio.h>
+
+G_BEGIN_DECLS
+
+
+/* ------------------------------------------------------------------------ */
+/* Declarations for org.gnome.CodeAssist.v1.Service */
+
+#define GCA_TYPE_SERVICE (gca_service_get_type ())
+#define GCA_SERVICE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GCA_TYPE_SERVICE, GcaService))
+#define GCA_IS_SERVICE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GCA_TYPE_SERVICE))
+#define GCA_SERVICE_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), GCA_TYPE_SERVICE, GcaServiceIface))
+
+struct _GcaService;
+typedef struct _GcaService GcaService;
+typedef struct _GcaServiceIface GcaServiceIface;
+
+struct _GcaServiceIface
+{
+  GTypeInterface parent_iface;
+
+  gboolean (*handle_dispose) (
+    GcaService *object,
+    GDBusMethodInvocation *invocation,
+    const gchar *arg_path);
+
+  gboolean (*handle_parse) (
+    GcaService *object,
+    GDBusMethodInvocation *invocation,
+    const gchar *arg_path,
+    const gchar *arg_data_path,
+    GVariant *arg_cursor,
+    GVariant *arg_options);
+
+};
+
+GType gca_service_get_type (void);
+
+GDBusInterfaceInfo *gca_service_interface_info (void);
+guint gca_service_override_properties (GObjectClass *klass, guint property_id_begin);
+
+
+/* D-Bus method call completion functions: */
+void gca_service_complete_dispose (
+    GcaService *object,
+    GDBusMethodInvocation *invocation);
+
+void gca_service_complete_parse (
+    GcaService *object,
+    GDBusMethodInvocation *invocation,
+    const gchar *unnamed_arg4);
+
+
+
+/* D-Bus method calls: */
+void gca_service_call_dispose (
+    GcaService *proxy,
+    const gchar *arg_path,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean gca_service_call_dispose_finish (
+    GcaService *proxy,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean gca_service_call_dispose_sync (
+    GcaService *proxy,
+    const gchar *arg_path,
+    GCancellable *cancellable,
+    GError **error);
+
+void gca_service_call_parse (
+    GcaService *proxy,
+    const gchar *arg_path,
+    const gchar *arg_data_path,
+    GVariant *arg_cursor,
+    GVariant *arg_options,
+    GCancellable *cancellable,
+    GAsyncReadyCallback callback,
+    gpointer user_data);
+
+gboolean gca_service_call_parse_finish (
+    GcaService *proxy,
+    gchar **out_unnamed_arg4,
+    GAsyncResult *res,
+    GError **error);
+
+gboolean gca_service_call_parse_sync (
+    GcaService *proxy,
+    const gchar *arg_path,
+    const gchar *arg_data_path,
+    GVariant *arg_cursor,
+    GVariant *arg_options,
+    gchar **out_unnamed_arg4,
+    GCancellable *cancellable,
+    GError **error);
+
+
+
+/* ---- */
+
+#define GCA_TYPE_SERVICE_PROXY (gca_service_proxy_get_type ())
+#define GCA_SERVICE_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GCA_TYPE_SERVICE_PROXY, GcaServiceProxy))
+#define GCA_SERVICE_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GCA_TYPE_SERVICE_PROXY, 
GcaServiceProxyClass))
+#define GCA_SERVICE_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GCA_TYPE_SERVICE_PROXY, 
GcaServiceProxyClass))
+#define GCA_IS_SERVICE_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GCA_TYPE_SERVICE_PROXY))
+#define GCA_IS_SERVICE_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GCA_TYPE_SERVICE_PROXY))
+
+typedef struct _GcaServiceProxy GcaServiceProxy;
+typedef struct _GcaServiceProxyClass GcaServiceProxyClass;
+typedef struct _GcaServiceProxyPrivate GcaServiceProxyPrivate;
+
+struct _GcaServiceProxy
+{
+  /*< private >*/
+  GDBusProxy parent_instance;
+  GcaServiceProxyPrivate *priv;
+};
+
+struct _GcaServiceProxyClass
+{
+  GDBusProxyClass parent_class;
+};
+
+GType gca_service_proxy_get_type (void);
+
+void gca_service_proxy_new (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data);
+GcaService *gca_service_proxy_new_finish (
+    GAsyncResult        *res,
+    GError             **error);
+GcaService *gca_service_proxy_new_sync (
+    GDBusConnection     *connection,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error);
+
+void gca_service_proxy_new_for_bus (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GAsyncReadyCallback  callback,
+    gpointer             user_data);
+GcaService *gca_service_proxy_new_for_bus_finish (
+    GAsyncResult        *res,
+    GError             **error);
+GcaService *gca_service_proxy_new_for_bus_sync (
+    GBusType             bus_type,
+    GDBusProxyFlags      flags,
+    const gchar         *name,
+    const gchar         *object_path,
+    GCancellable        *cancellable,
+    GError             **error);
+
+
+/* ---- */
+
+#define GCA_TYPE_SERVICE_SKELETON (gca_service_skeleton_get_type ())
+#define GCA_SERVICE_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GCA_TYPE_SERVICE_SKELETON, 
GcaServiceSkeleton))
+#define GCA_SERVICE_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GCA_TYPE_SERVICE_SKELETON, 
GcaServiceSkeletonClass))
+#define GCA_SERVICE_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GCA_TYPE_SERVICE_SKELETON, 
GcaServiceSkeletonClass))
+#define GCA_IS_SERVICE_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GCA_TYPE_SERVICE_SKELETON))
+#define GCA_IS_SERVICE_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GCA_TYPE_SERVICE_SKELETON))
+
+typedef struct _GcaServiceSkeleton GcaServiceSkeleton;
+typedef struct _GcaServiceSkeletonClass GcaServiceSkeletonClass;
+typedef struct _GcaServiceSkeletonPrivate GcaServiceSkeletonPrivate;
+
+struct _GcaServiceSkeleton
+{
+  /*< private >*/
+  GDBusInterfaceSkeleton parent_instance;
+  GcaServiceSkeletonPrivate *priv;
+};
+
+struct _GcaServiceSkeletonClass
+{
+  GDBusInterfaceSkeletonClass parent_class;
+};
+
+GType gca_service_skeleton_get_type (void);
+
+GcaService *gca_service_skeleton_new (void);
+
+
+G_END_DECLS
+
+#endif /* __GCA_SERVICE_H__ */
diff --git a/libide/gca/gca-structs.c b/libide/gca/gca-structs.c
new file mode 100644
index 0000000..bf65804
--- /dev/null
+++ b/libide/gca/gca-structs.c
@@ -0,0 +1,106 @@
+/* gca-structs.c
+ *
+ * Copyright (C) 2014 Christian Hergert <christian hergert me>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "gca-structs.h"
+
+static void
+gca_diagnostic_destroy (gpointer data)
+{
+  GcaDiagnostic *diag = data;
+
+  if (diag)
+    {
+      g_array_unref (diag->fixits);
+      g_array_unref (diag->locations);
+      g_free (diag->message);
+    }
+}
+
+static void
+gca_fixit_destroy (gpointer data)
+{
+  GcaFixit *fixit = data;
+
+  if (fixit)
+    g_free (fixit->value);
+}
+
+GArray *
+gca_diagnostics_from_variant (GVariant *variant)
+{
+  GVariantIter iter;
+  GArray *ret;
+  GVariantIter *b;
+  GVariantIter *c;
+  gchar *d;
+  guint a;
+
+  g_return_val_if_fail (variant, NULL);
+
+  ret = g_array_new (FALSE, FALSE, sizeof (GcaDiagnostic));
+
+  g_array_set_clear_func (ret, gca_diagnostic_destroy);
+
+  g_variant_iter_init (&iter, variant);
+
+  while (g_variant_iter_loop (&iter, "(ua((x(xx)(xx))s)a(x(xx)(xx))s)",
+                              &a, &b, &c, &d))
+    {
+      GcaDiagnostic diag = { 0 };
+      gint64 x1, x2, x3, x4, x5;
+      gchar *e;
+
+      diag.severity = a;
+      diag.fixits = g_array_new (FALSE, FALSE, sizeof (GcaFixit));
+      diag.locations = g_array_new (FALSE, FALSE, sizeof (GcaSourceRange));
+      diag.message = g_strdup (d);
+
+      g_array_set_clear_func (diag.fixits, gca_fixit_destroy);
+
+      while (g_variant_iter_next (b, "((x(xx)(xx))s)", &x1, &x2, &x3, &x4, &x5, &e))
+        {
+          GcaFixit fixit = {{ 0 }};
+
+          fixit.range.file = x1;
+          fixit.range.begin.line = x2 - 1;
+          fixit.range.begin.column = x3 - 1;
+          fixit.range.end.line = x4 - 1;
+          fixit.range.end.column = x5 - 1;
+          fixit.value = g_strdup (e);
+
+          g_array_append_val (diag.fixits, fixit);
+        }
+
+      while (g_variant_iter_next (c, "(x(xx)(xx))", &x1, &x2, &x3, &x4, &x5))
+        {
+          GcaSourceRange range = { 0 };
+
+          range.file = x1;
+          range.begin.line = x2 - 1;
+          range.begin.column = x3 - 1;
+          range.end.line = x4 - 1;
+          range.end.column = x5 - 1;
+
+          g_array_append_val (diag.locations, range);
+        }
+
+      g_array_append_val (ret, diag);
+    }
+
+  return ret;
+}
diff --git a/libide/gca/gca-structs.h b/libide/gca/gca-structs.h
new file mode 100644
index 0000000..57b8219
--- /dev/null
+++ b/libide/gca/gca-structs.h
@@ -0,0 +1,67 @@
+/* gca-structs.h
+ *
+ * Copyright (C) 2014 Christian Hergert <christian hergert me>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GCA_STRUCTS_H
+#define GCA_STRUCTS_H
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+typedef enum
+{
+  GCA_SEVERITY_NONE,
+  GCA_SEVERITY_INFO,
+  GCA_SEVERITY_WARNING,
+  GCA_SEVERITY_DEPRECATED,
+  GCA_SEVERITY_ERROR,
+  GCA_SEVERITY_FATAL,
+} GcaSeverity;
+
+typedef struct
+{
+  guint64 line;
+  guint64 column;
+} GcaSourceLocation;
+
+typedef struct
+{
+  gint64            file;
+  GcaSourceLocation begin;
+  GcaSourceLocation end;
+} GcaSourceRange;
+
+typedef struct
+{
+  GcaSourceRange  range;
+  gchar          *value;
+} GcaFixit;
+
+typedef struct
+{
+  GcaSeverity  severity;
+  GArray      *fixits;
+  GArray      *locations;
+  gchar       *message;
+} GcaDiagnostic;
+
+GArray *gca_diagnostics_from_variant (GVariant *variant);
+
+G_END_DECLS
+
+#endif /* GCA_STRUCTS_H */
diff --git a/libide/gca/ide-gca-service.c b/libide/gca/ide-gca-service.c
new file mode 100644
index 0000000..9db06bc
--- /dev/null
+++ b/libide/gca/ide-gca-service.c
@@ -0,0 +1,155 @@
+/* ide-gca-service.c
+ *
+ * Copyright (C) 2015 Christian Hergert <christian hergert me>
+ *
+ * This file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gca-service.h>
+#include <glib/gi18n.h>
+
+#include "ide-gca-service.h"
+
+struct _IdeGcaService
+{
+  IdeService parent_instance;
+};
+
+static GDBusConnection *gDBus;
+
+G_DEFINE_TYPE (IdeGcaService, ide_gca_service, IDE_TYPE_SERVICE)
+
+static const gchar *
+remap_language (const gchar *lang_id)
+{
+  g_return_val_if_fail (lang_id, NULL);
+
+  if (g_str_equal (lang_id, "chdr") ||
+      g_str_equal (lang_id, "objc") ||
+      g_str_equal (lang_id, "cpp"))
+    return "c";
+
+  return lang_id;
+}
+
+static void
+proxy_new_cb (GObject      *object,
+              GAsyncResult *result,
+              gpointer      user_data)
+{
+  g_autoptr(GTask) task = user_data;
+  GcaService *proxy;
+  GError *error = NULL;
+
+  g_assert (G_IS_TASK (task));
+  g_assert (G_IS_ASYNC_RESULT (result));
+
+  proxy = gca_service_proxy_new_finish (result, &error);
+
+  if (!proxy)
+    {
+      g_task_return_error (task, error);
+      return;
+    }
+
+  g_task_return_pointer (task, g_object_ref (proxy), g_object_unref);
+
+  g_clear_object (&proxy);
+}
+
+void
+ide_gca_service_get_proxy_async (IdeGcaService       *self,
+                                 const gchar         *language_id,
+                                 GCancellable        *cancellable,
+                                 GAsyncReadyCallback  callback,
+                                 gpointer             user_data)
+{
+  g_autoptr(GTask) task = NULL;
+  g_autoptr(gchar) name = NULL;
+  g_autoptr(gchar) object_path = NULL;
+
+  g_return_if_fail (IDE_IS_GCA_SERVICE (self));
+  g_return_if_fail (language_id);
+  g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
+
+  task = g_task_new (self, cancellable, callback, user_data);
+
+  if (!gDBus)
+    {
+      g_task_return_new_error (task,
+                               G_IO_ERROR,
+                               G_IO_ERROR_NOT_CONNECTED,
+                               _("Not connected to DBus."));
+      return;
+    }
+
+  language_id = remap_language (language_id);
+
+  name = g_strdup_printf ("org.gnome.CodeAssist.v1.%s", language_id);
+  object_path = g_strdup_printf ("/org/gnome/CodeAssist/v1/%s", language_id);
+
+  gca_service_proxy_new (gDBus,
+                         G_DBUS_PROXY_FLAGS_NONE,
+                         name,
+                         object_path,
+                         cancellable,
+                         proxy_new_cb,
+                         g_object_ref (task));
+}
+
+GcaService *
+ide_gca_service_get_proxy_finish (IdeGcaService  *self,
+                                  GAsyncResult   *result,
+                                  GError        **error)
+{
+  GTask *task = (GTask *)result;
+
+  g_return_val_if_fail (IDE_IS_GCA_SERVICE (self), NULL);
+  g_return_val_if_fail (G_IS_TASK (task), NULL);
+
+  return g_task_propagate_pointer (task, error);
+}
+
+static void
+ide_gca_service_finalize (GObject *object)
+{
+  IdeGcaService *self = (IdeGcaService *)object;
+
+  G_OBJECT_CLASS (ide_gca_service_parent_class)->finalize (object);
+}
+
+static void
+ide_gca_service_class_init (IdeGcaServiceClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GError *error = NULL;
+
+  object_class->finalize = ide_gca_service_finalize;
+
+  gDBus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
+
+  if (!gDBus)
+    {
+      g_warning (_("Failed to load DBus connection to session bus. "
+                   "Code assistance will be disabled. "
+                   "Error was: %s"),
+                 error->message);
+      g_clear_error (&error);
+    }
+}
+
+static void
+ide_gca_service_init (IdeGcaService *self)
+{
+}
diff --git a/libide/gca/ide-gca-service.h b/libide/gca/ide-gca-service.h
new file mode 100644
index 0000000..e2d0130
--- /dev/null
+++ b/libide/gca/ide-gca-service.h
@@ -0,0 +1,43 @@
+/* ide-gca-service.h
+ *
+ * Copyright (C) 2015 Christian Hergert <christian hergert me>
+ *
+ * This file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef IDE_GCA_SERVICE_H
+#define IDE_GCA_SERVICE_H
+
+#include <gca-service.h>
+
+#include "ide-service.h"
+
+G_BEGIN_DECLS
+
+#define IDE_TYPE_GCA_SERVICE (ide_gca_service_get_type())
+
+G_DECLARE_FINAL_TYPE (IdeGcaService, ide_gca_service, IDE, GCA_SERVICE, IdeService)
+
+void        ide_gca_service_get_proxy_async  (IdeGcaService        *self,
+                                              const gchar          *language_id,
+                                              GCancellable         *cancellable,
+                                              GAsyncReadyCallback   callback,
+                                              gpointer              user_data);
+GcaService *ide_gca_service_get_proxy_finish (IdeGcaService        *self,
+                                              GAsyncResult         *result,
+                                              GError              **error);
+
+G_END_DECLS
+
+#endif /* IDE_GCA_SERVICE_H */
diff --git a/libide/ide.c b/libide/ide.c
index 5fdd504..18d9f47 100644
--- a/libide/ide.c
+++ b/libide/ide.c
@@ -29,6 +29,7 @@
 #include "ide-directory-vcs.h"
 #include "ide-editorconfig-file-settings.h"
 #include "ide-file-settings.h"
+#include "ide-gca-service.h"
 #include "ide-git-vcs.h"
 #include "ide-gsettings-file-settings.h"
 
@@ -95,6 +96,10 @@ ide_init_ctor (void)
                                   IDE_TYPE_CLANG_SERVICE,
                                   IDE_SERVICE_EXTENSION_POINT".clang",
                                   0);
+  g_io_extension_point_implement (IDE_SERVICE_EXTENSION_POINT,
+                                  IDE_TYPE_GCA_SERVICE,
+                                  IDE_SERVICE_EXTENSION_POINT".gca",
+                                  0);
 
   g_io_extension_point_implement (IDE_VCS_EXTENSION_POINT,
                                   IDE_TYPE_GIT_VCS,


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