[gnome-builder/wip/extensions] clang: extract clang into a plugin



commit 18cec0c317e0d514b9e14c77d1dd2a8f803e6d02
Author: Christian Hergert <christian hergert me>
Date:   Sun Jun 28 00:42:51 2015 -0700

    clang: extract clang into a plugin
    
    This required some interface changes as well, which was not easy to do
    as it's own commit. So this feels a bit like an amalgamation, but not
    much of a cleaner way to do it.
    
    I notice that the clang highlighter is not highlighting immediately, but
    it does seem to be working (Control+L forces re-highlight) which renders
    properly.

 configure.ac                                       |    5 +
 libide/Makefile.am                                 |   23 ----
 libide/c/ide-c-language.c                          |   17 +---
 libide/ctags/ide-ctags-service.c                   |   18 ++-
 libide/ctags/ide-ctags-service.h                   |    2 +-
 libide/gca/ide-gca-diagnostic-provider.c           |   23 +++--
 libide/gca/ide-gca-diagnostic-provider.h           |    3 +-
 libide/gca/ide-gca-service.c                       |    5 +-
 libide/gca/ide-gca-service.h                       |    2 +-
 libide/ide-buffer.c                                |   14 +--
 libide/ide-context.c                               |   10 +-
 libide/ide-diagnostic-provider.c                   |   19 +---
 libide/ide-diagnostic-provider.h                   |   10 +-
 libide/ide-highlighter.c                           |    8 ++
 libide/ide-internal.h                              |    2 -
 libide/ide-service.c                               |  117 +-------------------
 libide/ide-service.h                               |    6 +-
 libide/ide-symbol-resolver.c                       |    7 +
 libide/ide.c                                       |   56 ++-------
 plugins/Makefile.am                                |    5 +
 plugins/clang-completion/Makefile.am               |   31 +++++
 plugins/clang-completion/clang-completion.plugin   |   11 ++
 .../ide-clang-completion-provider.c                |   28 ++++-
 .../ide-clang-completion-provider.h                |    0
 plugins/clang-diagnostics/Makefile.am              |   31 +++++
 plugins/clang-diagnostics/clang-diagnostics.plugin |   11 ++
 .../ide-clang-diagnostic-provider.c                |   41 ++++++-
 .../ide-clang-diagnostic-provider.h                |    7 +-
 plugins/clang-highlighter/Makefile.am              |   32 ++++++
 plugins/clang-highlighter/clang-highlighter.plugin |   11 ++
 .../clang-highlighter}/ide-clang-highlighter.c     |   23 ++++-
 .../clang-highlighter}/ide-clang-highlighter.h     |    5 -
 plugins/clang-symbol-resolver/Makefile.am          |   31 +++++
 .../clang-symbol-resolver.plugin                   |   11 ++
 .../ide-clang-symbol-resolver.c                    |   28 ++++-
 .../ide-clang-symbol-resolver.h                    |    0
 plugins/clang/Makefile.am                          |   42 +++++++
 plugins/clang/clang.plugin                         |    8 ++
 .../clang/gb-clang-plugin.c                        |   29 +++---
 .../clang/ide-clang-completion-item.c              |    0
 .../clang/ide-clang-completion-item.h              |    0
 {libide => plugins}/clang/ide-clang-private.h      |    0
 {libide => plugins}/clang/ide-clang-service.c      |   28 +++--
 {libide => plugins}/clang/ide-clang-service.h      |    5 +-
 {libide => plugins}/clang/ide-clang-symbol-node.c  |    0
 {libide => plugins}/clang/ide-clang-symbol-node.h  |    0
 {libide => plugins}/clang/ide-clang-symbol-tree.c  |    0
 {libide => plugins}/clang/ide-clang-symbol-tree.h  |    0
 .../clang/ide-clang-translation-unit.c             |    0
 .../clang/ide-clang-translation-unit.h             |    0
 plugins/symbol-tree/symbol-tree.c                  |    5 +-
 51 files changed, 453 insertions(+), 317 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 7687c3e..9ceed59 100644
--- a/configure.ac
+++ b/configure.ac
@@ -383,6 +383,11 @@ AC_CONFIG_FILES([
        libide/Makefile
 
        plugins/Makefile
+       plugins/clang/Makefile
+       plugins/clang-completion/Makefile
+       plugins/clang-highlighter/Makefile
+       plugins/clang-diagnostics/Makefile
+       plugins/clang-symbol-resolver/Makefile
        plugins/command-bar/Makefile
        plugins/devhelp/Makefile
        plugins/device-manager/Makefile
diff --git a/libide/Makefile.am b/libide/Makefile.am
index 2db2790..ec2668c 100644
--- a/libide/Makefile.am
+++ b/libide/Makefile.am
@@ -210,25 +210,6 @@ libide_1_0_la_SOURCES = \
        c/ide-c-format-provider.h \
        c/ide-c-indenter.c \
        c/ide-c-indenter.h \
-       clang/ide-clang-completion-item.c \
-       clang/ide-clang-completion-item.h \
-       clang/ide-clang-completion-provider.c \
-       clang/ide-clang-completion-provider.h \
-       clang/ide-clang-diagnostic-provider.c \
-       clang/ide-clang-diagnostic-provider.h \
-       clang/ide-clang-highlighter.c \
-       clang/ide-clang-highlighter.h \
-       clang/ide-clang-private.h \
-       clang/ide-clang-service.c \
-       clang/ide-clang-service.h \
-       clang/ide-clang-symbol-resolver.c \
-       clang/ide-clang-symbol-resolver.h \
-       clang/ide-clang-symbol-node.c \
-       clang/ide-clang-symbol-node.h \
-       clang/ide-clang-symbol-tree.c \
-       clang/ide-clang-symbol-tree.h \
-       clang/ide-clang-translation-unit.c \
-       clang/ide-clang-translation-unit.h \
        ctags/ide-ctags-builder.c \
        ctags/ide-ctags-builder.h \
        ctags/ide-ctags-completion-item.c \
@@ -334,7 +315,6 @@ libide_1_0_la_SOURCES = \
 
 libide_1_0_la_includes = \
        $(DEBUG_CFLAGS) \
-       $(CLANG_CFLAGS) \
        -DLIBDIR="\"$(libdir)\"" \
        -I$(top_builddir)/libide \
        -I$(top_srcdir)/contrib/egg \
@@ -344,7 +324,6 @@ libide_1_0_la_includes = \
        -I$(srcdir) \
        -I$(srcdir)/autotools \
        -I$(srcdir)/c \
-       -I$(srcdir)/clang \
        -I$(srcdir)/ctags \
        -I$(srcdir)/directory \
        -I$(srcdir)/doap \
@@ -395,10 +374,8 @@ libide_1_0_la_LDFLAGS = \
        $(NULL)
 
 libide_1_0_la_LIBADD = \
-       $(CLANG_LDFLAGS) \
        $(LIBIDE_LIBS) \
        $(SHM_LIB) \
-       -lclang \
        -lm \
        $(top_builddir)/contrib/egg/libegg.la \
        $(top_builddir)/contrib/libeditorconfig/libeditorconfig.la \
diff --git a/libide/c/ide-c-language.c b/libide/c/ide-c-language.c
index d63a6a2..90a5274 100644
--- a/libide/c/ide-c-language.c
+++ b/libide/c/ide-c-language.c
@@ -23,8 +23,6 @@
 #include "ide-c-format-provider.h"
 #include "ide-c-indenter.h"
 #include "ide-c-language.h"
-#include "ide-clang-completion-provider.h"
-#include "ide-clang-diagnostic-provider.h"
 #include "ide-diagnostician.h"
 #include "ide-extension-point.h"
 #include "ide-internal.h"
@@ -51,8 +49,10 @@ ide_c_language_get_completion_providers (IdeLanguage *language)
   g_return_val_if_fail (IDE_IS_C_LANGUAGE (language), NULL);
 
   providers = IDE_LANGUAGE_CLASS (ide_c_language_parent_class)->get_completion_providers (language);
+#if 0
   providers = g_list_append (providers, g_object_new (IDE_TYPE_C_FORMAT_PROVIDER, NULL));
   providers = g_list_append (providers, g_object_new (IDE_TYPE_CLANG_COMPLETION_PROVIDER, NULL));
+#endif
 
   return providers;
 }
@@ -148,24 +148,11 @@ ide_c_language_initiable_init (GInitable     *initable,
       (g_strcmp0 (id, "cpp") == 0))
     {
       IdeContext *context;
-      IdeDiagnosticProvider *provider;
       g_autofree gchar *path = NULL;
 
       context = ide_object_get_context (IDE_OBJECT (initable));
 
       /*
-       * Create our diagnostician using clang as a backend.
-       */
-      priv->diagnostician = g_object_new (IDE_TYPE_DIAGNOSTICIAN,
-                                          "context", context,
-                                          NULL);
-      provider = g_object_new (IDE_TYPE_CLANG_DIAGNOSTIC_PROVIDER,
-                               "context", context,
-                               NULL);
-      _ide_diagnostician_add_provider (priv->diagnostician, provider);
-      g_clear_object (&provider);
-
-      /*
        * Create our indenter to provide as-you-type indentation.
        *
        * TODO: How can we disambiguate c/c++/obj-c headers?
diff --git a/libide/ctags/ide-ctags-service.c b/libide/ctags/ide-ctags-service.c
index 988e0cf..ad2b76d 100644
--- a/libide/ctags/ide-ctags-service.c
+++ b/libide/ctags/ide-ctags-service.c
@@ -36,7 +36,7 @@
 
 struct _IdeCtagsService
 {
-  IdeService                   parent_instance;
+  IdeObject                    parent_instance;
 
   GtkSourceCompletionProvider *provider;
   IdeHighlighter              *highlighter;
@@ -47,7 +47,10 @@ struct _IdeCtagsService
   guint                        miner_ran : 1;
 };
 
-G_DEFINE_TYPE (IdeCtagsService, ide_ctags_service, IDE_TYPE_SERVICE)
+static void service_iface_init (IdeServiceInterface *iface);
+
+G_DEFINE_TYPE_EXTENDED (IdeCtagsService, ide_ctags_service, IDE_TYPE_OBJECT, 0,
+                        G_IMPLEMENT_INTERFACE (IDE_TYPE_SERVICE, service_iface_init))
 
 static void
 ide_ctags_service_build_index_init_cb (GObject      *object,
@@ -404,16 +407,19 @@ ide_ctags_service_finalize (GObject *object)
 }
 
 static void
+service_iface_init (IdeServiceInterface *iface)
+{
+  iface->start = ide_ctags_service_start;
+  iface->stop = ide_ctags_service_stop;
+}
+
+static void
 ide_ctags_service_class_init (IdeCtagsServiceClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
-  IdeServiceClass *service_class = IDE_SERVICE_CLASS (klass);
 
   object_class->constructed = ide_ctags_service_constructed;
   object_class->finalize = ide_ctags_service_finalize;
-
-  service_class->start = ide_ctags_service_start;
-  service_class->stop = ide_ctags_service_stop;
 }
 
 static void
diff --git a/libide/ctags/ide-ctags-service.h b/libide/ctags/ide-ctags-service.h
index e6bfcd0..5a13d30 100644
--- a/libide/ctags/ide-ctags-service.h
+++ b/libide/ctags/ide-ctags-service.h
@@ -28,7 +28,7 @@ G_BEGIN_DECLS
 
 #define IDE_TYPE_CTAGS_SERVICE (ide_ctags_service_get_type())
 
-G_DECLARE_FINAL_TYPE (IdeCtagsService, ide_ctags_service, IDE, CTAGS_SERVICE, IdeService)
+G_DECLARE_FINAL_TYPE (IdeCtagsService, ide_ctags_service, IDE, CTAGS_SERVICE, IdeObject)
 
 GtkSourceCompletionProvider *ide_ctags_service_get_provider    (IdeCtagsService *self);
 IdeHighlighter              *ide_ctags_service_get_highlighter (IdeCtagsService *self);
diff --git a/libide/gca/ide-gca-diagnostic-provider.c b/libide/gca/ide-gca-diagnostic-provider.c
index e7154d1..0e86938 100644
--- a/libide/gca/ide-gca-diagnostic-provider.c
+++ b/libide/gca/ide-gca-diagnostic-provider.c
@@ -37,7 +37,7 @@
 
 struct _IdeGcaDiagnosticProvider
 {
-  IdeDiagnosticProvider parent_instance;
+  IdeObject parent_instance;
 
   GHashTable *document_cache;
 };
@@ -50,8 +50,11 @@ typedef struct
   gchar          *language_id;
 } DiagnoseState;
 
-G_DEFINE_TYPE (IdeGcaDiagnosticProvider, ide_gca_diagnostic_provider,
-               IDE_TYPE_DIAGNOSTIC_PROVIDER)
+static void diagnostic_provider_init (IdeDiagnosticProviderInterface *iface);
+
+G_DEFINE_TYPE_EXTENDED (IdeGcaDiagnosticProvider, ide_gca_diagnostic_provider, IDE_TYPE_OBJECT, 0,
+                        G_IMPLEMENT_INTERFACE (IDE_TYPE_DIAGNOSTIC_PROVIDER,
+                                               diagnostic_provider_init))
 
 static void
 diagnose_state_free (gpointer data)
@@ -440,20 +443,22 @@ ide_gca_diagnostic_provider_finalize (GObject *object)
 }
 
 static void
+diagnostic_provider_init (IdeDiagnosticProviderInterface *iface)
+{
+  iface->diagnose_async = ide_gca_diagnostic_provider_diagnose_async;
+  iface->diagnose_finish = ide_gca_diagnostic_provider_diagnose_finish;
+}
+
+static void
 ide_gca_diagnostic_provider_class_init (IdeGcaDiagnosticProviderClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
-  IdeDiagnosticProviderClass *provider_class = IDE_DIAGNOSTIC_PROVIDER_CLASS (klass);
 
   object_class->finalize = ide_gca_diagnostic_provider_finalize;
-
-  provider_class->diagnose_async = ide_gca_diagnostic_provider_diagnose_async;
-  provider_class->diagnose_finish = ide_gca_diagnostic_provider_diagnose_finish;
 }
 
 static void
 ide_gca_diagnostic_provider_init (IdeGcaDiagnosticProvider *self)
 {
-  self->document_cache = g_hash_table_new_full (g_str_hash, g_str_equal,
-                                                g_free, g_object_unref);
+  self->document_cache = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
 }
diff --git a/libide/gca/ide-gca-diagnostic-provider.h b/libide/gca/ide-gca-diagnostic-provider.h
index 2bf61f5..169d8fd 100644
--- a/libide/gca/ide-gca-diagnostic-provider.h
+++ b/libide/gca/ide-gca-diagnostic-provider.h
@@ -26,7 +26,8 @@ G_BEGIN_DECLS
 #define IDE_TYPE_GCA_DIAGNOSTIC_PROVIDER (ide_gca_diagnostic_provider_get_type())
 
 G_DECLARE_FINAL_TYPE (IdeGcaDiagnosticProvider, ide_gca_diagnostic_provider,
-                      IDE, GCA_DIAGNOSTIC_PROVIDER, IdeDiagnosticProvider)
+                      IDE, GCA_DIAGNOSTIC_PROVIDER,
+                      IdeObject)
 
 G_END_DECLS
 
diff --git a/libide/gca/ide-gca-service.c b/libide/gca/ide-gca-service.c
index 10b7b3a..dba2588 100644
--- a/libide/gca/ide-gca-service.c
+++ b/libide/gca/ide-gca-service.c
@@ -26,7 +26,7 @@
 
 struct _IdeGcaService
 {
-  IdeService       parent_instance;
+  IdeObject        parent_instance;
 
   gulong           bus_closed_handler;
 
@@ -34,7 +34,8 @@ struct _IdeGcaService
   GHashTable      *proxy_cache;
 };
 
-G_DEFINE_TYPE (IdeGcaService, ide_gca_service, IDE_TYPE_SERVICE)
+G_DEFINE_TYPE_EXTENDED (IdeGcaService, ide_gca_service, IDE_TYPE_OBJECT, 0,
+                        G_IMPLEMENT_INTERFACE (IDE_TYPE_SERVICE, NULL))
 
 static void
 on_bus_closed (GDBusConnection *bus,
diff --git a/libide/gca/ide-gca-service.h b/libide/gca/ide-gca-service.h
index 6c18601..d35a383 100644
--- a/libide/gca/ide-gca-service.h
+++ b/libide/gca/ide-gca-service.h
@@ -27,7 +27,7 @@ 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)
+G_DECLARE_FINAL_TYPE (IdeGcaService, ide_gca_service, IDE, GCA_SERVICE, IdeObject)
 
 void        ide_gca_service_get_proxy_async  (IdeGcaService        *self,
                                               const gchar          *language_id,
diff --git a/libide/ide-buffer.c b/libide/ide-buffer.c
index 0f3559b..61fe8f1 100644
--- a/libide/ide-buffer.c
+++ b/libide/ide-buffer.c
@@ -581,15 +581,12 @@ ide_buffer_reload_highlighter (IdeBuffer *self)
   if (language != NULL)
     {
       const gchar *lang_id;
-      gchar *name;
 
       lang_id = ide_language_get_id (language);
-      name = g_strdup_printf ("org.gnome.builder.highlighter.%s", lang_id);
-      point = ide_extension_point_lookup (name);
-      highlighter = ide_extension_point_create (name,
+      point = ide_extension_point_lookup (IDE_TYPE_HIGHLIGHTER);
+      highlighter = ide_extension_point_create (IDE_TYPE_HIGHLIGHTER, lang_id,
                                                 "context", priv->context,
                                                 NULL);
-      g_free (name);
     }
 
   if (priv->highlight_engine != NULL)
@@ -618,15 +615,12 @@ ide_buffer_reload_symbol_resolver (IdeBuffer *self)
   if (language != NULL)
     {
       const gchar *lang_id;
-      gchar *name;
 
       lang_id = ide_language_get_id (language);
-      name = g_strdup_printf ("org.gnome.builder.symbol-resolver.%s", lang_id);
-      point = ide_extension_point_lookup (name);
-      symbol_resolver = ide_extension_point_create (name,
+      point = ide_extension_point_lookup (IDE_TYPE_SYMBOL_RESOLVER);
+      symbol_resolver = ide_extension_point_create (IDE_TYPE_SYMBOL_RESOLVER, lang_id,
                                                     "context", priv->context,
                                                     NULL);
-      g_free (name);
     }
 
   g_set_object (&priv->symbol_resolver, symbol_resolver);
diff --git a/libide/ide-context.c b/libide/ide-context.c
index 2bc233b..8066f44 100644
--- a/libide/ide-context.c
+++ b/libide/ide-context.c
@@ -521,11 +521,8 @@ ide_context_dispose (GObject *object)
   while (g_hash_table_iter_next (&iter, &key, &value))
     {
       IdeService *service = value;
-
       g_assert (IDE_IS_SERVICE (service));
-
-      if (ide_service_get_running (service))
-        ide_service_stop (service);
+      ide_service_stop (service);
     }
 
   G_OBJECT_CLASS (ide_context_parent_class)->dispose (object);
@@ -1212,9 +1209,8 @@ ide_context_init_services (gpointer             source_object,
   while (g_hash_table_iter_next (&hiter, NULL, &v))
     {
       IdeService *service = v;
-
-      if (!ide_service_get_running (service))
-        ide_service_start (service);
+      g_assert (IDE_IS_SERVICE (service));
+      ide_service_start (service);
     }
 
   g_task_return_boolean (task, TRUE);
diff --git a/libide/ide-diagnostic-provider.c b/libide/ide-diagnostic-provider.c
index 0ca0b69..9b0f9a4 100644
--- a/libide/ide-diagnostic-provider.c
+++ b/libide/ide-diagnostic-provider.c
@@ -19,17 +19,10 @@
 #include "ide-diagnostic-provider.h"
 #include "ide-file.h"
 
-G_DEFINE_ABSTRACT_TYPE (IdeDiagnosticProvider,
-                        ide_diagnostic_provider,
-                        IDE_TYPE_OBJECT)
+G_DEFINE_INTERFACE (IdeDiagnosticProvider, ide_diagnostic_provider, IDE_TYPE_OBJECT)
 
 static void
-ide_diagnostic_provider_class_init (IdeDiagnosticProviderClass *klass)
-{
-}
-
-static void
-ide_diagnostic_provider_init (IdeDiagnosticProvider *self)
+ide_diagnostic_provider_default_init (IdeDiagnosticProviderInterface *iface)
 {
 }
 
@@ -44,8 +37,7 @@ ide_diagnostic_provider_diagnose_async  (IdeDiagnosticProvider *self,
   g_return_if_fail (IDE_IS_FILE (file));
   g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
 
-  if (IDE_DIAGNOSTIC_PROVIDER_GET_CLASS (self)->diagnose_async)
-    IDE_DIAGNOSTIC_PROVIDER_GET_CLASS (self)->diagnose_async (self, file, cancellable, callback, user_data);
+  IDE_DIAGNOSTIC_PROVIDER_GET_IFACE (self)->diagnose_async (self, file, cancellable, callback, user_data);
 }
 
 IdeDiagnostics *
@@ -56,8 +48,5 @@ ide_diagnostic_provider_diagnose_finish (IdeDiagnosticProvider  *self,
   g_return_val_if_fail (IDE_IS_DIAGNOSTIC_PROVIDER (self), NULL);
   g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL);
 
-  if (IDE_DIAGNOSTIC_PROVIDER_GET_CLASS (self)->diagnose_finish)
-    return IDE_DIAGNOSTIC_PROVIDER_GET_CLASS (self)->diagnose_finish (self, result, error);
-
-  return NULL;
+  return IDE_DIAGNOSTIC_PROVIDER_GET_IFACE (self)->diagnose_finish (self, result, error);
 }
diff --git a/libide/ide-diagnostic-provider.h b/libide/ide-diagnostic-provider.h
index ada5ecc..a18ce60 100644
--- a/libide/ide-diagnostic-provider.h
+++ b/libide/ide-diagnostic-provider.h
@@ -25,13 +25,13 @@ G_BEGIN_DECLS
 
 #define IDE_TYPE_DIAGNOSTIC_PROVIDER (ide_diagnostic_provider_get_type())
 
-G_DECLARE_DERIVABLE_TYPE (IdeDiagnosticProvider, ide_diagnostic_provider,
-                          IDE, DIAGNOSTIC_PROVIDER,
-                          IdeObject)
+G_DECLARE_INTERFACE (IdeDiagnosticProvider, ide_diagnostic_provider,
+                     IDE, DIAGNOSTIC_PROVIDER,
+                     IdeObject)
 
-struct _IdeDiagnosticProviderClass
+struct _IdeDiagnosticProviderInterface
 {
-  IdeObjectClass parent;
+  GTypeInterface parent_interface;
 
   void            (*diagnose_async)  (IdeDiagnosticProvider  *self,
                                       IdeFile                *file,
diff --git a/libide/ide-highlighter.c b/libide/ide-highlighter.c
index 9bdbfe1..38ac501 100644
--- a/libide/ide-highlighter.c
+++ b/libide/ide-highlighter.c
@@ -17,6 +17,7 @@
  */
 #include <glib/gi18n.h>
 
+#include "ide-context.h"
 #include "ide-highlighter.h"
 
 G_DEFINE_INTERFACE (IdeHighlighter, ide_highlighter, IDE_TYPE_OBJECT)
@@ -41,6 +42,13 @@ ide_highlighter_default_init (IdeHighlighterInterface *iface)
 {
   iface->set_engine = dummy_set_engine;
   iface->update = dummy_update;
+
+  g_object_interface_install_property (iface,
+                                       g_param_spec_object ("context",
+                                                            "Context",
+                                                            "Context",
+                                                            IDE_TYPE_CONTEXT,
+                                                            (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | 
G_PARAM_STATIC_STRINGS)));
 }
 
 /**
diff --git a/libide/ide-internal.h b/libide/ide-internal.h
index abaf42a..a6a2a6a 100644
--- a/libide/ide-internal.h
+++ b/libide/ide-internal.h
@@ -19,12 +19,10 @@
 #ifndef IDE_PRIVATE_H
 #define IDE_PRIVATE_H
 
-#include <clang-c/Index.h>
 #include <gtksourceview/gtksource.h>
 
 #include "ide-back-forward-item.h"
 #include "ide-back-forward-list.h"
-#include "ide-clang-translation-unit.h"
 #include "ide-diagnostic.h"
 #include "ide-types.h"
 #include "ide-settings.h"
diff --git a/libide/ide-service.c b/libide/ide-service.c
index 2559d9f..c4b2bec 100644
--- a/libide/ide-service.c
+++ b/libide/ide-service.c
@@ -20,19 +20,7 @@
 
 #include "ide-service.h"
 
-typedef struct
-{
-  guint running : 1;
-} IdeServicePrivate;
-
-G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (IdeService, ide_service, IDE_TYPE_OBJECT)
-
-enum {
-  PROP_0,
-  PROP_NAME,
-  PROP_RUNNING,
-  LAST_PROP
-};
+G_DEFINE_INTERFACE (IdeService, ide_service, IDE_TYPE_OBJECT)
 
 enum {
   START,
@@ -40,30 +28,8 @@ enum {
   LAST_SIGNAL
 };
 
-static GParamSpec *gParamSpecs [LAST_PROP];
 static guint gSignals [LAST_SIGNAL];
 
-gboolean
-ide_service_get_running (IdeService *service)
-{
-  IdeServicePrivate *priv = ide_service_get_instance_private (service);
-
-  g_return_val_if_fail (IDE_IS_SERVICE (service), FALSE);
-
-  return priv->running;
-}
-
-const gchar *
-ide_service_get_name (IdeService *service)
-{
-  g_return_val_if_fail (IDE_IS_SERVICE (service), NULL);
-
-  if (IDE_SERVICE_GET_CLASS (service)->get_name)
-    return IDE_SERVICE_GET_CLASS (service)->get_name (service);
-
-  return NULL;
-}
-
 void
 ide_service_start (IdeService *service)
 {
@@ -81,94 +47,23 @@ ide_service_stop (IdeService *service)
 }
 
 static void
-ide_service_real_start (IdeService *service)
-{
-  IdeServicePrivate *priv = ide_service_get_instance_private (service);
-
-  g_return_if_fail (IDE_IS_SERVICE (service));
-
-  priv->running = TRUE;
-}
-
-static void
-ide_service_real_stop (IdeService *service)
-{
-  IdeServicePrivate *priv = ide_service_get_instance_private (service);
-
-  g_return_if_fail (IDE_IS_SERVICE (service));
-
-  priv->running = FALSE;
-}
-
-static void
-ide_service_get_property (GObject    *object,
-                          guint       prop_id,
-                          GValue     *value,
-                          GParamSpec *pspec)
+ide_service_default_init (IdeServiceInterface *iface)
 {
-  IdeService *self = IDE_SERVICE (object);
-
-  switch (prop_id)
-    {
-    case PROP_NAME:
-      g_value_set_string (value, ide_service_get_name (self));
-      break;
-
-    case PROP_RUNNING:
-      g_value_set_boolean (value, ide_service_get_running (self));
-      break;
-
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-    }
-}
-
-static void
-ide_service_class_init (IdeServiceClass *klass)
-{
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-  object_class->get_property = ide_service_get_property;
-
-  klass->start = ide_service_real_start;
-  klass->start = ide_service_real_stop;
-
-  gParamSpecs [PROP_NAME] =
-    g_param_spec_string ("name",
-                         _("Name"),
-                         _("The name of the service."),
-                         NULL,
-                         (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
-
-  gParamSpecs [PROP_RUNNING] =
-    g_param_spec_boolean ("running",
-                          _("Running"),
-                          _("If the service is running."),
-                          FALSE,
-                          (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
-
-  g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs);
-
   gSignals [START] =
     g_signal_new ("start",
-                  G_TYPE_FROM_CLASS (klass),
+                  G_TYPE_FROM_INTERFACE (iface),
                   G_SIGNAL_RUN_LAST,
-                  G_STRUCT_OFFSET (IdeServiceClass, start),
+                  G_STRUCT_OFFSET (IdeServiceInterface, start),
                   NULL, NULL, NULL,
                   G_TYPE_NONE,
                   0);
 
   gSignals [STOP] =
     g_signal_new ("stop",
-                  G_TYPE_FROM_CLASS (klass),
+                  G_TYPE_FROM_INTERFACE (iface),
                   G_SIGNAL_RUN_LAST,
-                  G_STRUCT_OFFSET (IdeServiceClass, stop),
+                  G_STRUCT_OFFSET (IdeServiceInterface, stop),
                   NULL, NULL, NULL,
                   G_TYPE_NONE,
                   0);
 }
-
-static void
-ide_service_init (IdeService *self)
-{
-}
diff --git a/libide/ide-service.h b/libide/ide-service.h
index 7f28287..fcf5659 100644
--- a/libide/ide-service.h
+++ b/libide/ide-service.h
@@ -26,11 +26,11 @@ G_BEGIN_DECLS
 #define IDE_TYPE_SERVICE            (ide_service_get_type())
 #define IDE_SERVICE_EXTENSION_POINT "org.gnome.libide.extensions.service"
 
-G_DECLARE_DERIVABLE_TYPE (IdeService, ide_service, IDE, SERVICE, IdeObject)
+G_DECLARE_INTERFACE (IdeService, ide_service, IDE, SERVICE, IdeObject)
 
-struct _IdeServiceClass
+struct _IdeServiceInterface
 {
-  IdeObjectClass parent;
+  GTypeInterface parent_interface;
 
   const gchar *(*get_name) (IdeService *service);
   void         (*start)    (IdeService *service);
diff --git a/libide/ide-symbol-resolver.c b/libide/ide-symbol-resolver.c
index 3bab6ad..f8c9cef 100644
--- a/libide/ide-symbol-resolver.c
+++ b/libide/ide-symbol-resolver.c
@@ -16,6 +16,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include "ide-context.h"
 #include "ide-file.h"
 #include "ide-symbol-resolver.h"
 
@@ -24,6 +25,12 @@ G_DEFINE_INTERFACE (IdeSymbolResolver, ide_symbol_resolver, IDE_TYPE_OBJECT)
 static void
 ide_symbol_resolver_default_init (IdeSymbolResolverInterface *iface)
 {
+  g_object_interface_install_property (iface,
+                                       g_param_spec_object ("context",
+                                                            "Context",
+                                                            "Context",
+                                                            IDE_TYPE_CONTEXT,
+                                                            (G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | 
G_PARAM_STATIC_STRINGS)));
 }
 
 /**
diff --git a/libide/ide.c b/libide/ide.c
index 98b8bea..bfa1ed0 100644
--- a/libide/ide.c
+++ b/libide/ide.c
@@ -27,9 +27,6 @@
 #include "ide-autotools-build-system.h"
 #include "ide-autotools-project-miner.h"
 #include "ide-c-language.h"
-#include "ide-clang-highlighter.h"
-#include "ide-clang-service.h"
-#include "ide-clang-symbol-resolver.h"
 #include "ide-ctags-highlighter.h"
 #include "ide-ctags-service.h"
 #include "ide-device-provider.h"
@@ -91,8 +88,6 @@ static void
 ide_init_ctor (void)
 {
   GgitFeatureFlags ggit_flags;
-  const gchar *ctags_types[] = { "c", "cpp", "chdr", "python", "js", "css", "html", NULL };
-  gint i;
 
   g_irepository_prepend_search_path (LIBDIR"/gnome-builder/girepository-1.0");
 
@@ -109,42 +104,21 @@ ide_init_ctor (void)
   g_io_extension_point_register (IDE_SERVICE_EXTENSION_POINT);
   g_io_extension_point_register (IDE_VCS_EXTENSION_POINT);
 
-  /*
-   * TODO: These should be moved to plugins.
-   */
-
-  ide_extension_point_implement ("org.gnome.builder.highlighter.xml",
-                                 IDE_TYPE_XML_HIGHLIGHTER,
-                                 0);
-
-  ide_extension_point_implement ("org.gnome.builder.highlighter.c",
-                                 IDE_TYPE_CLANG_HIGHLIGHTER,
-                                 0);
-  ide_extension_point_implement ("org.gnome.builder.highlighter.cpp",
-                                 IDE_TYPE_CLANG_HIGHLIGHTER,
-                                 0);
-  ide_extension_point_implement ("org.gnome.builder.highlighter.chdr",
-                                 IDE_TYPE_CLANG_HIGHLIGHTER,
-                                 0);
-
-  for (i = 0; ctags_types [i]; i++)
-    {
-      gchar *name;
+  ide_extension_point_register (IDE_TYPE_HIGHLIGHTER,
+                                "Highlighter-Languages",
+                                "Highlighter-Priority");
 
-      name = g_strdup_printf ("org.gnome.builder.highlighter.%s", ctags_types [i]);
-      ide_extension_point_implement (name, IDE_TYPE_CTAGS_HIGHLIGHTER, 100);
-      g_free (name);
-    }
+  ide_extension_point_register (GTK_SOURCE_TYPE_COMPLETION_PROVIDER,
+                                "Completion-Languages",
+                                "Completion-Priority");
+
+  ide_extension_point_register (IDE_TYPE_DIAGNOSTIC_PROVIDER,
+                                "Diagnostic-Languages",
+                                "Diagnostic-Priority");
 
-  ide_extension_point_implement ("org.gnome.builder.symbol-resolver.c",
-                                 IDE_TYPE_CLANG_SYMBOL_RESOLVER,
-                                 0);
-  ide_extension_point_implement ("org.gnome.builder.symbol-resolver.cpp",
-                                 IDE_TYPE_CLANG_SYMBOL_RESOLVER,
-                                 0);
-  ide_extension_point_implement ("org.gnome.builder.symbol-resolver.chdr",
-                                 IDE_TYPE_CLANG_SYMBOL_RESOLVER,
-                                 0);
+  ide_extension_point_register (IDE_TYPE_SYMBOL_RESOLVER,
+                                "Symbol-Resolver-Languages",
+                                "Symbol-Resolver-Priority");
 
   g_io_extension_point_implement (IDE_BUILD_SYSTEM_EXTENSION_POINT,
                                   IDE_TYPE_AUTOTOOLS_BUILD_SYSTEM,
@@ -210,10 +184,6 @@ ide_init_ctor (void)
                                   -100);
 
   g_io_extension_point_implement (IDE_SERVICE_EXTENSION_POINT,
-                                  IDE_TYPE_CLANG_SERVICE,
-                                  IDE_SERVICE_EXTENSION_POINT".clang",
-                                  -100);
-  g_io_extension_point_implement (IDE_SERVICE_EXTENSION_POINT,
                                   IDE_TYPE_CTAGS_SERVICE,
                                   IDE_SERVICE_EXTENSION_POINT".ctags",
                                   -100);
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index 370d79d..c8440a3 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -1,4 +1,9 @@
 SUBDIRS = \
+       clang \
+       clang-completion \
+       clang-diagnostics \
+       clang-highlighter \
+       clang-symbol-resolver \
        command-bar \
        devhelp \
        device-manager \
diff --git a/plugins/clang-completion/Makefile.am b/plugins/clang-completion/Makefile.am
new file mode 100644
index 0000000..c62204b
--- /dev/null
+++ b/plugins/clang-completion/Makefile.am
@@ -0,0 +1,31 @@
+plugindir = $(libdir)/gnome-builder/plugins
+plugin_LTLIBRARIES = libgnome-builder-plugin-clang-completion.la
+plugin_DATA = clang-completion.plugin
+
+libgnome_builder_plugin_clang_completion_la_SOURCES = \
+       ide-clang-completion-provider.c \
+       ide-clang-completion-provider.h \
+       $(NULL)
+
+libgnome_builder_plugin_clang_completion_la_CFLAGS = \
+       -I$(top_srcdir)/libide \
+       -I$(top_srcdir)/plugins/clang \
+       $(BUILDER_CFLAGS) \
+       $(DEBUG_CFLAGS) \
+       $(OPTIMIZE_CFLAGS) \
+       $(NULL)
+
+libgnome_builder_plugin_clang_completion_la_LIBADD = \
+       $(BUILDER_LIBS) \
+       $(top_builddir)/plugins/clang/libgnome-builder-plugin-clang.la \
+       $(NULL)
+
+libgnome_builder_plugin_clang_completion_la_LDFLAGS = \
+       $(OPTIMIZE_LDFLAGS) \
+       -avoid-version \
+       -module \
+       $(NULL)
+
+EXTRA_DIST = $(plugin_DATA)
+
+-include $(top_srcdir)/git.mk
diff --git a/plugins/clang-completion/clang-completion.plugin 
b/plugins/clang-completion/clang-completion.plugin
new file mode 100644
index 0000000..835e559
--- /dev/null
+++ b/plugins/clang-completion/clang-completion.plugin
@@ -0,0 +1,11 @@
+[Plugin]
+Module=gnome-builder-plugin-clang-completion
+Name=Clang Completion
+Description=Provides auto-completion for C and C++ using Clang.
+Authors=Christian Hergert <christian hergert me>
+Copyright=Copyright © 2015 Christian Hergert
+Builtin=true
+Hidden=true
+Depends=gnome-builder-plugin-clang
+X-Completion-Languages=c,chdr,cpp
+X-Completion-Priority=100
diff --git a/libide/clang/ide-clang-completion-provider.c 
b/plugins/clang-completion/ide-clang-completion-provider.c
similarity index 94%
rename from libide/clang/ide-clang-completion-provider.c
rename to plugins/clang-completion/ide-clang-completion-provider.c
index 3fe99bb..ae36b68 100644
--- a/libide/clang/ide-clang-completion-provider.c
+++ b/plugins/clang-completion/ide-clang-completion-provider.c
@@ -21,6 +21,7 @@
 #include <devhelp/dh-assistant-view.h>
 #include <devhelp/dh-book-manager.h>
 #include <glib/gi18n.h>
+#include <libpeas/peas.h>
 
 #include "ide-buffer.h"
 #include "ide-clang-completion-item.h"
@@ -56,12 +57,12 @@ typedef struct
 
 static void completion_provider_iface_init (GtkSourceCompletionProviderIface *);
 
-G_DEFINE_TYPE_EXTENDED (IdeClangCompletionProvider,
-                        ide_clang_completion_provider,
-                        G_TYPE_OBJECT,
-                        0,
-                        G_IMPLEMENT_INTERFACE (GTK_SOURCE_TYPE_COMPLETION_PROVIDER,
-                                               completion_provider_iface_init))
+G_DEFINE_DYNAMIC_TYPE_EXTENDED (IdeClangCompletionProvider,
+                                ide_clang_completion_provider,
+                                G_TYPE_OBJECT,
+                                0,
+                                G_IMPLEMENT_INTERFACE (GTK_SOURCE_TYPE_COMPLETION_PROVIDER,
+                                                       completion_provider_iface_init))
 
 static DhBookManager *
 get_book_manager (void)
@@ -204,6 +205,11 @@ ide_clang_completion_provider_class_init (IdeClangCompletionProviderClass *klass
 }
 
 static void
+ide_clang_completion_provider_class_finalize (IdeClangCompletionProviderClass *klass)
+{
+}
+
+static void
 ide_clang_completion_provider_init (IdeClangCompletionProvider *self)
 {
   self->settings = g_settings_new ("org.gnome.builder.code-insight");
@@ -537,3 +543,13 @@ completion_provider_iface_init (GtkSourceCompletionProviderIface *iface)
   iface->update_info = ide_clang_completion_provider_update_info;
   iface->get_priority = ide_clang_completion_provider_get_priority;
 }
+
+void
+peas_register_types (PeasObjectModule *module)
+{
+  ide_clang_completion_provider_register_type (G_TYPE_MODULE (module));
+
+  peas_object_module_register_extension_type (module,
+                                              GTK_SOURCE_TYPE_COMPLETION_PROVIDER,
+                                              IDE_TYPE_CLANG_COMPLETION_PROVIDER);
+}
diff --git a/libide/clang/ide-clang-completion-provider.h 
b/plugins/clang-completion/ide-clang-completion-provider.h
similarity index 100%
rename from libide/clang/ide-clang-completion-provider.h
rename to plugins/clang-completion/ide-clang-completion-provider.h
diff --git a/plugins/clang-diagnostics/Makefile.am b/plugins/clang-diagnostics/Makefile.am
new file mode 100644
index 0000000..33aba23
--- /dev/null
+++ b/plugins/clang-diagnostics/Makefile.am
@@ -0,0 +1,31 @@
+plugindir = $(libdir)/gnome-builder/plugins
+plugin_LTLIBRARIES = libgnome-builder-plugin-clang-diagnostics.la
+plugin_DATA = clang-diagnostics.plugin
+
+libgnome_builder_plugin_clang_diagnostics_la_SOURCES = \
+       ide-clang-diagnostic-provider.c \
+       ide-clang-diagnostic-provider.h \
+       $(NULL)
+
+libgnome_builder_plugin_clang_diagnostics_la_CFLAGS = \
+       -I$(top_srcdir)/libide \
+       -I$(top_srcdir)/plugins/clang \
+       $(BUILDER_CFLAGS) \
+       $(DEBUG_CFLAGS) \
+       $(OPTIMIZE_CFLAGS) \
+       $(NULL)
+
+libgnome_builder_plugin_clang_diagnostics_la_LIBADD = \
+       $(BUILDER_LIBS) \
+       $(top_builddir)/plugins/clang/libgnome-builder-plugin-clang.la \
+       $(NULL)
+
+libgnome_builder_plugin_clang_diagnostics_la_LDFLAGS = \
+       $(OPTIMIZE_LDFLAGS) \
+       -avoid-version \
+       -module \
+       $(NULL)
+
+EXTRA_DIST = $(plugin_DATA)
+
+-include $(top_srcdir)/git.mk
diff --git a/plugins/clang-diagnostics/clang-diagnostics.plugin 
b/plugins/clang-diagnostics/clang-diagnostics.plugin
new file mode 100644
index 0000000..0638cfd
--- /dev/null
+++ b/plugins/clang-diagnostics/clang-diagnostics.plugin
@@ -0,0 +1,11 @@
+[Plugin]
+Module=gnome-builder-plugin-clang-diagnostics
+Name=Clang Diagnostics
+Description=Uses clang to provide diagnostics as you type, such as errors and warnings.
+Authors=Christian Hergert <christian hergert me>
+Copyright=Copyright © 2015 Christian Hergert
+Builtin=true
+Hidden=true
+Depends=gnome-builder-plugin-clang
+X-Diagnostic-Languages=c,chdr,cpp
+X-Diagnostic-Priority=100
diff --git a/libide/clang/ide-clang-diagnostic-provider.c 
b/plugins/clang-diagnostics/ide-clang-diagnostic-provider.c
similarity index 81%
rename from libide/clang/ide-clang-diagnostic-provider.c
rename to plugins/clang-diagnostics/ide-clang-diagnostic-provider.c
index f1121e1..d5ec129 100644
--- a/libide/clang/ide-clang-diagnostic-provider.c
+++ b/plugins/clang-diagnostics/ide-clang-diagnostic-provider.c
@@ -17,6 +17,7 @@
  */
 
 #include <glib/gi18n.h>
+#include <libpeas/peas.h>
 
 #include "ide-clang-diagnostic-provider.h"
 #include "ide-clang-service.h"
@@ -25,8 +26,19 @@
 #include "ide-diagnostics.h"
 #include "ide-file.h"
 
-G_DEFINE_TYPE (IdeClangDiagnosticProvider, ide_clang_diagnostic_provider,
-               IDE_TYPE_DIAGNOSTIC_PROVIDER)
+static void diagnostic_provider_init (IdeDiagnosticProviderInterface *iface);
+
+struct _IdeClangDiagnosticProvider
+{
+  IdeObject parent_instance;
+};
+
+G_DEFINE_DYNAMIC_TYPE_EXTENDED (IdeClangDiagnosticProvider,
+                                ide_clang_diagnostic_provider,
+                                IDE_TYPE_OBJECT,
+                                0,
+                                G_IMPLEMENT_INTERFACE (IDE_TYPE_DIAGNOSTIC_PROVIDER,
+                                                       diagnostic_provider_init))
 
 static void
 get_translation_unit_cb (GObject      *object,
@@ -159,16 +171,33 @@ ide_clang_diagnostic_provider_diagnose_finish (IdeDiagnosticProvider  *provider,
 }
 
 static void
+diagnostic_provider_init (IdeDiagnosticProviderInterface *iface)
+{
+  iface->diagnose_async = ide_clang_diagnostic_provider_diagnose_async;
+  iface->diagnose_finish = ide_clang_diagnostic_provider_diagnose_finish;
+}
+
+static void
 ide_clang_diagnostic_provider_class_init (IdeClangDiagnosticProviderClass *klass)
 {
-  IdeDiagnosticProviderClass *provider_class;
+}
 
-  provider_class = IDE_DIAGNOSTIC_PROVIDER_CLASS (klass);
-  provider_class->diagnose_async = ide_clang_diagnostic_provider_diagnose_async;
-  provider_class->diagnose_finish = ide_clang_diagnostic_provider_diagnose_finish;
+static void
+ide_clang_diagnostic_provider_class_finalize (IdeClangDiagnosticProviderClass *klass)
+{
 }
 
 static void
 ide_clang_diagnostic_provider_init (IdeClangDiagnosticProvider *self)
 {
 }
+
+void
+peas_register_types (PeasObjectModule *module)
+{
+  ide_clang_diagnostic_provider_register_type (G_TYPE_MODULE (module));
+
+  peas_object_module_register_extension_type (module,
+                                              IDE_TYPE_DIAGNOSTIC_PROVIDER,
+                                              IDE_TYPE_CLANG_DIAGNOSTIC_PROVIDER);
+}
diff --git a/libide/clang/ide-clang-diagnostic-provider.h 
b/plugins/clang-diagnostics/ide-clang-diagnostic-provider.h
similarity index 90%
rename from libide/clang/ide-clang-diagnostic-provider.h
rename to plugins/clang-diagnostics/ide-clang-diagnostic-provider.h
index bdb60df..38ee9e3 100644
--- a/libide/clang/ide-clang-diagnostic-provider.h
+++ b/plugins/clang-diagnostics/ide-clang-diagnostic-provider.h
@@ -28,12 +28,7 @@ G_BEGIN_DECLS
 G_DECLARE_FINAL_TYPE (IdeClangDiagnosticProvider,
                       ide_clang_diagnostic_provider,
                       IDE, CLANG_DIAGNOSTIC_PROVIDER,
-                      IdeDiagnosticProvider)
-
-struct _IdeClangDiagnosticProvider
-{
-  IdeDiagnosticProvider parent_instance;
-};
+                      IdeObject)
 
 G_END_DECLS
 
diff --git a/plugins/clang-highlighter/Makefile.am b/plugins/clang-highlighter/Makefile.am
new file mode 100644
index 0000000..51494e7
--- /dev/null
+++ b/plugins/clang-highlighter/Makefile.am
@@ -0,0 +1,32 @@
+plugindir = $(libdir)/gnome-builder/plugins
+plugin_LTLIBRARIES = libgnome-builder-plugin-clang-highlighter.la
+plugin_DATA = clang-highlighter.plugin
+
+libgnome_builder_plugin_clang_highlighter_la_SOURCES = \
+       ide-clang-highlighter.c \
+       ide-clang-highlighter.h \
+       $(NULL)
+
+libgnome_builder_plugin_clang_highlighter_la_CFLAGS = \
+       -I$(top_srcdir)/libide \
+       -I$(top_srcdir)/contrib/egg \
+       -I$(top_srcdir)/plugins/clang \
+       $(BUILDER_CFLAGS) \
+       $(DEBUG_CFLAGS) \
+       $(OPTIMIZE_CFLAGS) \
+       $(NULL)
+
+libgnome_builder_plugin_clang_highlighter_la_LIBADD = \
+       $(BUILDER_LIBS) \
+       $(top_builddir)/plugins/clang/libgnome-builder-plugin-clang.la \
+       $(NULL)
+
+libgnome_builder_plugin_clang_highlighter_la_LDFLAGS = \
+       $(OPTIMIZE_LDFLAGS) \
+       -avoid-version \
+       -module \
+       $(NULL)
+
+EXTRA_DIST = $(plugin_DATA)
+
+-include $(top_srcdir)/git.mk
diff --git a/plugins/clang-highlighter/clang-highlighter.plugin 
b/plugins/clang-highlighter/clang-highlighter.plugin
new file mode 100644
index 0000000..847c41a
--- /dev/null
+++ b/plugins/clang-highlighter/clang-highlighter.plugin
@@ -0,0 +1,11 @@
+[Plugin]
+Module=gnome-builder-plugin-clang-highlighter
+Name=Clang Highlighter
+Description=Provides semantic highlighting for C and C++ using Clang.
+Authors=Christian Hergert <christian hergert me>
+Copyright=Copyright © 2015 Christian Hergert
+Builtin=true
+Hidden=true
+Depends=gnome-builder-plugin-clang
+X-Highlighter-Languages=c,cpp,chdr
+X-Highlighter-Priority=100
diff --git a/libide/clang/ide-clang-highlighter.c b/plugins/clang-highlighter/ide-clang-highlighter.c
similarity index 85%
rename from libide/clang/ide-clang-highlighter.c
rename to plugins/clang-highlighter/ide-clang-highlighter.c
index a311da5..d8c35f1 100644
--- a/libide/clang/ide-clang-highlighter.c
+++ b/plugins/clang-highlighter/ide-clang-highlighter.c
@@ -17,6 +17,8 @@
  */
 
 #include <glib/gi18n.h>
+#include <libpeas/peas.h>
+#include <ide.h>
 
 #include "ide-buffer.h"
 #include "ide-clang-highlighter.h"
@@ -31,9 +33,9 @@ struct _IdeClangHighlighter
 
 static void ide_clang_highlighter_iface_init (IdeHighlighterInterface *iface);
 
-G_DEFINE_TYPE_WITH_CODE (IdeClangHighlighter, ide_clang_highlighter, IDE_TYPE_OBJECT,
-                         G_IMPLEMENT_INTERFACE (IDE_TYPE_HIGHLIGHTER,
-                                                ide_clang_highlighter_iface_init))
+G_DEFINE_DYNAMIC_TYPE_EXTENDED (IdeClangHighlighter, ide_clang_highlighter, IDE_TYPE_OBJECT, 0,
+                                G_IMPLEMENT_INTERFACE (IDE_TYPE_HIGHLIGHTER,
+                                                       ide_clang_highlighter_iface_init))
 
 static inline gboolean
 accepts_char (gunichar ch)
@@ -145,6 +147,11 @@ ide_clang_highlighter_iface_init (IdeHighlighterInterface *iface)
 }
 
 static void
+ide_clang_highlighter_class_finalize (IdeClangHighlighterClass *klass)
+{
+}
+
+static void
 ide_clang_highlighter_class_init (IdeClangHighlighterClass *klass)
 {
 }
@@ -153,3 +160,13 @@ static void
 ide_clang_highlighter_init (IdeClangHighlighter *self)
 {
 }
+
+void
+peas_register_types (PeasObjectModule *module)
+{
+  ide_clang_highlighter_register_type (G_TYPE_MODULE (module));
+
+  peas_object_module_register_extension_type (module,
+                                              IDE_TYPE_HIGHLIGHTER,
+                                              IDE_TYPE_CLANG_HIGHLIGHTER);
+}
diff --git a/libide/clang/ide-clang-highlighter.h b/plugins/clang-highlighter/ide-clang-highlighter.h
similarity index 82%
rename from libide/clang/ide-clang-highlighter.h
rename to plugins/clang-highlighter/ide-clang-highlighter.h
index a58cbf5..40d5e3f 100644
--- a/libide/clang/ide-clang-highlighter.h
+++ b/plugins/clang-highlighter/ide-clang-highlighter.h
@@ -25,11 +25,6 @@ G_BEGIN_DECLS
 
 #define IDE_TYPE_CLANG_HIGHLIGHTER (ide_clang_highlighter_get_type())
 
-#define IDE_CLANG_HIGHLIGHTER_TYPE          "c:type"
-#define IDE_CLANG_HIGHLIGHTER_FUNCTION_NAME "def:function"
-#define IDE_CLANG_HIGHLIGHTER_ENUM_NAME     "def:constant"
-#define IDE_CLANG_HIGHLIGHTER_MACRO_NAME    "c:macro-name"
-
 G_DECLARE_FINAL_TYPE (IdeClangHighlighter, ide_clang_highlighter, IDE, CLANG_HIGHLIGHTER, IdeObject)
 
 G_END_DECLS
diff --git a/plugins/clang-symbol-resolver/Makefile.am b/plugins/clang-symbol-resolver/Makefile.am
new file mode 100644
index 0000000..95ab06b
--- /dev/null
+++ b/plugins/clang-symbol-resolver/Makefile.am
@@ -0,0 +1,31 @@
+plugindir = $(libdir)/gnome-builder/plugins
+plugin_LTLIBRARIES = libgnome-builder-plugin-clang-symbol-resolver.la
+plugin_DATA = clang-symbol-resolver.plugin
+
+libgnome_builder_plugin_clang_symbol_resolver_la_SOURCES = \
+       ide-clang-symbol-resolver.c \
+       ide-clang-symbol-resolver.h \
+       $(NULL)
+
+libgnome_builder_plugin_clang_symbol_resolver_la_CFLAGS = \
+       -I$(top_srcdir)/libide \
+       -I$(top_srcdir)/plugins/clang \
+       $(BUILDER_CFLAGS) \
+       $(DEBUG_CFLAGS) \
+       $(OPTIMIZE_CFLAGS) \
+       $(NULL)
+
+libgnome_builder_plugin_clang_symbol_resolver_la_LIBADD = \
+       $(BUILDER_LIBS) \
+       $(top_builddir)/plugins/clang/libgnome-builder-plugin-clang.la \
+       $(NULL)
+
+libgnome_builder_plugin_clang_symbol_resolver_la_LDFLAGS = \
+       $(OPTIMIZE_LDFLAGS) \
+       -avoid-version \
+       -module \
+       $(NULL)
+
+EXTRA_DIST = $(plugin_DATA)
+
+-include $(top_srcdir)/git.mk
diff --git a/plugins/clang-symbol-resolver/clang-symbol-resolver.plugin 
b/plugins/clang-symbol-resolver/clang-symbol-resolver.plugin
new file mode 100644
index 0000000..8695222
--- /dev/null
+++ b/plugins/clang-symbol-resolver/clang-symbol-resolver.plugin
@@ -0,0 +1,11 @@
+[Plugin]
+Module=gnome-builder-plugin-clang-symbol-resolver
+Name=Clang Symbol Resolver
+Description=Provides symbol resolving using clang.
+Authors=Christian Hergert <christian hergert me>
+Copyright=Copyright © 2015 Christian Hergert
+Builtin=true
+Hidden=true
+Depends=gnome-builder-plugin-clang
+X-Symbol-Resolver-Languages=c,cpp,chdr
+X-Symbol-Resolver-Priority=100
diff --git a/libide/clang/ide-clang-symbol-resolver.c 
b/plugins/clang-symbol-resolver/ide-clang-symbol-resolver.c
similarity index 93%
rename from libide/clang/ide-clang-symbol-resolver.c
rename to plugins/clang-symbol-resolver/ide-clang-symbol-resolver.c
index 6244904..bcf9621 100644
--- a/libide/clang/ide-clang-symbol-resolver.c
+++ b/plugins/clang-symbol-resolver/ide-clang-symbol-resolver.c
@@ -18,6 +18,8 @@
 
 #define G_LOG_DOMAIN "clang-symbol-resolver"
 
+#include <libpeas/peas.h>
+
 #include "ide-context.h"
 #include "ide-clang-service.h"
 #include "ide-clang-symbol-resolver.h"
@@ -33,11 +35,12 @@ struct _IdeClangSymbolResolver
 
 static void symbol_resolver_init (IdeSymbolResolverInterface *iface);
 
-G_DEFINE_TYPE_WITH_CODE (IdeClangSymbolResolver,
-                         ide_clang_symbol_resolver,
-                         IDE_TYPE_OBJECT,
-                         G_IMPLEMENT_INTERFACE (IDE_TYPE_SYMBOL_RESOLVER,
-                                                symbol_resolver_init))
+G_DEFINE_DYNAMIC_TYPE_EXTENDED (IdeClangSymbolResolver,
+                                ide_clang_symbol_resolver,
+                                IDE_TYPE_OBJECT,
+                                0,
+                                G_IMPLEMENT_INTERFACE (IDE_TYPE_SYMBOL_RESOLVER,
+                                                       symbol_resolver_init))
 
 static void
 ide_clang_symbol_resolver_lookup_symbol_cb (GObject      *object,
@@ -343,6 +346,21 @@ ide_clang_symbol_resolver_class_init (IdeClangSymbolResolverClass *klass)
 }
 
 static void
+ide_clang_symbol_resolver_class_finalize (IdeClangSymbolResolverClass *klass)
+{
+}
+
+static void
 ide_clang_symbol_resolver_init (IdeClangSymbolResolver *self)
 {
 }
+
+void
+peas_register_types (PeasObjectModule *module)
+{
+  ide_clang_symbol_resolver_register_type (G_TYPE_MODULE (module));
+
+  peas_object_module_register_extension_type (module,
+                                              IDE_TYPE_SYMBOL_RESOLVER,
+                                              IDE_TYPE_CLANG_SYMBOL_RESOLVER);
+}
diff --git a/libide/clang/ide-clang-symbol-resolver.h 
b/plugins/clang-symbol-resolver/ide-clang-symbol-resolver.h
similarity index 100%
copy from libide/clang/ide-clang-symbol-resolver.h
copy to plugins/clang-symbol-resolver/ide-clang-symbol-resolver.h
diff --git a/plugins/clang/Makefile.am b/plugins/clang/Makefile.am
new file mode 100644
index 0000000..8793995
--- /dev/null
+++ b/plugins/clang/Makefile.am
@@ -0,0 +1,42 @@
+plugindir = $(libdir)/gnome-builder/plugins
+plugin_LTLIBRARIES = libgnome-builder-plugin-clang.la
+plugin_DATA = clang.plugin
+
+libgnome_builder_plugin_clang_la_SOURCES = \
+       gb-clang-plugin.c \
+       ide-clang-completion-item.c \
+       ide-clang-completion-item.h \
+       ide-clang-private.h \
+       ide-clang-service.c \
+       ide-clang-service.h \
+       ide-clang-symbol-node.c \
+       ide-clang-symbol-node.h \
+       ide-clang-symbol-tree.c \
+       ide-clang-symbol-tree.h \
+       ide-clang-translation-unit.c \
+       ide-clang-translation-unit.h \
+       $(NULL)
+
+libgnome_builder_plugin_clang_la_CFLAGS = \
+       -I$(top_srcdir)/libide \
+       -I$(top_srcdir)/contrib/egg \
+       $(BUILDER_CFLAGS) \
+       $(DEBUG_CFLAGS) \
+       $(OPTIMIZE_CFLAGS) \
+       $(NULL)
+
+libgnome_builder_plugin_clang_la_LIBADD = \
+       $(BUILDER_LIBS) \
+       -lclang \
+       $(NULL)
+
+libgnome_builder_plugin_clang_la_LDFLAGS = \
+       $(CLANG_LDFLAGS) \
+       $(OPTIMIZE_LDFLAGS) \
+       -avoid-version \
+       -module \
+       $(NULL)
+
+EXTRA_DIST = $(plugin_DATA)
+
+-include $(top_srcdir)/git.mk
diff --git a/plugins/clang/clang.plugin b/plugins/clang/clang.plugin
new file mode 100644
index 0000000..11afcd7
--- /dev/null
+++ b/plugins/clang/clang.plugin
@@ -0,0 +1,8 @@
+[Plugin]
+Module=gnome-builder-plugin-clang
+Name=Clang
+Description=Provides plumbing for clang integration.
+Authors=Christian Hergert <christian hergert me>
+Copyright=Copyright © 2015 Christian Hergert
+Builtin=true
+Hidden=true
diff --git a/libide/clang/ide-clang-symbol-resolver.h b/plugins/clang/gb-clang-plugin.c
similarity index 58%
rename from libide/clang/ide-clang-symbol-resolver.h
rename to plugins/clang/gb-clang-plugin.c
index 8fef4c5..c1d1716 100644
--- a/libide/clang/ide-clang-symbol-resolver.h
+++ b/plugins/clang/gb-clang-plugin.c
@@ -1,4 +1,4 @@
-/* ide-clang-symbol-resolver.h
+/* gb-clang-plugin.c
  *
  * Copyright (C) 2015 Christian Hergert <christian hergert me>
  *
@@ -16,19 +16,20 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef IDE_CLANG_SYMBOL_RESOLVER_H
-#define IDE_CLANG_SYMBOL_RESOLVER_H
+#include <libpeas/peas.h>
+#include <ide.h>
 
-#include "ide-symbol-resolver.h"
+#include "ide-clang-completion-item.h"
+#include "ide-clang-service.h"
 
-G_BEGIN_DECLS
+void
+peas_register_types (PeasObjectModule *module)
+{
+  peas_object_module_register_extension_type (module,
+                                              IDE_TYPE_SERVICE,
+                                              IDE_TYPE_CLANG_SERVICE);
 
-#define IDE_TYPE_CLANG_SYMBOL_RESOLVER (ide_clang_symbol_resolver_get_type())
-
-G_DECLARE_FINAL_TYPE (IdeClangSymbolResolver, ide_clang_symbol_resolver,
-                      IDE, CLANG_SYMBOL_RESOLVER,
-                      IdeObject)
-
-G_END_DECLS
-
-#endif /* IDE_CLANG_SYMBOL_RESOLVER_H */
+  g_type_ensure (IDE_TYPE_SERVICE);
+  g_type_ensure (IDE_TYPE_CLANG_TRANSLATION_UNIT);
+  g_type_ensure (IDE_TYPE_CLANG_COMPLETION_ITEM);
+}
diff --git a/libide/clang/ide-clang-completion-item.c b/plugins/clang/ide-clang-completion-item.c
similarity index 100%
rename from libide/clang/ide-clang-completion-item.c
rename to plugins/clang/ide-clang-completion-item.c
diff --git a/libide/clang/ide-clang-completion-item.h b/plugins/clang/ide-clang-completion-item.h
similarity index 100%
rename from libide/clang/ide-clang-completion-item.h
rename to plugins/clang/ide-clang-completion-item.h
diff --git a/libide/clang/ide-clang-private.h b/plugins/clang/ide-clang-private.h
similarity index 100%
rename from libide/clang/ide-clang-private.h
rename to plugins/clang/ide-clang-private.h
diff --git a/libide/clang/ide-clang-service.c b/plugins/clang/ide-clang-service.c
similarity index 96%
rename from libide/clang/ide-clang-service.c
rename to plugins/clang/ide-clang-service.c
index b6c035e..0e9c25d 100644
--- a/libide/clang/ide-clang-service.c
+++ b/plugins/clang/ide-clang-service.c
@@ -24,7 +24,6 @@
 #include "egg-counter.h"
 #include "egg-task-cache.h"
 
-#include "ide-clang-highlighter.h"
 #include "ide-build-system.h"
 #include "ide-clang-private.h"
 #include "ide-clang-service.h"
@@ -36,11 +35,16 @@
 #include "ide-unsaved-file.h"
 #include "ide-unsaved-files.h"
 
+#define IDE_CLANG_HIGHLIGHTER_TYPE          "c:type"
+#define IDE_CLANG_HIGHLIGHTER_FUNCTION_NAME "def:function"
+#define IDE_CLANG_HIGHLIGHTER_ENUM_NAME     "def:constant"
+#define IDE_CLANG_HIGHLIGHTER_MACRO_NAME    "c:macro-name"
+
 #define DEFAULT_EVICTION_MSEC (60 * 1000)
 
 struct _IdeClangService
 {
-  IdeService    parent_instance;
+  IdeObject     parent_instance;
 
   CXIndex       index;
   GCancellable *cancellable;
@@ -65,7 +69,10 @@ typedef struct
   const gchar       *filename;
 } IndexRequest;
 
-G_DEFINE_TYPE (IdeClangService, ide_clang_service, IDE_TYPE_SERVICE)
+static void service_iface_init (IdeServiceInterface *iface);
+
+G_DEFINE_TYPE_EXTENDED (IdeClangService, ide_clang_service, IDE_TYPE_OBJECT, 0,
+                        G_IMPLEMENT_INTERFACE (IDE_TYPE_SERVICE, service_iface_init))
 
 EGG_DEFINE_COUNTER (ParseAttempts,
                     "Clang",
@@ -551,8 +558,6 @@ ide_clang_service_start (IdeService *service)
   self->index = clang_createIndex (0, 0);
   clang_CXIndex_setGlobalOptions (self->index,
                                   CXGlobalOpt_ThreadBackgroundPriorityForAll);
-
-  IDE_SERVICE_CLASS (ide_clang_service_parent_class)->start (service);
 }
 
 static void
@@ -565,8 +570,6 @@ ide_clang_service_stop (IdeService *service)
 
   g_cancellable_cancel (self->cancellable);
   g_clear_object (&self->units_cache);
-
-  IDE_SERVICE_CLASS (ide_clang_service_parent_class)->start (service);
 }
 
 static void
@@ -596,16 +599,19 @@ ide_clang_service_finalize (GObject *object)
 }
 
 static void
+service_iface_init (IdeServiceInterface *iface)
+{
+  iface->start = ide_clang_service_start;
+  iface->stop = ide_clang_service_stop;
+}
+
+static void
 ide_clang_service_class_init (IdeClangServiceClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
-  IdeServiceClass *service_class = IDE_SERVICE_CLASS (klass);
 
   object_class->dispose = ide_clang_service_dispose;
   object_class->finalize = ide_clang_service_finalize;
-
-  service_class->start = ide_clang_service_start;
-  service_class->stop = ide_clang_service_stop;
 }
 
 static void
diff --git a/libide/clang/ide-clang-service.h b/plugins/clang/ide-clang-service.h
similarity index 98%
rename from libide/clang/ide-clang-service.h
rename to plugins/clang/ide-clang-service.h
index d9a36b8..ac781fd 100644
--- a/libide/clang/ide-clang-service.h
+++ b/plugins/clang/ide-clang-service.h
@@ -19,15 +19,14 @@
 #ifndef IDE_CLANG_SERVICE_H
 #define IDE_CLANG_SERVICE_H
 
-#include "ide-service.h"
-
 #include "ide-clang-translation-unit.h"
+#include "ide-service.h"
 
 G_BEGIN_DECLS
 
 #define IDE_TYPE_CLANG_SERVICE (ide_clang_service_get_type())
 
-G_DECLARE_FINAL_TYPE (IdeClangService, ide_clang_service, IDE, CLANG_SERVICE, IdeService)
+G_DECLARE_FINAL_TYPE (IdeClangService, ide_clang_service, IDE, CLANG_SERVICE, IdeObject)
 
 void                     ide_clang_service_get_translation_unit_async  (IdeClangService      *self,
                                                                         IdeFile              *file,
diff --git a/libide/clang/ide-clang-symbol-node.c b/plugins/clang/ide-clang-symbol-node.c
similarity index 100%
rename from libide/clang/ide-clang-symbol-node.c
rename to plugins/clang/ide-clang-symbol-node.c
diff --git a/libide/clang/ide-clang-symbol-node.h b/plugins/clang/ide-clang-symbol-node.h
similarity index 100%
rename from libide/clang/ide-clang-symbol-node.h
rename to plugins/clang/ide-clang-symbol-node.h
diff --git a/libide/clang/ide-clang-symbol-tree.c b/plugins/clang/ide-clang-symbol-tree.c
similarity index 100%
rename from libide/clang/ide-clang-symbol-tree.c
rename to plugins/clang/ide-clang-symbol-tree.c
diff --git a/libide/clang/ide-clang-symbol-tree.h b/plugins/clang/ide-clang-symbol-tree.h
similarity index 100%
rename from libide/clang/ide-clang-symbol-tree.h
rename to plugins/clang/ide-clang-symbol-tree.h
diff --git a/libide/clang/ide-clang-translation-unit.c b/plugins/clang/ide-clang-translation-unit.c
similarity index 100%
rename from libide/clang/ide-clang-translation-unit.c
rename to plugins/clang/ide-clang-translation-unit.c
diff --git a/libide/clang/ide-clang-translation-unit.h b/plugins/clang/ide-clang-translation-unit.h
similarity index 100%
rename from libide/clang/ide-clang-translation-unit.h
rename to plugins/clang/ide-clang-translation-unit.h
diff --git a/plugins/symbol-tree/symbol-tree.c b/plugins/symbol-tree/symbol-tree.c
index 54d3c8d..9a4fc5f 100644
--- a/plugins/symbol-tree/symbol-tree.c
+++ b/plugins/symbol-tree/symbol-tree.c
@@ -162,18 +162,15 @@ get_symbol_resolver (IdeLanguage *language)
   IdeSymbolResolver *ret;
   IdeContext *context;
   const gchar *lang_id;
-  gchar *name;
 
   g_assert (IDE_IS_LANGUAGE (language));
 
   context = ide_object_get_context (IDE_OBJECT (language));
 
   lang_id = ide_language_get_id (language);
-  name = g_strdup_printf ("org.gnome.builder.symbol-resolver.%s", lang_id);
-  ret = ide_extension_point_create (name,
+  ret = ide_extension_point_create (IDE_TYPE_SYMBOL_RESOLVER, lang_id,
                                     "context", context,
                                     NULL);
-  g_free (name);
 
   return ret;
 }


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