# HG changeset patch # User Bram Moolenaar # Date 1305815709 -7200 # Node ID 8dbea5adc937ecddf8ca336856cd487e1b118b1a # Parent d26e38796007c0407f4173d1d506154eded18585 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) diff --git a/src/misc1.c b/src/misc1.c --- 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; diff --git a/src/testdir/test3.in b/src/testdir/test3.in --- a/src/testdir/test3.in +++ b/src/testdir/test3.in @@ -1345,7 +1345,7 @@ func(int a STARTTEST :set cino& -2kdd=][ +2kdd=4][ ENDTEST void func(void) @@ -1359,6 +1359,34 @@ void func(void) printf("Foo!\n"); } +void func1(void) +{ + char* tab[] = {"foo", "bar", + "baz", "quux", + "this line used", "to be indented incorrectly"}; + foo(); +} + +void func2(void) +{ + int tab[] = + {1, 2, + 3, 4, + 5, 6}; + + printf("This line used to be indented incorrectly.\n"); +} + +void func3(void) +{ + int tab[] = { + 1, 2, + 3, 4, + 5, 6}; + +printf("Don't you dare indent this line incorrectly!\n); +} + STARTTEST :set cino& 2kdd=][ diff --git a/src/testdir/test3.ok b/src/testdir/test3.ok --- a/src/testdir/test3.ok +++ b/src/testdir/test3.ok @@ -1216,6 +1216,34 @@ void func(void) printf("Foo!\n"); } +void func1(void) +{ + char* tab[] = {"foo", "bar", + "baz", "quux", + "this line used", "to be indented incorrectly"}; + foo(); +} + +void func2(void) +{ + int tab[] = + {1, 2, + 3, 4, + 5, 6}; + + printf("This line used to be indented incorrectly.\n"); +} + +void func3(void) +{ + int tab[] = { + 1, 2, + 3, 4, + 5, 6}; + + printf("Don't you dare indent this line incorrectly!\n); +} + void func(void) { diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -710,6 +710,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 195, +/**/ 194, /**/ 193,