0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 8.0.0148: wrong indent in C preprocessor with line continuation

Problem:    When a C preprocessor statement has two line continuations the
            following line does not have the right indent. (Ken Takata)
Solution:   Add the indent of the previous continuation line. (Hirohito
            Higashi)
This commit is contained in:
Bram Moolenaar 2017-01-07 15:39:43 +01:00
parent 6e450a5754
commit c6aa475a27
4 changed files with 54 additions and 11 deletions

View File

@ -5422,7 +5422,6 @@ static int skip_label(linenr_T, char_u **pp);
static int cin_first_id_amount(void); static int cin_first_id_amount(void);
static int cin_get_equal_amount(linenr_T lnum); static int cin_get_equal_amount(linenr_T lnum);
static int cin_ispreproc(char_u *); static int cin_ispreproc(char_u *);
static int cin_ispreproc_cont(char_u **pp, linenr_T *lnump);
static int cin_iscomment(char_u *); static int cin_iscomment(char_u *);
static int cin_islinecomment(char_u *); static int cin_islinecomment(char_u *);
static int cin_isterminated(char_u *, int, int); static int cin_isterminated(char_u *, int, int);
@ -6002,13 +6001,18 @@ cin_ispreproc(char_u *s)
* Return TRUE if line "*pp" at "*lnump" is a preprocessor statement or a * Return TRUE if line "*pp" at "*lnump" is a preprocessor statement or a
* continuation line of a preprocessor statement. Decrease "*lnump" to the * continuation line of a preprocessor statement. Decrease "*lnump" to the
* start and return the line in "*pp". * start and return the line in "*pp".
* Put the amount of indent in "*amount".
*/ */
static int static int
cin_ispreproc_cont(char_u **pp, linenr_T *lnump) cin_ispreproc_cont(char_u **pp, linenr_T *lnump, int *amount)
{ {
char_u *line = *pp; char_u *line = *pp;
linenr_T lnum = *lnump; linenr_T lnum = *lnump;
int retval = FALSE; int retval = FALSE;
int candidate_amount = *amount;
if (*line != NUL && line[STRLEN(line) - 1] == '\\')
candidate_amount = get_indent_lnum(lnum);
for (;;) for (;;)
{ {
@ -6027,6 +6031,8 @@ cin_ispreproc_cont(char_u **pp, linenr_T *lnump)
if (lnum != *lnump) if (lnum != *lnump)
*pp = ml_get(*lnump); *pp = ml_get(*lnump);
if (retval)
*amount = candidate_amount;
return retval; return retval;
} }
@ -7390,7 +7396,7 @@ get_c_indent(void)
l = skipwhite(ml_get(lnum)); l = skipwhite(ml_get(lnum));
if (cin_nocode(l)) /* skip comment lines */ if (cin_nocode(l)) /* skip comment lines */
continue; continue;
if (cin_ispreproc_cont(&l, &lnum)) if (cin_ispreproc_cont(&l, &lnum, &amount))
continue; /* ignore #define, #if, etc. */ continue; /* ignore #define, #if, etc. */
curwin->w_cursor.lnum = lnum; curwin->w_cursor.lnum = lnum;
@ -7803,10 +7809,10 @@ get_c_indent(void)
*/ */
if (curwin->w_cursor.lnum <= ourscope) if (curwin->w_cursor.lnum <= ourscope)
{ {
/* we reached end of scope: /* We reached end of scope:
* if looking for a enum or structure initialization * If looking for a enum or structure initialization
* go further back: * go further back:
* if it is an initializer (enum xxx or xxx =), then * If it is an initializer (enum xxx or xxx =), then
* don't add ind_continuation, otherwise it is a variable * don't add ind_continuation, otherwise it is a variable
* declaration: * declaration:
* int x, * int x,
@ -7845,7 +7851,8 @@ get_c_indent(void)
/* /*
* Skip preprocessor directives and blank lines. * Skip preprocessor directives and blank lines.
*/ */
if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum)) if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum,
&amount))
continue; continue;
if (cin_nocode(l)) if (cin_nocode(l))
@ -7962,7 +7969,8 @@ get_c_indent(void)
} }
/* Skip preprocessor directives and blank lines. */ /* Skip preprocessor directives and blank lines. */
if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum)) if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum,
&amount))
continue; continue;
/* Finally the actual check for "namespace". */ /* Finally the actual check for "namespace". */
@ -8138,7 +8146,7 @@ get_c_indent(void)
* unlocked it) * unlocked it)
*/ */
l = ml_get_curline(); l = ml_get_curline();
if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum) if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum, &amount)
|| cin_nocode(l)) || cin_nocode(l))
continue; continue;
@ -8859,7 +8867,7 @@ term_again:
/* /*
* Skip preprocessor directives and blank lines. * Skip preprocessor directives and blank lines.
*/ */
if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum)) if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum, &amount))
continue; continue;
if (cin_nocode(l)) if (cin_nocode(l))
@ -8960,7 +8968,7 @@ term_again:
{ {
look = ml_get(--curwin->w_cursor.lnum); look = ml_get(--curwin->w_cursor.lnum);
if (!(cin_nocode(look) || cin_ispreproc_cont( if (!(cin_nocode(look) || cin_ispreproc_cont(
&look, &curwin->w_cursor.lnum))) &look, &curwin->w_cursor.lnum, &amount)))
break; break;
} }
if (curwin->w_cursor.lnum > 0 if (curwin->w_cursor.lnum > 0

View File

@ -2317,6 +2317,25 @@ h,
i; i;
JSEND JSEND
STARTTEST
:set cin cino&
/start of define
=/end of define
ENDTEST
/* start of define */
{
}
#define AAA \
BBB\
CCC
#define CNT \
1 + \
2 + \
4
/* end of define */
STARTTEST STARTTEST
:g/^STARTTEST/.,/^ENDTEST/d :g/^STARTTEST/.,/^ENDTEST/d
:1;/start of AUTO/,$wq! test.out :1;/start of AUTO/,$wq! test.out

View File

@ -2080,3 +2080,17 @@ var a,
i; i;
JSEND JSEND
/* start of define */
{
}
#define AAA \
BBB\
CCC
#define CNT \
1 + \
2 + \
4
/* end of define */

View File

@ -764,6 +764,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
148,
/**/ /**/
147, 147,
/**/ /**/