[gnome-builder] clang: add minimal sorting algorithm to completion results.
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] clang: add minimal sorting algorithm to completion results.
- Date: Sun, 27 Sep 2015 12:28:50 +0000 (UTC)
commit eca331cacd58b1067ea943c796085b415c737ff0
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]