[gnome-builder/auto-indent] auto-indent: progress on un-indenting braces.
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/auto-indent] auto-indent: progress on un-indenting braces.
- Date: Thu, 18 Sep 2014 21:26:00 +0000 (UTC)
commit 64b27f874a1c00e14257f74918cc687484eb693e
Author: Christian Hergert <christian hergert me>
Date: Thu Sep 18 14:25:55 2014 -0700
auto-indent: progress on un-indenting braces.
src/editor/gb-source-auto-indenter-c.c | 75 +++++++++++++++++++++++++++++++-
1 files changed, 74 insertions(+), 1 deletions(-)
---
diff --git a/src/editor/gb-source-auto-indenter-c.c b/src/editor/gb-source-auto-indenter-c.c
index f9848a3..ae903c0 100644
--- a/src/editor/gb-source-auto-indenter-c.c
+++ b/src/editor/gb-source-auto-indenter-c.c
@@ -106,6 +106,10 @@ backward_find_matching_char (GtkTextIter *iter,
break;
}
+ /*
+ * TODO: Make this skip past comment blocks!
+ */
+
while (gtk_text_iter_backward_char (iter))
{
cur = gtk_text_iter_get_char (iter);
@@ -414,6 +418,26 @@ cleanup:
RETURN (ret);
}
+static gboolean
+line_is_whitespace_until (GtkTextIter *iter)
+{
+ GtkTextIter cur;
+
+ gtk_text_buffer_get_iter_at_line (gtk_text_iter_get_buffer (iter),
+ &cur,
+ gtk_text_iter_get_line (iter));
+
+ for (;
+ gtk_text_iter_compare (&cur, iter) < 0;
+ gtk_text_iter_forward_char (&cur))
+ {
+ if (!g_unichar_isspace (gtk_text_iter_get_char (&cur)))
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
static gchar *
gb_source_auto_indenter_c_maybe_close_comment (GbSourceAutoIndenterC *c,
GtkTextIter *begin,
@@ -447,6 +471,55 @@ gb_source_auto_indenter_c_maybe_close_comment (GbSourceAutoIndenterC *c,
return ret;
}
+static gchar *
+gb_source_auto_indenter_c_maybe_unindent_brace (GbSourceAutoIndenterC *c,
+ GtkTextIter *begin,
+ GtkTextIter *end)
+{
+ GtkTextIter saved;
+ gchar *ret = NULL;
+
+ ENTRY;
+
+ g_return_val_if_fail (GB_IS_SOURCE_AUTO_INDENTER_C (c), NULL);
+ g_return_val_if_fail (begin, NULL);
+ g_return_val_if_fail (end, NULL);
+
+ gtk_text_iter_assign (&saved, begin);
+
+ if (gtk_text_iter_backward_char (begin) &&
+ gtk_text_iter_backward_char (end) &&
+ backward_find_matching_char (begin, '}') &&
+ line_is_whitespace_until (end) &&
+ ((gtk_text_iter_get_offset (begin) + 1) !=
+ gtk_text_iter_get_offset (end)))
+ {
+ GString *str;
+ guint offset;
+
+ offset = gtk_text_iter_get_line_offset (begin);
+ str = g_string_new (NULL);
+ build_indent (c, offset, begin, str);
+ g_string_append_c (str, '}');
+
+ gtk_text_iter_assign (begin, &saved);
+ while (!gtk_text_iter_starts_line (begin))
+ gtk_text_iter_backward_char (begin);
+
+ gtk_text_iter_assign (end, &saved);
+
+ ret = g_string_free (str, FALSE);
+ }
+
+ if (!ret)
+ {
+ gtk_text_iter_assign (begin, &saved);
+ gtk_text_iter_assign (end, &saved);
+ }
+
+ RETURN (ret);
+}
+
static gboolean
gb_source_auto_indenter_c_is_trigger (GbSourceAutoIndenter *indenter,
GdkEventKey *event)
@@ -491,7 +564,7 @@ gb_source_auto_indenter_c_format (GbSourceAutoIndenter *indenter,
/*
* Probably need to unindent this line.
*/
- g_debug ("TODO: unindent the curly brace if needed.");
+ ret = gb_source_auto_indenter_c_maybe_unindent_brace (c, begin, end);
break;
case GDK_KEY_colon:
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]