[gnome-builder/wip/chergert/clang] text-iter: add current symbol helper



commit c10b69d36b7ee9920cb98e27f7bcea1d3aa7c581
Author: Christian Hergert <chergert redhat com>
Date:   Tue May 1 14:53:40 2018 -0700

    text-iter: add current symbol helper

 src/libide/sourceview/ide-completion-provider.c | 22 ++++----------------
 src/libide/sourceview/ide-text-iter.c           | 27 +++++++++++++++++++++++++
 src/libide/sourceview/ide-text-iter.h           |  2 ++
 3 files changed, 33 insertions(+), 18 deletions(-)
---
diff --git a/src/libide/sourceview/ide-completion-provider.c b/src/libide/sourceview/ide-completion-provider.c
index a97ca2432..d42002dc1 100644
--- a/src/libide/sourceview/ide-completion-provider.c
+++ b/src/libide/sourceview/ide-completion-provider.c
@@ -23,6 +23,7 @@
 #include "ide-context.h"
 
 #include "sourceview/ide-completion-provider.h"
+#include "sourceview/ide-text-iter.h"
 
 G_DEFINE_INTERFACE (IdeCompletionProvider, ide_completion_provider, GTK_SOURCE_TYPE_COMPLETION_PROVIDER)
 
@@ -86,29 +87,14 @@ ide_completion_provider_context_in_comment_or_string (GtkSourceCompletionContext
 gchar *
 ide_completion_provider_context_current_word (GtkSourceCompletionContext *context)
 {
-  GtkTextIter end;
-  GtkTextIter begin;
-  gunichar ch = 0;
+  GtkTextIter iter;
 
   g_return_val_if_fail (GTK_SOURCE_IS_COMPLETION_CONTEXT (context), NULL);
 
-  if (!gtk_source_completion_context_get_iter (context, &end))
+  if (!gtk_source_completion_context_get_iter (context, &iter))
     return NULL;
 
-  begin = end;
-
-  do
-    {
-      if (!gtk_text_iter_backward_char (&begin))
-        break;
-      ch = gtk_text_iter_get_char (&begin);
-    }
-  while (g_unichar_isalnum (ch) || (ch == '_'));
-
-  if (ch && !g_unichar_isalnum (ch) && (ch != '_'))
-    gtk_text_iter_forward_char (&begin);
-
-  return gtk_text_iter_get_slice (&begin, &end);
+  return _ide_text_iter_current_symbol (&iter);
 }
 
 void
diff --git a/src/libide/sourceview/ide-text-iter.c b/src/libide/sourceview/ide-text-iter.c
index 409c1720a..c63b3f217 100644
--- a/src/libide/sourceview/ide-text-iter.c
+++ b/src/libide/sourceview/ide-text-iter.c
@@ -928,3 +928,30 @@ _ide_text_iter_find_chars_forward (GtkTextIter *iter,
 
   return FALSE;
 }
+
+static inline gboolean
+is_symbol_char (gunichar ch)
+{
+  return g_unichar_isalnum (ch) || (ch == '_');
+}
+
+gchar *
+_ide_text_iter_current_symbol (const GtkTextIter *iter)
+{
+  GtkTextIter end = *iter;
+  GtkTextIter begin = *iter;
+  gunichar ch = 0;
+
+  do
+    {
+      if (!gtk_text_iter_backward_char (&begin))
+        break;
+      ch = gtk_text_iter_get_char (&begin);
+    }
+  while (is_symbol_char (ch));
+
+  if (ch && !is_symbol_char (ch))
+    gtk_text_iter_forward_char (&begin);
+
+  return gtk_text_iter_get_slice (&begin, &end);
+}
diff --git a/src/libide/sourceview/ide-text-iter.h b/src/libide/sourceview/ide-text-iter.h
index 8d48e1ccc..d7906aee2 100644
--- a/src/libide/sourceview/ide-text-iter.h
+++ b/src/libide/sourceview/ide-text-iter.h
@@ -90,5 +90,7 @@ gboolean _ide_text_iter_find_chars_forward       (GtkTextIter              *iter
                                                   GtkTextIter              *end,
                                                   const gchar              *str,
                                                   gboolean                  only_at_start);
+IDE_AVAILABLE_IN_3_30
+gchar   *_ide_text_iter_current_symbol           (const GtkTextIter        *iter);
 
 G_END_DECLS


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