[gnome-builder/wip/extensions: 3/4] language: use extension point to get highlighter



commit f45e31f1332320e21503ff041ac3f6d7e0600aad
Author: Christian Hergert <christian hergert me>
Date:   Sat Jun 27 00:10:21 2015 -0700

    language: use extension point to get highlighter
    
    This is just temporary, as we want to drop IdeLanguage altogether. But
    now we can test the extension points even if the usage is non-optimal.

 libide/c/ide-c-language.c     |   49 +++++++++++++++++++++++++++++++++++------
 libide/ide.c                  |   32 ++++++++++++++++++++++++++
 libide/xml/ide-xml-language.c |   14 +++++++++--
 3 files changed, 85 insertions(+), 10 deletions(-)
---
diff --git a/libide/c/ide-c-language.c b/libide/c/ide-c-language.c
index 0d2c38c..343b390 100644
--- a/libide/c/ide-c-language.c
+++ b/libide/c/ide-c-language.c
@@ -18,6 +18,8 @@
 
 #include <glib/gi18n.h>
 
+#include "egg-signal-group.h"
+
 #include "ide-c-format-provider.h"
 #include "ide-c-indenter.h"
 #include "ide-c-language.h"
@@ -26,8 +28,11 @@
 #include "ide-clang-highlighter.h"
 #include "ide-clang-symbol-resolver.h"
 #include "ide-diagnostician.h"
+#include "ide-extension-point.h"
 #include "ide-internal.h"
 
+#define C_HIGHLIGHTER "org.gnome.builder.highlighter.c"
+
 typedef struct
 {
   IdeDiagnostician  *diagnostician;
@@ -35,6 +40,8 @@ typedef struct
   IdeIndenter       *indenter;
   IdeRefactory      *refactory;
   IdeSymbolResolver *symbol_resolver;
+
+  EggSignalGroup    *highlighter_extension_signals;
 } IdeCLanguagePrivate;
 
 static void _g_initable_iface_init (GInitableIface *iface);
@@ -120,11 +127,36 @@ ide_c_language_get_name (IdeLanguage *self)
 }
 
 static void
+highlighter_changed (IdeCLanguage      *self,
+                     IdeExtensionPoint *point)
+{
+  IdeCLanguagePrivate *priv = ide_c_language_get_instance_private (self);
+  IdeContext *context = ide_object_get_context (IDE_OBJECT (self));
+
+  g_clear_object (&priv->highlighter);
+  priv->highlighter = ide_extension_point_create (C_HIGHLIGHTER,
+                                                  "context", context,
+                                                  NULL);
+}
+
+static void
+ide_c_language_constructed (GObject *object)
+{
+  IdeCLanguage *self = (IdeCLanguage *)object;
+
+  highlighter_changed (self, NULL);
+
+  G_OBJECT_CLASS (ide_c_language_parent_class)->constructed (object);
+}
+
+static void
 ide_c_language_dispose (GObject *object)
 {
   IdeCLanguage *self = (IdeCLanguage *)object;
   IdeCLanguagePrivate *priv = ide_c_language_get_instance_private (self);
 
+  g_clear_object (&priv->highlighter_extension_signals);
+  g_clear_object (&priv->highlighter);
   g_clear_object (&priv->diagnostician);
   g_clear_object (&priv->highlighter);
   g_clear_object (&priv->indenter);
@@ -148,12 +180,21 @@ ide_c_language_class_init (IdeCLanguageClass *klass)
   language_class->get_symbol_resolver = ide_c_language_get_symbol_resolver;
   language_class->get_name = ide_c_language_get_name;
 
+  object_class->constructed = ide_c_language_constructed;
   object_class->dispose = ide_c_language_dispose;
 }
 
 static void
 ide_c_language_init (IdeCLanguage *self)
 {
+  IdeCLanguagePrivate *priv = ide_c_language_get_instance_private (self);
+
+  priv->highlighter_extension_signals = egg_signal_group_new (IDE_TYPE_EXTENSION_POINT);
+  egg_signal_group_connect_object (priv->highlighter_extension_signals,
+                                   "changed",
+                                   G_CALLBACK (highlighter_changed),
+                                   self,
+                                   G_CONNECT_SWAPPED);
 }
 
 static gboolean
@@ -176,6 +217,7 @@ ide_c_language_initiable_init (GInitable     *initable,
     {
       IdeContext *context;
       IdeDiagnosticProvider *provider;
+      g_autofree gchar *path = NULL;
 
       context = ide_object_get_context (IDE_OBJECT (initable));
 
@@ -192,13 +234,6 @@ ide_c_language_initiable_init (GInitable     *initable,
       g_clear_object (&provider);
 
       /*
-       * Create our highlighter that will use clang for semantic highlighting.
-       */
-      priv->highlighter = g_object_new (IDE_TYPE_CLANG_HIGHLIGHTER,
-                                        "context", context,
-                                        NULL);
-
-      /*
        * Create our indenter to provide as-you-type indentation.
        *
        * TODO: How can we disambiguate c/c++/obj-c headers?
diff --git a/libide/ide.c b/libide/ide.c
index 383bb64..b4b27ce 100644
--- a/libide/ide.c
+++ b/libide/ide.c
@@ -27,12 +27,15 @@
 #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-ctags-highlighter.h"
 #include "ide-ctags-service.h"
 #include "ide-device-provider.h"
 #include "ide-directory-build-system.h"
 #include "ide-directory-vcs.h"
 #include "ide-editorconfig-file-settings.h"
+#include "ide-extension-point.h"
 #include "ide-file-settings.h"
 #include "ide-gca-service.h"
 #include "ide-git-vcs.h"
@@ -47,6 +50,7 @@
 #include "ide-python-language.h"
 #include "ide-search-provider.h"
 #include "ide-vala-language.h"
+#include "ide-xml-highlighter.h"
 #include "ide-xml-language.h"
 
 #include "modeline-parser.h"
@@ -102,6 +106,34 @@ 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);
+
+  ide_extension_point_implement ("org.gnome.builder.highlighter.c",
+                                 IDE_TYPE_CTAGS_HIGHLIGHTER,
+                                 100);
+  ide_extension_point_implement ("org.gnome.builder.highlighter.cpp",
+                                 IDE_TYPE_CTAGS_HIGHLIGHTER,
+                                 100);
+  ide_extension_point_implement ("org.gnome.builder.highlighter.chdr",
+                                 IDE_TYPE_CTAGS_HIGHLIGHTER,
+                                 100);
+
   g_io_extension_point_implement (IDE_BUILD_SYSTEM_EXTENSION_POINT,
                                   IDE_TYPE_AUTOTOOLS_BUILD_SYSTEM,
                                   IDE_BUILD_SYSTEM_EXTENSION_POINT".autotools",
diff --git a/libide/xml/ide-xml-language.c b/libide/xml/ide-xml-language.c
index 0695539..af6d922 100644
--- a/libide/xml/ide-xml-language.c
+++ b/libide/xml/ide-xml-language.c
@@ -16,6 +16,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include "ide-extension-point.h"
 #include "ide-xml-language.h"
 #include "ide-xml-indenter.h"
 #include "ide-xml-highlighter.h"
@@ -66,9 +67,16 @@ ide_xml_language_get_highlighter (IdeLanguage *language)
       IdeContext *context;
 
       context = ide_object_get_context (IDE_OBJECT (language));
-      self->highlighter = g_object_new (IDE_TYPE_XML_HIGHLIGHTER,
-                                        "context", context,
-                                        NULL);
+
+      /*
+       * TODO: This should all go, once we get rid of IdeLanguage.
+       *       Now that we have access to extension points, we should
+       *       be able to put this into IdeBuffer and (un)hook things
+       *       as plugins are (un)loaded.
+       */
+      self->highlighter = ide_extension_point_create ("org.gnome.builder.highlighter.xml",
+                                                      "context", context,
+                                                      NULL);
     }
 
   return IDE_HIGHLIGHTER (self->highlighter);


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