summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2011-05-19 16:35:09 +0200
committerBram Moolenaar <Bram@vim.org>2011-05-19 16:35:09 +0200
commit496f9517cb2630cd902be85e51e3ab395a194e85 (patch)
tree2a8397bda1a6256b31a362d4a31571d037501608
parent1385c3ee7f8715796c87d9bb020326ecc681e95d (diff)
downloadvim-git-496f9517cb2630cd902be85e51e3ab395a194e85.tar.gz
updated for version 7.3.195v7.3.195
Problem: "} else" causes following lines to be indented too much. (Rouben Rostamian) Solution: Better detection for the "else". (Lech Lorens)
-rw-r--r--src/misc1.c14
-rw-r--r--src/testdir/test3.in30
-rw-r--r--src/testdir/test3.ok28
-rw-r--r--src/version.c2
4 files changed, 68 insertions, 6 deletions
diff --git a/src/misc1.c b/src/misc1.c
index f1ab84879..0959e2a24 100644
--- 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_comma)
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
index 56a1dc894..05efa9848 100644
--- 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
index 656b16ecb..2e622728a 100644
--- 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
index b505c2946..968bbb355 100644
--- 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,