[gnome-builder/gnome-builder-3-18] clang: add minimal sorting algorithm to completion results.



commit 11d263fd29f6dc40c19ed160512886f2eb80ef7c
Author: Christian Hergert <christian hergert me>
Date:   Sun Sep 27 05:28:33 2015 -0700

    clang: add minimal sorting algorithm to completion results.
    
     - Add 1 to the score for every character
     - Add 1 for every character on haystack that is not the needle.
     - Add 1 for every remaining character after the needle has been
       exhausted.
    
    We can tweak all of these, of course.

 plugins/clang/ide-clang-completion-item-private.h |    7 +++++++
 plugins/clang/ide-clang-completion-provider.c     |   20 ++++++++++++++++++++
 2 files changed, 27 insertions(+), 0 deletions(-)
---
diff --git a/plugins/clang/ide-clang-completion-item-private.h 
b/plugins/clang/ide-clang-completion-item-private.h
index b531291..2946314 100644
--- a/plugins/clang/ide-clang-completion-item-private.h
+++ b/plugins/clang/ide-clang-completion-item-private.h
@@ -36,6 +36,7 @@ struct _IdeClangCompletionItem
 
   guint             index;
   gint              typed_text_index;
+  gint              score : 16;
   guint             initialized : 1;
 
   const gchar      *icon_name;
@@ -60,6 +61,7 @@ ide_clang_completion_item_match (IdeClangCompletionItem *self,
   const gchar *needle = lower_is_ascii;
   const gchar *tmp;
   char ch = *needle;
+  gint score;
 
   if (G_UNLIKELY (haystack == NULL))
     haystack = ide_clang_completion_item_get_typed_text (self);
@@ -76,6 +78,8 @@ ide_clang_completion_item_match (IdeClangCompletionItem *self,
   if (haystack [0] != ch && haystack [1] != ch && haystack [2] != ch && haystack [3] != ch)
     return FALSE;
 
+  self->score = score = 0;
+
   for (; *needle; needle++)
     {
       tmp = strchr (haystack, *needle);
@@ -83,9 +87,12 @@ ide_clang_completion_item_match (IdeClangCompletionItem *self,
         tmp = strchr (haystack, g_ascii_toupper (*needle));
       if (tmp == NULL)
         return FALSE;
+      score += (tmp - haystack);
       haystack = tmp;
     }
 
+  self->score = score + strlen (haystack);
+
   return TRUE;
 }
 
diff --git a/plugins/clang/ide-clang-completion-provider.c b/plugins/clang/ide-clang-completion-provider.c
index 6a851b7..241debd 100644
--- a/plugins/clang/ide-clang-completion-provider.c
+++ b/plugins/clang/ide-clang-completion-provider.c
@@ -85,6 +85,24 @@ ide_clang_completion_state_free (IdeClangCompletionState *state)
   g_slice_free (IdeClangCompletionState, state);
 }
 
+static gint
+sort_by_score (gconstpointer a,
+               gconstpointer b)
+{
+  const IdeClangCompletionItem *cia = a;
+  const IdeClangCompletionItem *cib = b;
+
+  return cia->score - cib->score;
+}
+
+static void
+ide_clang_completion_provider_sort (IdeClangCompletionProvider *self)
+{
+  g_assert (IDE_IS_CLANG_COMPLETION_PROVIDER (self));
+
+  self->head = g_list_sort (self->head, sort_by_score);
+}
+
 static gchar *
 ide_clang_completion_provider_get_name (GtkSourceCompletionProvider *provider)
 {
@@ -328,6 +346,7 @@ ide_clang_completion_provider_code_complete_cb (GObject      *object,
       if (results->len > 0)
         {
           ide_clang_completion_provider_refilter (state->self, results, state->query);
+          ide_clang_completion_provider_sort (state->self);
           gtk_source_completion_context_add_proposals (state->context,
                                                        GTK_SOURCE_COMPLETION_PROVIDER (state->self),
                                                        state->self->head, TRUE);
@@ -479,6 +498,7 @@ ide_clang_completion_provider_populate (GtkSourceCompletionProvider *provider,
        * linked list instead of all items.
        */
       ide_clang_completion_provider_refilter (self, self->last_results, prefix);
+      ide_clang_completion_provider_sort (self);
       gtk_source_completion_context_add_proposals (context, provider, self->head, TRUE);
 
       IDE_EXIT;


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