vim-patch:7.4.891

Problem:    Indentation of array initializer is wrong.
Solution:   Avoid that calling find_start_rawstring() changes the position
            returned by find_start_comment(), add a test. (Hirohito Higashi)

089af18d1f
This commit is contained in:
watiko
2016-02-15 18:28:39 +09:00
parent 7609a96a35
commit 2d5cba630c
3 changed files with 94 additions and 38 deletions

View File

@@ -69,23 +69,33 @@ find_start_comment ( /* XXX */
return pos; return pos;
} }
/* /// Find the start of a comment or raw string, not knowing if we are in a
* Find the start of a comment or raw string, not knowing if we are in a /// comment or raw string right now.
* comment or raw string right now. /// Search starts at w_cursor.lnum and goes backwards.
* Search starts at w_cursor.lnum and goes backwards. ///
* Return NULL when not inside a comment or raw string. /// @returns NULL when not inside a comment or raw string.
* "CORS" -> Comment Or Raw String ///
*/ /// @note "CORS" -> Comment Or Raw String
static pos_T *ind_find_start_CORS(void) static pos_T *ind_find_start_CORS(void)
{ /* XXX */ {
pos_T *comment_pos = find_start_comment(curbuf->b_ind_maxcomment); // XXX
pos_T *rs_pos = find_start_rawstring(curbuf->b_ind_maxcomment); static pos_T comment_pos_copy;
/* If comment_pos is before rs_pos the raw string is inside the comment. pos_T *comment_pos = find_start_comment(curbuf->b_ind_maxcomment);
* If rs_pos is before comment_pos the comment is inside the raw string. */ if (comment_pos != NULL) {
if (comment_pos == NULL || (rs_pos != NULL && lt(*rs_pos, *comment_pos))) // Need to make a copy of the static pos in findmatchlimit(),
return rs_pos; // calling find_start_rawstring() may change it.
return comment_pos; comment_pos_copy = *comment_pos;
comment_pos = &comment_pos_copy;
}
pos_T *rs_pos = find_start_rawstring(curbuf->b_ind_maxcomment);
// If comment_pos is before rs_pos the raw string is inside the comment.
// If rs_pos is before comment_pos the comment is inside the raw string.
if (comment_pos == NULL || (rs_pos != NULL && lt(*rs_pos, *comment_pos))) {
return rs_pos;
}
return comment_pos;
} }
/* /*
@@ -2707,7 +2717,8 @@ int get_c_indent(void)
if (terminated == 0 || (lookfor != LOOKFOR_UNTERM if (terminated == 0 || (lookfor != LOOKFOR_UNTERM
&& terminated == ',')) { && terminated == ',')) {
if (*skipwhite(l) == '[' || l[STRLEN(l) - 1] == '[') { if (lookfor != LOOKFOR_ENUM_OR_INIT
&& (*skipwhite(l) == '[' || l[STRLEN(l) - 1] == '[')) {
amount += ind_continuation; amount += ind_continuation;
} }
// If we're in the middle of a paren thing, Go back to the line // If we're in the middle of a paren thing, Go back to the line
@@ -2915,34 +2926,35 @@ int get_c_indent(void)
continue; continue;
} }
/* Ignore unterminated lines in between, but // Ignore unterminated lines in between, but
* reduce indent. */ // reduce indent.
if (amount > cur_amount) if (amount > cur_amount) {
amount = cur_amount; amount = cur_amount;
}
} else { } else {
/* // Found first unterminated line on a row, may
* Found first unterminated line on a row, may // line up with this line, remember its indent
* line up with this line, remember its indent // 100 + // NOLINT(whitespace/tab)
* 100 + // -> here; // NOLINT(whitespace/tab)
* -> here;
*/
l = get_cursor_line_ptr(); l = get_cursor_line_ptr();
amount = cur_amount; amount = cur_amount;
if (*skipwhite(l) == ']' || l[STRLEN(l) - 1] == ']') {
n = (int)STRLEN(l);
if (terminated == ','
&& (*skipwhite(l) == ']'
|| (n >=2 && l[n - 2] == ']'))) {
break; break;
} }
/* // If previous line ends in ',', check whether we
* If previous line ends in ',', check whether we // are in an initialization or enum
* are in an initialization or enum // struct xxx =
* struct xxx = // {
* { // sizeof a,
* sizeof a, // 124 };
* 124 }; // or a normal possible continuation line.
* or a normal possible continuation line. // but only, of no other statement has been found
* but only, of no other statement has been found // yet.
* yet.
*/
if (lookfor == LOOKFOR_INITIAL && terminated == ',') { if (lookfor == LOOKFOR_INITIAL && terminated == ',') {
if (curbuf->b_ind_js) { if (curbuf->b_ind_js) {
// Search for a line ending in a comma // Search for a line ending in a comma

View File

@@ -397,7 +397,7 @@ static int included_patches[] = {
// 894 NA // 894 NA
// 893, // 893,
// 892, // 892,
// 891, 891,
// 890 NA // 890 NA
// 889, // 889,
// 888, // 888,

View File

@@ -919,6 +919,28 @@ describe('cindent', function()
)foo"; )foo";
} }
{
int a[4] = {
[0] = 0,
[1] = 1,
[2] = 2,
[3] = 3,
};
}
{
a = b[2]
+ 3;
}
{
if (1)
/* aaaaa
* bbbbb
*/
a = 1;
}
/* end of AUTO */ /* end of AUTO */
]=]) ]=])
@@ -1825,6 +1847,28 @@ describe('cindent', function()
)foo"; )foo";
} }
{
int a[4] = {
[0] = 0,
[1] = 1,
[2] = 2,
[3] = 3,
};
}
{
a = b[2]
+ 3;
}
{
if (1)
/* aaaaa
* bbbbb
*/
a = 1;
}
/* end of AUTO */ /* end of AUTO */
]=]) ]=])
end) end)