[gnome-builder/auto-indent] auto-indent: try to get proper indent after nested scopes.
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/auto-indent] auto-indent: try to get proper indent after nested scopes.
- Date: Thu, 18 Sep 2014 22:09:41 +0000 (UTC)
commit cbe5710b7d5d0f008befa19a86935fd3014b84ef
Author: Christian Hergert <christian hergert me>
Date: Thu Sep 18 15:09:36 2014 -0700
auto-indent: try to get proper indent after nested scopes.
src/editor/gb-source-auto-indenter-c.c | 57 +++++++++++++++++--------------
1 files changed, 31 insertions(+), 26 deletions(-)
---
diff --git a/src/editor/gb-source-auto-indenter-c.c b/src/editor/gb-source-auto-indenter-c.c
index 54782ae..b394cff 100644
--- a/src/editor/gb-source-auto-indenter-c.c
+++ b/src/editor/gb-source-auto-indenter-c.c
@@ -136,22 +136,12 @@ line_is_space (GtkTextIter *iter)
&begin,
gtk_text_iter_get_line (iter));
- while (!gtk_text_iter_equal (iter, &begin))
+ for (;
+ gtk_text_iter_compare (&begin, iter) < 0;
+ gtk_text_iter_forward_char (&begin))
{
- gunichar ch;
-
- if (!gtk_text_iter_forward_char (&begin))
- break;
-
- ch = gtk_text_iter_get_char (&begin);
-
- switch (ch) {
- case '\t':
- case ' ':
- break;
- default:
+ if (!g_unichar_isspace (gtk_text_iter_get_char (&begin)))
return FALSE;
- }
}
return TRUE;
@@ -297,6 +287,11 @@ gb_source_auto_indenter_c_indent (GbSourceAutoIndenterC *c,
gtk_text_iter_assign (&cur, iter);
/*
+ * Move to before the character just inserted.
+ */
+ gtk_text_iter_backward_char (iter);
+
+ /*
* Create the buffer for our indentation string.
*/
str = g_string_new (NULL);
@@ -306,7 +301,7 @@ gb_source_auto_indenter_c_indent (GbSourceAutoIndenterC *c,
* start by moving back one character to get to the pre-newline insertion
* point.
*/
- if (!g_unichar_isspace (gtk_text_iter_get_char (iter)))
+ if (g_unichar_isspace (gtk_text_iter_get_char (iter)))
if (!gtk_text_iter_backward_find_char (iter, non_space_predicate, NULL, NULL))
GOTO (cleanup);
@@ -345,17 +340,6 @@ gb_source_auto_indenter_c_indent (GbSourceAutoIndenterC *c,
ch = gtk_text_iter_get_char (iter);
/*
- * If we just placed a terminating parenthesis, we need to work our way back
- * to it's match. That way we can peak at what it was and determine
- * indentation from that.
- */
- if (ch == ')' || ch == ']' || ch == '}')
- {
- if (!backward_find_matching_char (iter, ch))
- GOTO (cleanup);
- }
-
- /*
* We are probably in a a function call or parameter list. Let's try to work
* our way back to the opening parenthesis. This should work when the target
* is for, parameter lists, or function arguments.
@@ -389,6 +373,27 @@ gb_source_auto_indenter_c_indent (GbSourceAutoIndenterC *c,
}
/*
+ * If we just ended a scope, we need to look for the matching scope
+ * before it.
+ */
+ if (ch == '}')
+ {
+ if (gtk_text_iter_forward_char (iter))
+ {
+ guint offset = gtk_text_iter_get_line_offset (iter);
+
+ if (backward_find_matching_char (iter, '}'))
+ {
+ offset = gtk_text_iter_get_line_offset (iter);
+ offset += priv->scope_indent;
+ }
+
+ build_indent (c, offset, iter, str);
+ GOTO (cleanup);
+ }
+ }
+
+ /*
* Work our way back to the most recent scope. Then apply our scope
* indentation to that.
*/
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]