[gnome-builder/wip/chergert/snippets-viewer] snippets: store snippet text with snippet



commit f0e774afb28b7e8ba59e86454a0a220088e4d183
Author: Christian Hergert <christian hergert me>
Date:   Sat Aug 22 13:18:48 2015 -0700

    snippets: store snippet text with snippet
    
    This can be handy to have so that we can visualize the actual snippet text
    to the user in various places (snippet editor for example).
    
    This is definitely complicated by the single snippet reuse in multiple
    languages. But I think if we continue down this path and track where,
    in which file, the snippet originated, we can point users to the correct
    location to edit them.

 libide/ide-source-snippet-parser.c |   31 ++++++++++++++-------
 libide/ide-source-snippet.c        |   46 ++++++++++++++++++++++++++++---
 libide/ide-source-snippet.h        |   53 +++++++++++++++++++-----------------
 3 files changed, 91 insertions(+), 39 deletions(-)
---
diff --git a/libide/ide-source-snippet-parser.c b/libide/ide-source-snippet-parser.c
index 74e146f..76929ee 100644
--- a/libide/ide-source-snippet-parser.c
+++ b/libide/ide-source-snippet-parser.c
@@ -37,12 +37,11 @@ struct _IdeSourceSnippetParser
   gchar   *cur_name;
   gchar   *cur_desc;
   GString *cur_text;
+  GString *snippet_text;
 };
 
-
 G_DEFINE_TYPE (IdeSourceSnippetParser, ide_source_snippet_parser, G_TYPE_OBJECT)
 
-
 IdeSourceSnippetParser *
 ide_source_snippet_parser_new (void)
 {
@@ -74,17 +73,18 @@ ide_source_snippet_parser_store (IdeSourceSnippetParser *parser)
   for (scope_iter = parser->scope; scope_iter; scope_iter = scope_iter->next)
     {
       snippet = ide_source_snippet_new (parser->cur_name, g_strdup(scope_iter->data));
-      ide_source_snippet_set_description(snippet, parser->cur_desc);
+      ide_source_snippet_set_description (snippet, parser->cur_desc);
+      ide_source_snippet_set_snippet_text (snippet, parser->snippet_text->str);
 
       for (chunck_iter = parser->chunks; chunck_iter; chunck_iter = chunck_iter->next)
         {
-        #if 0
+#if 0
           g_printerr ("%s:  Tab: %02d  Link: %02d  Text: %s\n",
                       parser->cur_name,
                       ide_source_snippet_chunk_get_tab_stop (chunck_iter->data),
                       ide_source_snippet_chunk_get_linked_chunk (chunck_iter->data),
                       ide_source_snippet_chunk_get_text (chunck_iter->data));
-        #endif
+#endif
           ide_source_snippet_add_chunk (snippet, chunck_iter->data);
         }
 
@@ -96,22 +96,21 @@ static void
 ide_source_snippet_parser_finish (IdeSourceSnippetParser *parser)
 {
   if (parser->cur_name)
-    {
-      ide_source_snippet_parser_store(parser);
-    }
+    ide_source_snippet_parser_store(parser);
 
   g_clear_pointer (&parser->cur_name, g_free);
 
   g_string_truncate (parser->cur_text, 0);
+  g_string_truncate (parser->snippet_text, 0);
 
   g_list_foreach (parser->chunks, (GFunc) g_object_unref, NULL);
   g_list_free (parser->chunks);
   parser->chunks = NULL;
 
-  g_list_free_full(parser->scope, g_free);
+  g_list_free_full (parser->scope, g_free);
   parser->scope = NULL;
 
-  g_free(parser->cur_desc);
+  g_free (parser->cur_desc);
   parser->cur_desc = NULL;
 }
 
@@ -413,6 +412,8 @@ ide_source_snippet_parser_feed_line (IdeSourceSnippetParser *parser,
                                      gchar                  *basename,
                                      const gchar            *line)
 {
+  const gchar *orig = line;
+
   g_assert (parser);
   g_assert (basename);
   g_assert (line);
@@ -461,6 +462,7 @@ ide_source_snippet_parser_feed_line (IdeSourceSnippetParser *parser,
           break;
         }
 
+    /* Fall through */
     case '-':
       if (parser->cur_text->len || parser->chunks)
         {
@@ -493,6 +495,9 @@ ide_source_snippet_parser_feed_line (IdeSourceSnippetParser *parser,
       g_warning (_("Invalid snippet at line %d: %s"), parser->lineno, line);
       break;
     }
+
+  g_string_append (parser->snippet_text, orig);
+  g_string_append_c (parser->snippet_text, '\n');
 }
 
 gboolean
@@ -569,6 +574,11 @@ ide_source_snippet_parser_finalize (GObject *object)
 
   if (self->cur_text)
     g_string_free (self->cur_text, TRUE);
+  self->cur_text = NULL;
+
+  if (self->snippet_text)
+    g_string_free (self->snippet_text, TRUE);
+  self->snippet_text = NULL;
 
   g_free (self->cur_name);
   self->cur_name = NULL;
@@ -596,6 +606,7 @@ ide_source_snippet_parser_init (IdeSourceSnippetParser *parser)
 {
   parser->lineno = -1;
   parser->cur_text = g_string_new (NULL);
+  parser->snippet_text = g_string_new (NULL);
   parser->scope = NULL;
   parser->cur_desc = NULL;
 }
diff --git a/libide/ide-source-snippet.c b/libide/ide-source-snippet.c
index 90f04a1..e61e3f7 100644
--- a/libide/ide-source-snippet.c
+++ b/libide/ide-source-snippet.c
@@ -38,6 +38,7 @@ struct _IdeSourceSnippet
   gchar                   *trigger;
   gchar                   *language;
   gchar                   *description;
+  gchar                   *snippet_text;
 
   gint                     tab_stop;
   gint                     max_tab_stop;
@@ -49,12 +50,13 @@ struct _IdeSourceSnippet
 enum {
   PROP_0,
   PROP_BUFFER,
+  PROP_DESCRIPTION,
+  PROP_LANGUAGE,
   PROP_MARK_BEGIN,
   PROP_MARK_END,
+  PROP_SNIPPET_TEXT,
   PROP_TAB_STOP,
   PROP_TRIGGER,
-  PROP_LANGUAGE,
-  PROP_DESCRIPTION,
   LAST_PROP
 };
 
@@ -76,6 +78,28 @@ ide_source_snippet_new (const gchar *trigger,
   return ret;
 }
 
+const gchar *
+ide_source_snippet_get_snippet_text (IdeSourceSnippet *self)
+{
+  g_return_val_if_fail (IDE_IS_SOURCE_SNIPPET (self), NULL);
+
+  return self->snippet_text;
+}
+
+void
+ide_source_snippet_set_snippet_text (IdeSourceSnippet *self,
+                                     const gchar      *snippet_text)
+{
+  g_return_if_fail (IDE_IS_SOURCE_SNIPPET (self));
+
+  if (!ide_str_equal0 (snippet_text, self->snippet_text))
+    {
+      g_free (self->snippet_text);
+      self->snippet_text = g_strdup (snippet_text);
+      g_object_notify_by_pspec (G_OBJECT (self), gParamSpecs [PROP_SNIPPET_TEXT]);
+    }
+}
+
 /**
  * ide_source_snippet_copy:
  *
@@ -94,6 +118,7 @@ ide_source_snippet_copy (IdeSourceSnippet *self)
                       "trigger", self->trigger,
                       "language", self->language,
                       "description", self->description,
+                      "snippet-text", self->snippet_text,
                       NULL);
 
   for (i = 0; i < self->chunks->len; i++)
@@ -895,6 +920,10 @@ ide_source_snippet_get_property (GObject    *object,
       g_value_set_string (value, self->description);
       break;
 
+    case PROP_SNIPPET_TEXT:
+      g_value_set_string (value, self->snippet_text);
+      break;
+
     case PROP_TAB_STOP:
       g_value_set_uint (value, self->tab_stop);
       break;
@@ -926,6 +955,10 @@ ide_source_snippet_set_property (GObject      *object,
       ide_source_snippet_set_description (self, g_value_get_string (value));
       break;
 
+    case PROP_SNIPPET_TEXT:
+      ide_source_snippet_set_snippet_text (self, g_value_get_string (value));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -992,15 +1025,20 @@ ide_source_snippet_class_init (IdeSourceSnippetClass *klass)
                       -1,
                       (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
 
+  gParamSpecs [PROP_SNIPPET_TEXT] =
+    g_param_spec_string ("snippet-text",
+                         _("Snippet Text"),
+                         _("The entire snippet text from the source file."),
+                         NULL,
+                         (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
   g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs);
 }
 
 static void
 ide_source_snippet_init (IdeSourceSnippet *self)
 {
-  self->tab_stop = 0;
   self->max_tab_stop = -1;
   self->chunks = g_ptr_array_new_with_free_func (g_object_unref);
   self->runs = g_array_new (FALSE, FALSE, sizeof (gint));
-  self->description = NULL;
 }
diff --git a/libide/ide-source-snippet.h b/libide/ide-source-snippet.h
index 8d679a8..a7c6e28 100644
--- a/libide/ide-source-snippet.h
+++ b/libide/ide-source-snippet.h
@@ -29,31 +29,34 @@ G_BEGIN_DECLS
 
 G_DECLARE_FINAL_TYPE (IdeSourceSnippet, ide_source_snippet, IDE, SOURCE_SNIPPET, GObject)
 
-IdeSourceSnippet        *ide_source_snippet_new             (const gchar           *trigger,
-                                                             const gchar           *language);
-IdeSourceSnippet        *ide_source_snippet_copy            (IdeSourceSnippet      *snippet);
-const gchar             *ide_source_snippet_get_trigger     (IdeSourceSnippet      *snippet);
-void                     ide_source_snippet_set_trigger     (IdeSourceSnippet      *snippet,
-                                                             const gchar           *trigger);
-const gchar             *ide_source_snippet_get_language    (IdeSourceSnippet      *snippet);
-void                     ide_source_snippet_set_language    (IdeSourceSnippet      *snippet,
-                                                             const gchar           *language);
-const gchar             *ide_source_snippet_get_description (IdeSourceSnippet      *snippet);
-void                     ide_source_snippet_set_description (IdeSourceSnippet      *snippet,
-                                                             const gchar           *description);
-void                     ide_source_snippet_add_chunk       (IdeSourceSnippet      *snippet,
-                                                             IdeSourceSnippetChunk *chunk);
-guint                    ide_source_snippet_get_n_chunks    (IdeSourceSnippet      *snippet);
-gint                     ide_source_snippet_get_tab_stop    (IdeSourceSnippet      *snippet);
-IdeSourceSnippetChunk   *ide_source_snippet_get_nth_chunk   (IdeSourceSnippet      *snippet,
-                                                             guint                  n);
-void                     ide_source_snippet_get_chunk_range (IdeSourceSnippet      *snippet,
-                                                             IdeSourceSnippetChunk *chunk,
-                                                             GtkTextIter           *begin,
-                                                             GtkTextIter           *end);
-GtkTextMark             *ide_source_snippet_get_mark_begin  (IdeSourceSnippet      *snippet);
-GtkTextMark             *ide_source_snippet_get_mark_end    (IdeSourceSnippet      *snippet);
-IdeSourceSnippetContext *ide_source_snippet_get_context     (IdeSourceSnippet      *snippet);
+IdeSourceSnippet        *ide_source_snippet_new              (const gchar           *trigger,
+                                                              const gchar           *language);
+IdeSourceSnippet        *ide_source_snippet_copy             (IdeSourceSnippet      *snippet);
+const gchar             *ide_source_snippet_get_trigger      (IdeSourceSnippet      *snippet);
+void                     ide_source_snippet_set_trigger      (IdeSourceSnippet      *snippet,
+                                                              const gchar           *trigger);
+const gchar             *ide_source_snippet_get_language     (IdeSourceSnippet      *snippet);
+void                     ide_source_snippet_set_language     (IdeSourceSnippet      *snippet,
+                                                              const gchar           *language);
+const gchar             *ide_source_snippet_get_description  (IdeSourceSnippet      *snippet);
+void                     ide_source_snippet_set_description  (IdeSourceSnippet      *snippet,
+                                                              const gchar           *description);
+void                     ide_source_snippet_add_chunk        (IdeSourceSnippet      *snippet,
+                                                              IdeSourceSnippetChunk *chunk);
+guint                    ide_source_snippet_get_n_chunks     (IdeSourceSnippet      *snippet);
+gint                     ide_source_snippet_get_tab_stop     (IdeSourceSnippet      *snippet);
+IdeSourceSnippetChunk   *ide_source_snippet_get_nth_chunk    (IdeSourceSnippet      *snippet,
+                                                              guint                  n);
+void                     ide_source_snippet_get_chunk_range  (IdeSourceSnippet      *snippet,
+                                                              IdeSourceSnippetChunk *chunk,
+                                                              GtkTextIter           *begin,
+                                                              GtkTextIter           *end);
+GtkTextMark             *ide_source_snippet_get_mark_begin   (IdeSourceSnippet      *snippet);
+GtkTextMark             *ide_source_snippet_get_mark_end     (IdeSourceSnippet      *snippet);
+IdeSourceSnippetContext *ide_source_snippet_get_context      (IdeSourceSnippet      *snippet);
+const gchar             *ide_source_snippet_get_snippet_text (IdeSourceSnippet      *snippet);
+void                     ide_source_snippet_set_snippet_text (IdeSourceSnippet      *snippet,
+                                                              const gchar           *snippet_text);
 
 G_END_DECLS
 


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