[gnome-builder/wip/chergert/completion] snippet: reduce parsing and allocations



commit 9bbe16cac6efca2fd419ffe10f4a971229b90c9f
Author: Christian Hergert <chergert redhat com>
Date:   Fri Jun 1 17:51:12 2018 -0700

    snippet: reduce parsing and allocations
    
    This reduces the chances that we make allocations by only using the
    info pointer in the completion proposal, and then parsing the snippet
    on expansion.
    
    Also, by moving the get_comment() to the provider, we can avoid having to
    subclass proposals with so much code.
    
    I think we might want to just use G_TYPE_OBJECT for proposals.

 src/libide/completion/ide-completion-proposal.c    |  27 +-----
 src/libide/completion/ide-completion-proposal.h    |   7 +-
 src/libide/completion/ide-completion-provider.c    |  27 ++++++
 src/libide/completion/ide-completion-provider.h    |   5 +
 src/libide/completion/ide-completion-view.c        |   6 +-
 src/libide/snippets/ide-snippet.c                  |  16 +---
 src/plugins/clang/ide-clang-completion-item.c      |  21 +----
 src/plugins/clang/ide-clang-completion-provider.c  |  14 +++
 src/plugins/snippets/ide-snippet-completion-item.c | 103 +++++++++++++++++++++
 src/plugins/snippets/ide-snippet-completion-item.h |  34 +++++++
 .../snippets/ide-snippet-completion-provider.c     |  30 ++++--
 src/plugins/snippets/ide-snippet-model.c           |  18 +---
 src/plugins/snippets/meson.build                   |   1 +
 13 files changed, 219 insertions(+), 90 deletions(-)
---
diff --git a/src/libide/completion/ide-completion-proposal.c b/src/libide/completion/ide-completion-proposal.c
index 53c875aa7..eb379945b 100644
--- a/src/libide/completion/ide-completion-proposal.c
+++ b/src/libide/completion/ide-completion-proposal.c
@@ -16,13 +16,11 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#define G_LOG_DOMAIN "ide-completion-proposal"
-
 #include "config.h"
 
+#define G_LOG_DOMAIN "ide-completion-proposal"
+
 #include "ide-completion-proposal.h"
-#include "ide-completion-provider.h"
-#include "ide-completion-list-box-row.h"
 
 G_DEFINE_INTERFACE (IdeCompletionProposal, ide_completion_proposal, G_TYPE_OBJECT)
 
@@ -30,24 +28,3 @@ static void
 ide_completion_proposal_default_init (IdeCompletionProposalInterface *iface)
 {
 }
-
-/**
- * ide_completion_proposal_get_comment:
- * @self: a #IdeCompletionProposal
- *
- * Gets the comment for the proposal, if any.
- *
- * Returns: (nullable) (transfer full): a newly allocated string or %NULL
- *
- * Since: 3.30
- */
-gchar *
-ide_completion_proposal_get_comment (IdeCompletionProposal *self)
-{
-  g_return_val_if_fail (IDE_IS_COMPLETION_PROPOSAL (self), NULL);
-
-  if (IDE_COMPLETION_PROPOSAL_GET_IFACE (self)->get_comment)
-    return IDE_COMPLETION_PROPOSAL_GET_IFACE (self)->get_comment (self);
-
-  return NULL;
-}
diff --git a/src/libide/completion/ide-completion-proposal.h b/src/libide/completion/ide-completion-proposal.h
index 0ef415268..f9f0ebda9 100644
--- a/src/libide/completion/ide-completion-proposal.h
+++ b/src/libide/completion/ide-completion-proposal.h
@@ -18,9 +18,8 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <glib-object.h>
 
-#include "ide-completion-types.h"
 #include "ide-version-macros.h"
 
 G_BEGIN_DECLS
@@ -33,10 +32,6 @@ G_DECLARE_INTERFACE (IdeCompletionProposal, ide_completion_proposal, IDE, COMPLE
 struct _IdeCompletionProposalInterface
 {
   GTypeInterface parent_iface;
-
-  gchar *(*get_comment) (IdeCompletionProposal   *self);
 };
 
-gchar *ide_completion_proposal_get_comment (IdeCompletionProposal *self);
-
 G_END_DECLS
diff --git a/src/libide/completion/ide-completion-provider.c b/src/libide/completion/ide-completion-provider.c
index b7c68b91d..f270ebf12 100644
--- a/src/libide/completion/ide-completion-provider.c
+++ b/src/libide/completion/ide-completion-provider.c
@@ -297,3 +297,30 @@ ide_completion_provider_display_proposal (IdeCompletionProvider   *self,
   if (IDE_COMPLETION_PROVIDER_GET_IFACE (self)->display_proposal)
     IDE_COMPLETION_PROVIDER_GET_IFACE (self)->display_proposal (self, row, context, typed_text, proposal);
 }
+
+/**
+ * ide_completion_provider_get_comment:
+ * @self: an #IdeCompletionProvider
+ * @proposal: an #IdeCompletionProposal
+ *
+ * If the completion proposal has a comment, the provider should return
+ * a newly allocated string containing it.
+ *
+ * This is displayed at the bottom of the completion window.
+ *
+ * Returns: (transfer full) (nullable): A new string or %NULL
+ *
+ * Since: 3.30
+ */
+gchar *
+ide_completion_provider_get_comment (IdeCompletionProvider *self,
+                                     IdeCompletionProposal *proposal)
+{
+  g_return_val_if_fail (IDE_IS_COMPLETION_PROVIDER (self), NULL);
+  g_return_val_if_fail (IDE_IS_COMPLETION_PROPOSAL (proposal), NULL);
+
+  if (IDE_COMPLETION_PROVIDER_GET_IFACE (self)->get_comment)
+    return IDE_COMPLETION_PROVIDER_GET_IFACE (self)->get_comment (self, proposal);
+
+  return NULL;
+}
diff --git a/src/libide/completion/ide-completion-provider.h b/src/libide/completion/ide-completion-provider.h
index 3787a150f..a48c60d80 100644
--- a/src/libide/completion/ide-completion-provider.h
+++ b/src/libide/completion/ide-completion-provider.h
@@ -69,6 +69,8 @@ struct _IdeCompletionProviderInterface
   gboolean    (*key_activates)     (IdeCompletionProvider    *self,
                                     IdeCompletionProposal    *proposal,
                                     const GdkEventKey        *key);
+  gchar      *(*get_comment)       (IdeCompletionProvider    *self,
+                                    IdeCompletionProposal    *proposal);
 };
 
 IDE_AVAILABLE_IN_3_30
@@ -111,5 +113,8 @@ IDE_AVAILABLE_IN_3_30
 gboolean    ide_completion_provider_key_activates    (IdeCompletionProvider    *self,
                                                       IdeCompletionProposal    *proposal,
                                                       const GdkEventKey        *key);
+IDE_AVAILABLE_IN_3_30
+gchar      *ide_completion_provider_get_comment      (IdeCompletionProvider    *self,
+                                                      IdeCompletionProposal    *proposal);
 
 G_END_DECLS
diff --git a/src/libide/completion/ide-completion-view.c b/src/libide/completion/ide-completion-view.c
index 9816757c8..36c215b53 100644
--- a/src/libide/completion/ide-completion-view.c
+++ b/src/libide/completion/ide-completion-view.c
@@ -92,16 +92,16 @@ on_notify_proposal_cb (IdeCompletionView    *self,
                        IdeCompletionListBox *list_box)
 {
   g_autoptr(IdeCompletionProposal) proposal = NULL;
+  g_autoptr(IdeCompletionProvider) provider = NULL;
   g_autofree gchar *comment = NULL;
 
   g_assert (IDE_IS_COMPLETION_VIEW (self));
   g_assert (pspec != NULL);
   g_assert (IDE_IS_COMPLETION_LIST_BOX (list_box));
 
-  proposal = ide_completion_list_box_get_proposal (list_box);
+  if (ide_completion_list_box_get_selected (list_box, &provider, &proposal))
+    comment = ide_completion_provider_get_comment (provider, proposal);
 
-  if (proposal != NULL)
-    comment = ide_completion_proposal_get_comment (proposal);
   gtk_label_set_label (self->details, comment);
   gtk_widget_set_visible (GTK_WIDGET (self->details), comment && *comment);
 }
diff --git a/src/libide/snippets/ide-snippet.c b/src/libide/snippets/ide-snippet.c
index 66f3919e0..e1803512a 100644
--- a/src/libide/snippets/ide-snippet.c
+++ b/src/libide/snippets/ide-snippet.c
@@ -75,21 +75,7 @@ enum {
   LAST_PROP
 };
 
-static gchar *
-ide_snippet_get_comment (IdeCompletionProposal *proposal)
-{
-  return g_strdup (IDE_SNIPPET (proposal)->description);
-}
-
-static void
-proposal_iface_init (IdeCompletionProposalInterface *iface)
-{
-  iface->get_comment = ide_snippet_get_comment;
-}
-
-G_DEFINE_TYPE_WITH_CODE (IdeSnippet, ide_snippet, G_TYPE_OBJECT,
-                         G_IMPLEMENT_INTERFACE (IDE_TYPE_COMPLETION_PROPOSAL,
-                                                proposal_iface_init))
+G_DEFINE_TYPE (IdeSnippet, ide_snippet, G_TYPE_OBJECT)
 
 DZL_DEFINE_COUNTER (instances, "Snippets", "N Snippets", "Number of IdeSnippet instances.");
 
diff --git a/src/plugins/clang/ide-clang-completion-item.c b/src/plugins/clang/ide-clang-completion-item.c
index 66ebdcce5..476421d87 100644
--- a/src/plugins/clang/ide-clang-completion-item.c
+++ b/src/plugins/clang/ide-clang-completion-item.c
@@ -23,27 +23,8 @@
 
 #include "ide-clang-completion-item.h"
 
-static gchar *
-ide_clang_completion_item_get_comment (IdeCompletionProposal *proposal)
-{
-  IdeClangCompletionItem *self = (IdeClangCompletionItem *)proposal;
-  g_autoptr(GVariant) result = ide_clang_completion_item_get_result (self);
-  const gchar *str;
-
-  if (g_variant_lookup (result, "comment", "&s", &str))
-    return g_strdup (str);
-
-  return NULL;
-}
-
-static void
-proposal_iface_init (IdeCompletionProposalInterface *iface)
-{
-  iface->get_comment = ide_clang_completion_item_get_comment;
-}
-
 G_DEFINE_TYPE_WITH_CODE (IdeClangCompletionItem, ide_clang_completion_item, G_TYPE_OBJECT,
-                         G_IMPLEMENT_INTERFACE (IDE_TYPE_COMPLETION_PROPOSAL, proposal_iface_init))
+                         G_IMPLEMENT_INTERFACE (IDE_TYPE_COMPLETION_PROPOSAL, NULL))
 
 static void
 ide_clang_completion_item_do_init (IdeClangCompletionItem *self)
diff --git a/src/plugins/clang/ide-clang-completion-provider.c 
b/src/plugins/clang/ide-clang-completion-provider.c
index 7ba3dc3c5..e4bab4a8d 100644
--- a/src/plugins/clang/ide-clang-completion-provider.c
+++ b/src/plugins/clang/ide-clang-completion-provider.c
@@ -274,6 +274,19 @@ ide_clang_completion_provider_display_proposal (IdeCompletionProvider   *provide
   ide_completion_list_box_row_set_center_markup (row, markup);
 }
 
+static gchar *
+ide_clang_completion_provider_get_comment (IdeCompletionProvider *provider,
+                                           IdeCompletionProposal *proposal)
+{
+  IdeClangCompletionItem *item = IDE_CLANG_COMPLETION_ITEM (proposal);
+  g_autoptr(GVariant) result = ide_clang_completion_item_get_result (item);
+  gchar *str = NULL;
+
+  g_variant_lookup (result, "comment", "s", &str);
+
+  return str;
+}
+
 static void
 provider_iface_init (IdeCompletionProviderInterface *iface)
 {
@@ -287,6 +300,7 @@ provider_iface_init (IdeCompletionProviderInterface *iface)
   iface->populate_async = ide_clang_completion_provider_populate_async;
   iface->populate_finish = ide_clang_completion_provider_populate_finish;
   iface->display_proposal = ide_clang_completion_provider_display_proposal;
+  iface->get_comment = ide_clang_completion_provider_get_comment;
 }
 
 G_DEFINE_TYPE_WITH_CODE (IdeClangCompletionProvider, ide_clang_completion_provider, IDE_TYPE_OBJECT,
diff --git a/src/plugins/snippets/ide-snippet-completion-item.c 
b/src/plugins/snippets/ide-snippet-completion-item.c
new file mode 100644
index 000000000..d849e922f
--- /dev/null
+++ b/src/plugins/snippets/ide-snippet-completion-item.c
@@ -0,0 +1,103 @@
+/* ide-snippet-completion-item.c
+ *
+ * Copyright 2018 Christian Hergert <chergert redhat com>
+ *
+ * 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 "config.h"
+
+#define G_LOG_DOMAIN "ide-snippet-completion-item"
+
+#include "ide-snippet-completion-item.h"
+
+struct _IdeSnippetCompletionItem
+{
+  GObject               parent_instance;
+  IdeSnippetStorage    *storage;
+  const IdeSnippetInfo *info;
+};
+
+G_DEFINE_TYPE_WITH_CODE (IdeSnippetCompletionItem, ide_snippet_completion_item, G_TYPE_OBJECT,
+                         G_IMPLEMENT_INTERFACE (IDE_TYPE_COMPLETION_PROPOSAL, NULL))
+
+static void
+ide_snippet_completion_item_finalize (GObject *object)
+{
+  IdeSnippetCompletionItem *self = (IdeSnippetCompletionItem *)object;
+
+  self->info = NULL;
+  g_clear_object (&self->storage);
+
+  G_OBJECT_CLASS (ide_snippet_completion_item_parent_class)->finalize (object);
+}
+
+static void
+ide_snippet_completion_item_class_init (IdeSnippetCompletionItemClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->finalize = ide_snippet_completion_item_finalize;
+}
+
+static void
+ide_snippet_completion_item_init (IdeSnippetCompletionItem *self)
+{
+}
+
+IdeSnippetCompletionItem *
+ide_snippet_completion_item_new (IdeSnippetStorage    *storage,
+                                 const IdeSnippetInfo *info)
+{
+  IdeSnippetCompletionItem *self;
+
+  self = g_object_new (IDE_TYPE_SNIPPET_COMPLETION_ITEM, NULL);
+  self->storage = g_object_ref (storage);
+  self->info = info;
+
+  return self;
+}
+
+IdeSnippet *
+ide_snippet_completion_item_get_snippet (IdeSnippetCompletionItem *self)
+{
+  g_autoptr(IdeSnippetParser) parser = NULL;
+  g_autoptr(GError) error = NULL;
+  GList *items;
+
+  g_return_val_if_fail (IDE_IS_SNIPPET_COMPLETION_ITEM (self), NULL);
+  g_return_val_if_fail (self->info != NULL, NULL);
+  g_return_val_if_fail (self->info->begin != NULL, NULL);
+
+  parser = ide_snippet_parser_new ();
+
+  if (!ide_snippet_parser_load_from_data (parser, self->info->begin, self->info->len, &error))
+    {
+      g_message ("Failed to parse snippet: %s", error->message);
+      return ide_snippet_new (NULL, NULL);
+    }
+
+  if (!(items = ide_snippet_parser_get_snippets (parser)))
+    return ide_snippet_new (NULL, NULL);
+
+  return g_object_ref (items->data);
+}
+
+const IdeSnippetInfo *
+ide_snippet_completion_item_get_info (IdeSnippetCompletionItem *self)
+{
+  g_return_val_if_fail (IDE_IS_SNIPPET_COMPLETION_ITEM (self), NULL);
+
+  return self->info;
+}
diff --git a/src/plugins/snippets/ide-snippet-completion-item.h 
b/src/plugins/snippets/ide-snippet-completion-item.h
new file mode 100644
index 000000000..63226f750
--- /dev/null
+++ b/src/plugins/snippets/ide-snippet-completion-item.h
@@ -0,0 +1,34 @@
+/* ide-snippet-completion-item.h
+ *
+ * Copyright 2018 Christian Hergert <chergert redhat com>
+ *
+ * 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/>.
+ */
+
+#pragma once
+
+#include <ide.h>
+
+G_BEGIN_DECLS
+
+#define IDE_TYPE_SNIPPET_COMPLETION_ITEM (ide_snippet_completion_item_get_type())
+
+G_DECLARE_FINAL_TYPE (IdeSnippetCompletionItem, ide_snippet_completion_item, IDE, SNIPPET_COMPLETION_ITEM, 
GObject)
+
+IdeSnippetCompletionItem *ide_snippet_completion_item_new         (IdeSnippetStorage        *storage,
+                                                                   const IdeSnippetInfo     *info);
+IdeSnippet               *ide_snippet_completion_item_get_snippet (IdeSnippetCompletionItem *self);
+const IdeSnippetInfo     *ide_snippet_completion_item_get_info    (IdeSnippetCompletionItem *self);
+
+G_END_DECLS
diff --git a/src/plugins/snippets/ide-snippet-completion-provider.c 
b/src/plugins/snippets/ide-snippet-completion-provider.c
index b5c5bebf9..f9dabcb60 100644
--- a/src/plugins/snippets/ide-snippet-completion-provider.c
+++ b/src/plugins/snippets/ide-snippet-completion-provider.c
@@ -16,9 +16,12 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include "config.h"
+
 #define G_LOG_DOMAIN "ide-snippet-completion-provider.h"
 
 #include "ide-snippet-completion-provider.h"
+#include "ide-snippet-completion-item.h"
 #include "ide-snippet-model.h"
 
 struct _IdeSnippetCompletionProvider
@@ -161,15 +164,15 @@ ide_snippet_completion_provider_display_proposal (IdeCompletionProvider   *provi
                                                   IdeCompletionProposal   *proposal)
 {
   g_autofree gchar *highlight = NULL;
-  const gchar *trigger;
+  const IdeSnippetInfo *info;
 
   g_assert (IDE_IS_SNIPPET_COMPLETION_PROVIDER (provider));
   g_assert (IDE_IS_COMPLETION_LIST_BOX_ROW (row));
   g_assert (IDE_IS_COMPLETION_CONTEXT (context));
-  g_assert (IDE_IS_SNIPPET (proposal));
+  g_assert (IDE_IS_SNIPPET_COMPLETION_ITEM (proposal));
 
-  trigger = ide_snippet_get_trigger (IDE_SNIPPET (proposal));
-  highlight = ide_completion_item_fuzzy_highlight (trigger, typed_text);
+  info = ide_snippet_completion_item_get_info (IDE_SNIPPET_COMPLETION_ITEM (proposal));
+  highlight = ide_completion_item_fuzzy_highlight (info->name, typed_text);
 
   /* TODO: have jimmac make us a real icon */
   ide_completion_list_box_row_set_icon_name (row, "ui-section-symbolic");
@@ -184,24 +187,38 @@ ide_snippet_completion_provider_activate_proposal (IdeCompletionProvider *provid
                                                    IdeCompletionProposal *proposal,
                                                    const GdkEventKey     *key)
 {
+  g_autoptr(IdeSnippet) snippet = NULL;
   GtkTextIter begin, end;
   GtkTextBuffer *buffer;
   GtkTextView *view;
 
   g_assert (IDE_IS_SNIPPET_COMPLETION_PROVIDER (provider));
   g_assert (IDE_IS_COMPLETION_CONTEXT (context));
-  g_assert (IDE_IS_SNIPPET (proposal));
+  g_assert (IDE_IS_SNIPPET_COMPLETION_ITEM (proposal));
 
   buffer = ide_completion_context_get_buffer (context);
   view = ide_completion_context_get_view (context);
 
+  if (!(snippet = ide_snippet_completion_item_get_snippet (IDE_SNIPPET_COMPLETION_ITEM (proposal))))
+    return;
+
   gtk_text_buffer_begin_user_action (buffer);
   if (ide_completion_context_get_bounds (context, &begin, &end))
     gtk_text_buffer_delete (buffer, &begin, &end);
-  ide_source_view_push_snippet (IDE_SOURCE_VIEW (view), IDE_SNIPPET (proposal), &begin);
+  ide_source_view_push_snippet (IDE_SOURCE_VIEW (view), snippet, &begin);
   gtk_text_buffer_end_user_action (buffer);
 }
 
+static gchar *
+ide_snippet_completion_provider_get_comment (IdeCompletionProvider *provider,
+                                             IdeCompletionProposal *proposal)
+{
+  IdeSnippetCompletionItem *item = IDE_SNIPPET_COMPLETION_ITEM (proposal);
+  const IdeSnippetInfo *info = ide_snippet_completion_item_get_info (item);
+
+  return info ? g_strdup (info->desc) : NULL;
+}
+
 static void
 provider_iface_init (IdeCompletionProviderInterface *iface)
 {
@@ -213,4 +230,5 @@ provider_iface_init (IdeCompletionProviderInterface *iface)
   iface->refilter = ide_snippet_completion_provider_refilter;
   iface->display_proposal = ide_snippet_completion_provider_display_proposal;
   iface->activate_proposal = ide_snippet_completion_provider_activate_proposal;
+  iface->get_comment = ide_snippet_completion_provider_get_comment;
 }
diff --git a/src/plugins/snippets/ide-snippet-model.c b/src/plugins/snippets/ide-snippet-model.c
index a3931a6b3..a02907d5d 100644
--- a/src/plugins/snippets/ide-snippet-model.c
+++ b/src/plugins/snippets/ide-snippet-model.c
@@ -21,6 +21,7 @@
 #define G_LOG_DOMAIN "ide-snippet-model"
 
 #include "ide-snippet-model.h"
+#include "ide-snippet-completion-item.h"
 
 struct _IdeSnippetModel
 {
@@ -135,7 +136,7 @@ ide_snippet_model_set_language (IdeSnippetModel *self,
 static GType
 ide_snippet_model_get_item_type (GListModel *model)
 {
-  return IDE_TYPE_SNIPPET;
+  return IDE_TYPE_SNIPPET_COMPLETION_ITEM;
 }
 
 static guint
@@ -150,20 +151,7 @@ ide_snippet_model_get_item (GListModel *model,
 {
   IdeSnippetModel *self = IDE_SNIPPET_MODEL (model);
   const IdeSnippetInfo *info = g_ptr_array_index (self->items, position);
-  g_autoptr(IdeSnippetParser) parser = ide_snippet_parser_new ();
-  g_autoptr(GError) error = NULL;
-  GList *items;
-
-  if (!ide_snippet_parser_load_from_data (parser, info->begin, info->len, &error))
-    {
-      g_message ("Failed to parse snippet: %s\n", error->message);
-      return ide_snippet_new (NULL, NULL);
-    }
-
-  if (!(items = ide_snippet_parser_get_snippets (parser)))
-    return ide_snippet_new (NULL, NULL);
-
-  return g_object_ref (items->data);
+  return ide_snippet_completion_item_new (self->storage, info);
 }
 
 static void
diff --git a/src/plugins/snippets/meson.build b/src/plugins/snippets/meson.build
index 258cc0659..6b6beaeff 100644
--- a/src/plugins/snippets/meson.build
+++ b/src/plugins/snippets/meson.build
@@ -9,6 +9,7 @@ snippets_resources = gnome.compile_resources(
 snippets_sources = [
   'snippets-plugin.c',
   'ide-snippet-completion-provider.c',
+  'ide-snippet-completion-item.c',
   'ide-snippet-model.c',
 ]
 


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