diff src/misc1.c @ 2843:8dbea5adc937 v7.3.195

updated for version 7.3.195 Problem: "} else" causes following lines to be indented too much. (Rouben Rostamian) Solution: Better detection for the "else". (Lech Lorens)
author Bram Moolenaar <bram@vim.org>
date Thu, 19 May 2011 16:35:09 +0200
parents 8bd38abda314
children 78859ef2982b
line wrap: on
line diff
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -5482,8 +5482,8 @@ cin_islinecomment(p)
  * Recognize a line that starts with '{' or '}', or ends with ';', ',', '{' or
  * '}'.
  * Don't consider "} else" a terminated line.
- * Don't consider a line where there are unmatched opening braces before '}',
- * ';' or ',' a terminated line.
+ * If a line begins with an "else", only consider it terminated if no unmatched
+ * opening braces follow (handle "else { foo();" correctly).
  * Return the character terminating the line (ending char's have precedence if
  * both apply in order to determine initializations).
  */
@@ -5493,21 +5493,25 @@ cin_isterminated(s, incl_open, incl_comm
     int		incl_open;	/* include '{' at the end as terminator */
     int		incl_comma;	/* recognize a trailing comma */
 {
-    char_u found_start = 0;
-    unsigned n_open = 0;
+    char_u	found_start = 0;
+    unsigned	n_open = 0;
+    int		is_else = FALSE;
 
     s = cin_skipcomment(s);
 
     if (*s == '{' || (*s == '}' && !cin_iselse(s)))
 	found_start = *s;
 
+    if (!found_start)
+	is_else = cin_iselse(s);
+
     while (*s)
     {
 	/* skip over comments, "" strings and 'c'haracters */
 	s = skip_string(cin_skipcomment(s));
 	if (*s == '}' && n_open > 0)
 	    --n_open;
-	if (n_open == 0
+	if ((!is_else || n_open == 0)
 		&& (*s == ';' || *s == '}' || (incl_comma && *s == ','))
 		&& cin_nocode(s + 1))
 	    return *s;