[anjuta] language-support-cpp-java: bgo #662955 - Autoindent indents next line if previous have a string with
- From: Sebastien Granjoux <sgranjoux src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [anjuta] language-support-cpp-java: bgo #662955 - Autoindent indents next line if previous have a string with
- Date: Sun, 4 Mar 2012 14:33:07 +0000 (UTC)
commit 92225a1724cb27a988169e190ee7343d8ccd1551
Author: SÃbastien Granjoux <seb sfo free fr>
Date: Sun Mar 4 15:32:05 2012 +0100
language-support-cpp-java: bgo #662955 - Autoindent indents next line if previous have a string with double slash
.../cpp-java-indentation.c | 166 ++++++++++----------
1 files changed, 86 insertions(+), 80 deletions(-)
---
diff --git a/plugins/language-support-cpp-java/cpp-java-indentation.c b/plugins/language-support-cpp-java/cpp-java-indentation.c
index ec9141d..2f60668 100644
--- a/plugins/language-support-cpp-java/cpp-java-indentation.c
+++ b/plugins/language-support-cpp-java/cpp-java-indentation.c
@@ -70,7 +70,7 @@ static gboolean
skip_iter_to_newline_head (IAnjutaIterable *iter, gchar ch)
{
gboolean ret_val = FALSE;
-
+
if (ch == '\n')
{
/* Possibly at tail */
@@ -94,7 +94,7 @@ static gboolean
skip_iter_to_newline_tail (IAnjutaIterable *iter, gchar ch)
{
gboolean ret_val = FALSE;
-
+
if (ch == '\r')
{
/* Possibly at head */
@@ -121,7 +121,7 @@ get_line_indentation (IAnjutaEditor *editor, gint line_num)
IAnjutaIterable *line_begin, *line_end;
gchar *line_string, *idx;
gint line_indent = 0;
-
+
line_begin = ianjuta_editor_get_line_begin_position (editor, line_num, NULL);
line_end = ianjuta_editor_get_line_end_position (editor, line_num, NULL);
/*
@@ -134,19 +134,19 @@ get_line_indentation (IAnjutaEditor *editor, gint line_num)
g_object_unref (line_end);
return 0;
}
-
+
line_string = ianjuta_editor_get_text (editor, line_begin, line_end,
NULL);
g_object_unref (line_begin);
g_object_unref (line_end);
-
+
/* DEBUG_PRINT ("line_string = '%s'", line_string); */
-
+
if (!line_string)
return 0;
-
+
idx = line_string;
-
+
/* Find first non-white space */
while (*idx != '\0' && isspace (*idx))
{
@@ -166,10 +166,10 @@ get_line_indentation_string (IAnjutaEditor *editor, gint spaces, gint line_inden
{
gint i;
gchar *indent_string;
-
+
if ((spaces + line_indent_spaces) <= 0)
return NULL;
-
+
if (USE_SPACES_FOR_INDENTATION)
{
indent_string = g_new0 (gchar, spaces + line_indent_spaces + 1);
@@ -181,7 +181,7 @@ get_line_indentation_string (IAnjutaEditor *editor, gint spaces, gint line_inden
gint num_tabs = spaces / TAB_SIZE;
gint num_spaces = spaces % TAB_SIZE;
indent_string = g_new0 (gchar, num_tabs + num_spaces + line_indent_spaces + 1);
-
+
for (i = 0; i < num_tabs; i++)
indent_string[i] = '\t';
for (; i < num_tabs + (num_spaces + line_indent_spaces); i++)
@@ -199,7 +199,7 @@ skip_iter_to_previous_line (IAnjutaEditor *editor, IAnjutaIterable *iter)
{
gboolean found = FALSE;
gchar ch;
-
+
while (ianjuta_iterable_previous (iter, NULL))
{
ch = ianjuta_editor_cell_get_char (IANJUTA_EDITOR_CELL (iter), 0, NULL);
@@ -220,7 +220,7 @@ static gboolean
line_is_continuation (IAnjutaEditor *editor, IAnjutaIterable *iter)
{
int is_continuation = FALSE;
-
+
IAnjutaIterable *new_iter = ianjuta_iterable_clone (iter, NULL);
if (skip_iter_to_previous_line (editor, new_iter))
{
@@ -230,13 +230,13 @@ line_is_continuation (IAnjutaEditor *editor, IAnjutaIterable *iter)
(IANJUTA_EDITOR_CELL (new_iter), 0, NULL);
if (ch == ' ' || ch == '\t')
continue;
-
+
if (ch == '\\')
{
is_continuation = TRUE;
break;
}
-
+
if (iter_is_newline (new_iter, ch))
break;
}
@@ -256,7 +256,7 @@ skip_iter_to_previous_logical_line (IAnjutaEditor *editor,
IAnjutaIterable *iter)
{
gboolean found = TRUE;
-
+
while (line_is_continuation (editor, iter))
{
/*
@@ -285,7 +285,7 @@ line_is_preprocessor (IAnjutaEditor *editor, IAnjutaIterable *iter)
{
gboolean is_preprocessor = FALSE;
IAnjutaIterable *new_iter = ianjuta_iterable_clone (iter, NULL);
-
+
if (skip_iter_to_previous_logical_line (editor, new_iter))
{
/* Forward the newline char and point to line begin of next line */
@@ -296,7 +296,7 @@ line_is_preprocessor (IAnjutaEditor *editor, IAnjutaIterable *iter)
ianjuta_iterable_next (new_iter, NULL);
}
/* else, line is already pointed at first char of the line */
-
+
do
{
gchar ch;
@@ -311,9 +311,9 @@ line_is_preprocessor (IAnjutaEditor *editor, IAnjutaIterable *iter)
break;
}
while (ianjuta_iterable_next (new_iter, NULL));
-
+
g_object_unref (new_iter);
-
+
return is_preprocessor;
}
@@ -331,7 +331,7 @@ skip_preprocessor_lines (IAnjutaEditor *editor, IAnjutaIterable *iter)
gboolean line_found = FALSE;
gboolean preprocessor_found = FALSE;
IAnjutaIterable *new_iter = ianjuta_iterable_clone (iter, NULL);
-
+
do
{
gboolean is_preprocessor = FALSE;
@@ -364,7 +364,7 @@ skip_preprocessor_lines (IAnjutaEditor *editor, IAnjutaIterable *iter)
}
}
while (ianjuta_iterable_next (new_iter, NULL));
-
+
if (is_preprocessor)
{
line_found = skip_iter_to_previous_line (editor, new_iter);
@@ -382,7 +382,7 @@ skip_preprocessor_lines (IAnjutaEditor *editor, IAnjutaIterable *iter)
}
}
while (line_found);
-
+
g_object_unref (new_iter);
return preprocessor_found;
}
@@ -394,28 +394,28 @@ set_line_indentation (IAnjutaEditor *editor, gint line_num, gint indentation, gi
IAnjutaIterable *current_pos;
gint carat_offset, nchars = 0, nchars_removed = 0;
gchar *old_indent_string = NULL, *indent_string = NULL;
-
+
/* DEBUG_PRINT ("In %s()", __FUNCTION__); */
line_begin = ianjuta_editor_get_line_begin_position (editor, line_num, NULL);
line_end = ianjuta_editor_get_line_end_position (editor, line_num, NULL);
-
+
/*
DEBUG_PRINT ("line begin = %d, line end = %d, current_pos = %d",
line_begin, line_end, current_pos);
*/
indent_position = ianjuta_iterable_clone (line_begin, NULL);
-
+
if (ianjuta_iterable_compare (line_end, line_begin, NULL) > 0)
{
gchar *idx;
gchar *line_string = ianjuta_editor_get_text (editor, line_begin,
line_end, NULL);
-
+
//DEBUG_PRINT ("line_string = '%s'", line_string);
if (line_string)
{
idx = line_string;
-
+
/* Find first non-white space */
while (*idx != '\0' && isspace (*idx))
{
@@ -432,13 +432,13 @@ set_line_indentation (IAnjutaEditor *editor, gint line_num, gint indentation, gi
current_pos = ianjuta_editor_get_position (editor, NULL);
carat_offset = ianjuta_iterable_diff (indent_position, current_pos, NULL);
//DEBUG_PRINT ("carat offset is = %d", carat_offset);
-
+
/* Set new indentation */
if ((indentation + line_indent_spaces) > 0)
{
indent_string = get_line_indentation_string (editor, indentation, line_indent_spaces);
nchars = indent_string ? g_utf8_strlen (indent_string, -1) : 0;
-
+
/* Only indent if there is something to indent with */
if (indent_string)
{
@@ -448,11 +448,11 @@ set_line_indentation (IAnjutaEditor *editor, gint line_num, gint indentation, gi
old_indent_string =
ianjuta_editor_get_text (editor, line_begin,
indent_position, NULL);
-
+
//DEBUG_PRINT ("old_indent_string = '%s'", old_indent_string);
nchars_removed = g_utf8_strlen (old_indent_string, -1);
}
-
+
/* Only indent if there was no indentation before or old
* indentation string was different from the new indent string
*/
@@ -463,14 +463,14 @@ set_line_indentation (IAnjutaEditor *editor, gint line_num, gint indentation, gi
if (old_indent_string)
ianjuta_editor_erase (editor, line_begin,
indent_position, NULL);
-
+
/* Insert the new indentation string */
ianjuta_editor_insert (editor, line_begin,
indent_string, -1, NULL);
}
}
}
-
+
/* If indentation == 0, we really didn't enter the previous code block,
* but we may need to clear existing indentation.
*/
@@ -487,7 +487,7 @@ set_line_indentation (IAnjutaEditor *editor, gint line_num, gint indentation, gi
if (old_indent_string)
ianjuta_editor_erase (editor, line_begin, indent_position, NULL);
}
-
+
/* Restore current position */
if (carat_offset >= 0)
{
@@ -523,7 +523,7 @@ set_line_indentation (IAnjutaEditor *editor, gint line_num, gint indentation, gi
g_object_unref (indent_position);
g_object_unref (line_begin);
g_object_unref (line_end);
-
+
g_free (old_indent_string);
g_free (indent_string);
return nchars;
@@ -558,16 +558,16 @@ get_line_indentation_base (CppJavaPlugin *plugin,
*incomplete_statement = -1;
*line_indent_spaces = 0;
-
+
if (line_num <= 1)
return 0;
-
+
/* DEBUG_PRINT ("In %s()", __FUNCTION__); */
-
+
iter = ianjuta_editor_get_line_begin_position (editor, line_num, NULL);
-
+
current_line_is_preprocessor = line_is_preprocessor (editor, iter);
- current_line_is_continuation =
+ current_line_is_continuation =
line_is_continuation (editor, iter);
/*
DEBUG_PRINT ("Current line is preprocessor = %d",
@@ -576,7 +576,7 @@ get_line_indentation_base (CppJavaPlugin *plugin,
current_line_is_continuation);
*/
/* line_indent = get_line_indentation (editor, line_num - 1); */
-
+
if (current_line_is_preprocessor && current_line_is_continuation)
{
/* Continuation of preprocessor line -- just maintain indentation */
@@ -589,7 +589,7 @@ get_line_indentation_base (CppJavaPlugin *plugin,
g_object_unref (iter);
return 0;
}
-
+
while (ianjuta_iterable_previous (iter, NULL))
{
/* Skip strings */
@@ -597,12 +597,12 @@ get_line_indentation_base (CppJavaPlugin *plugin,
ianjuta_editor_cell_get_attribute (IANJUTA_EDITOR_CELL (iter), NULL);
if (attrib == IANJUTA_EDITOR_STRING)
continue;
-
+
point_ch = ianjuta_editor_cell_get_char (IANJUTA_EDITOR_CELL (iter), 0,
NULL);
/* DEBUG_PRINT("point_ch = %c", point_ch); */
-
+
/* Check for line comment comment */
if (!line_checked_for_comment && !isspace(point_ch))
{
@@ -611,8 +611,14 @@ get_line_indentation_base (CppJavaPlugin *plugin,
do
{
gchar c;
+
+ /* Skip strings */
+ if (ianjuta_editor_cell_get_attribute (IANJUTA_EDITOR_CELL (new_iter), NULL) == IANJUTA_EDITOR_STRING)
+ continue;
+
c = ianjuta_editor_cell_get_char (IANJUTA_EDITOR_CELL (new_iter), 0,
NULL);
+
if (iter_is_newline (new_iter, c))
{
line_checked_for_comment = TRUE;
@@ -664,22 +670,22 @@ get_line_indentation_base (CppJavaPlugin *plugin,
if (c == '*')
{
IAnjutaIterable* prev = ianjuta_iterable_clone (new_iter, NULL);
- IAnjutaIterable* next = ianjuta_iterable_clone (new_iter, NULL);
+ IAnjutaIterable* next = ianjuta_iterable_clone (new_iter, NULL);
ianjuta_iterable_previous (prev, NULL);
ianjuta_iterable_next (next, NULL);
gchar prev_c = ianjuta_editor_cell_get_char (IANJUTA_EDITOR_CELL (prev), 0,
NULL);
gchar next_c = ianjuta_editor_cell_get_char (IANJUTA_EDITOR_CELL (next), 0,
- NULL);
+ NULL);
if (prev_c == '/')
- {
+ {
/* starts comment */
comment = TRUE;
if (!comment_end)
{
extra_indent++;
- /* If a multiline comment is continuing, check the next line and insert " * "
+ /* If a multiline comment is continuing, check the next line and insert " * "
* only if it does not already exist there. The purpose of this fix is to avoid
* extra " * " on auto-indent. */
@@ -693,7 +699,7 @@ get_line_indentation_base (CppJavaPlugin *plugin,
* if the statement is incomplete
*/
*incomplete_statement = -1;
-
+
/* ":" have to be ignored inside comments */
if (*colon_indent)
{
@@ -704,7 +710,7 @@ get_line_indentation_base (CppJavaPlugin *plugin,
g_object_unref (prev);
g_object_unref (next);
break;
-
+
}
else if (next_c == '/')
{
@@ -754,16 +760,16 @@ get_line_indentation_base (CppJavaPlugin *plugin,
if (point_ch == ')' || point_ch == ']' || point_ch == '}')
{
gint line_saved;
-
+
line_saved = ianjuta_editor_get_line_from_position (editor, iter,
NULL);
-
+
/* If we encounter a block-end before anything else, the
* statement could hardly be incomplte.
*/
if (point_ch == '}' && *incomplete_statement == -1)
*incomplete_statement = 0;
-
+
/* If at level 0 indentation, encoutered a
* block end, don't bother going further
*/
@@ -773,7 +779,7 @@ get_line_indentation_base (CppJavaPlugin *plugin,
line_indent += extra_indent;
break;
}
-
+
/* Find matching brace and continue */
if (!cpp_java_util_jump_to_matching_brace (iter, point_ch, -1))
{
@@ -790,13 +796,13 @@ get_line_indentation_base (CppJavaPlugin *plugin,
/* Increase line indentation */
line_indent += INDENT_SIZE;
line_indent += extra_indent;
-
+
/* If we encounter a block-start before anything else, the
* statement could hardly be incomplte.
*/
if (point_ch == '{' && *incomplete_statement == -1)
*incomplete_statement = 0;
-
+
break;
}
else if (point_ch == '(' || point_ch == '[')
@@ -832,7 +838,7 @@ get_line_indentation_base (CppJavaPlugin *plugin,
(*line_indent_spaces) += g_settings_get_int (plugin->settings,
PREF_INDENT_PARANTHESE_SIZE);
}
-
+
/* Although statement is incomplete at this point, we don't
* set it to incomplete and just leave it to unknown to avaoid
* increating indentation for it, because incomplete braces,
@@ -860,7 +866,7 @@ get_line_indentation_base (CppJavaPlugin *plugin,
IAnjutaIterable* line_begin;
gboolean indent = FALSE;
gchar c;
-
+
/* Is the last non-whitespace in line */
while (ianjuta_iterable_next (new_iter, NULL))
{
@@ -891,11 +897,11 @@ get_line_indentation_base (CppJavaPlugin *plugin,
}
g_object_unref (new_iter);
g_object_unref (line_begin);
- }
+ }
else if (iter_is_newline (iter, point_ch))
{
skip_iter_to_newline_head (iter, point_ch);
-
+
/* We just crossed a line boundary. Skip any preprocessor lines,
* and ensure that line_indent is updated with correct real
* previous non-preprocessor line.
@@ -910,9 +916,9 @@ get_line_indentation_base (CppJavaPlugin *plugin,
}
looking_at_just_next_line = FALSE;
line_checked_for_comment = FALSE;
- }
+ }
else if (!isspace (point_ch))
- {
+ {
/* If we encounter any non-whitespace char before any of the
* statement-complete indicators, the statement is basically
* incomplete
@@ -926,7 +932,7 @@ get_line_indentation_base (CppJavaPlugin *plugin,
line_indent += extra_indent;
}
g_object_unref (iter);
-
+
return line_indent;
}
@@ -937,7 +943,7 @@ static gboolean
is_iter_inside_string (IAnjutaIterable *iter)
{
IAnjutaEditorAttribute attrib;
-
+
attrib = ianjuta_editor_cell_get_attribute (IANJUTA_EDITOR_CELL (iter),
NULL);
/* Check if we are *inside* string. Begining
@@ -978,7 +984,7 @@ spaces_only (IAnjutaEditor* editor, IAnjutaIterable* begin, IAnjutaIterable* end
if (text == NULL)
return TRUE;
-
+
for (idx = text; *idx != '\0'; idx++)
{
@@ -1001,14 +1007,14 @@ get_line_auto_indentation (CppJavaPlugin *plugin, IAnjutaEditor *editor,
gint line_indent = 0;
gint incomplete_statement = -1;
gboolean colon_indent = FALSE;
-
+
g_return_val_if_fail (line > 0, 0);
/* be sure to set a default if we're in the first line otherwise
* the pointer'll be left hanging with no value.
*/
*line_indent_spaces = 0;
-
+
if (line == 1) /* First line */
{
return 0;
@@ -1025,7 +1031,7 @@ get_line_auto_indentation (CppJavaPlugin *plugin, IAnjutaEditor *editor,
g_object_unref (begin);
g_object_unref (end);
}
-
+
iter = ianjuta_editor_get_line_begin_position (editor, line, NULL);
if (is_iter_inside_string (iter))
@@ -1035,7 +1041,7 @@ get_line_auto_indentation (CppJavaPlugin *plugin, IAnjutaEditor *editor,
else
{
line_indent = get_line_indentation_base (plugin, editor, line,
- &incomplete_statement,
+ &incomplete_statement,
line_indent_spaces,
&colon_indent);
}
@@ -1061,7 +1067,7 @@ get_line_auto_indentation (CppJavaPlugin *plugin, IAnjutaEditor *editor,
}
g_object_unref (end_iter);
}
-
+
/* Determine what the first non-white char in the line is */
do
{
@@ -1080,13 +1086,13 @@ get_line_auto_indentation (CppJavaPlugin *plugin, IAnjutaEditor *editor,
if (iter_is_newline (iter, ch))
{
skip_iter_to_newline_tail (iter, ch);
-
+
/* First levels are excused from incomplete statement indent */
if (incomplete_statement == 1 && line_indent > 0)
line_indent += INDENT_SIZE;
break;
}
-
+
if (ch == '{')
{
if (line_indent > 0)
@@ -1131,7 +1137,7 @@ get_line_auto_indentation (CppJavaPlugin *plugin, IAnjutaEditor *editor,
}
while (ianjuta_iterable_next (iter, NULL));
g_object_unref (iter);
-
+
return line_indent;
}
@@ -1162,7 +1168,7 @@ cpp_indentation (IAnjutaEditor *editor,
if (plugin->smart_indentation)
{
- /* DEBUG_PRINT ("Char added at position %d: '%c'", insert_pos, ch); */
+ /* DEBUG_PRINT ("Char added at position %d: '%c'", insert_pos, ch); */
if (iter_is_newline (iter, ch))
{
@@ -1241,15 +1247,15 @@ cpp_indentation (IAnjutaEditor *editor,
ianjuta_iterable_next (iter, NULL);
switch (ch)
{
- case '[':
+ case '[':
insert_editor_blocked (editor, iter,
"]", plugin);
break;
- case '(':
+ case '(':
insert_editor_blocked (editor, iter,
")", plugin);
break;
- default:
+ default:
break;
}
ianjuta_editor_goto_position (editor, iter, NULL);
@@ -1289,7 +1295,7 @@ cpp_indentation (IAnjutaEditor *editor,
ianjuta_document_begin_undo_action (IANJUTA_DOCUMENT (editor), NULL);
insert_editor_blocked (editor, iter, c, plugin);
ianjuta_editor_goto_position (editor, iter, NULL);
- ianjuta_document_end_undo_action (IANJUTA_DOCUMENT (editor), NULL);
+ ianjuta_document_end_undo_action (IANJUTA_DOCUMENT (editor), NULL);
g_free (c);
}
@@ -1363,4 +1369,4 @@ java_indentation (IAnjutaEditor *editor,
CppJavaPlugin *plugin)
{
cpp_indentation (editor, insert_pos, ch, plugin);
-}
\ No newline at end of file
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]