diff options
-rw-r--r-- | src/nvim/indent_c.c | 46 | ||||
-rw-r--r-- | src/nvim/version.c | 2 |
2 files changed, 32 insertions, 16 deletions
diff --git a/src/nvim/indent_c.c b/src/nvim/indent_c.c index da068478be..ee20babaed 100644 --- a/src/nvim/indent_c.c +++ b/src/nvim/indent_c.c @@ -17,7 +17,11 @@ #include "nvim/search.h" #include "nvim/strings.h" - +// Find result cache for cpp_baseclass +typedef struct { + int found; + lpos_T lpos; +} cpp_baseclass_cache_T; #ifdef INCLUDE_GENERATED_DECLARATIONS # include "indent_c.c.generated.h" @@ -986,17 +990,21 @@ static int cin_isbreak(char_u *p) * * This is a lot of guessing. Watch out for "cond ? func() : foo". */ -static int -cin_is_cpp_baseclass ( - colnr_T *col /* return: column to align with */ +static int cin_is_cpp_baseclass ( + cpp_baseclass_cache_T *cached // input and output ) { + lpos_T *pos = &cached->lpos; // find position char_u *s; int class_or_struct, lookfor_ctor_init, cpp_base_class; linenr_T lnum = curwin->w_cursor.lnum; char_u *line = get_cursor_line_ptr(); - *col = 0; + if (pos->lnum <= lnum) { + return cached->found; // Use the cached result + } + + pos->col = 0; s = skipwhite(line); if (*s == '#') /* skip #define FOO x ? (x) : x */ @@ -1038,6 +1046,7 @@ cin_is_cpp_baseclass ( --lnum; } + pos->lnum = lnum; line = ml_get(lnum); s = cin_skipcomment(line); for (;; ) { @@ -1064,7 +1073,7 @@ cin_is_cpp_baseclass ( * cpp-base-class-declaration or constructor-initialization */ cpp_base_class = TRUE; lookfor_ctor_init = class_or_struct = FALSE; - *col = 0; + pos->col = 0; s = cin_skipcomment(s + 1); } else s = cin_skipcomment(s + 1); @@ -1092,23 +1101,29 @@ cin_is_cpp_baseclass ( /* if it is not an identifier, we are wrong */ class_or_struct = FALSE; lookfor_ctor_init = FALSE; - } else if (*col == 0) { + } else if (pos->col == 0) { /* it can't be a constructor-initialization any more */ lookfor_ctor_init = FALSE; /* the first statement starts here: lineup with this one... */ - if (cpp_base_class) - *col = (colnr_T)(s - line); + if (cpp_base_class) { + pos->col = (colnr_T)(s - line); + } } /* When the line ends in a comma don't align with it. */ - if (lnum == curwin->w_cursor.lnum && *s == ',' && cin_nocode(s + 1)) - *col = 0; + if (lnum == curwin->w_cursor.lnum && *s == ',' && cin_nocode(s + 1)) { + pos->col = 0; + } s = cin_skipcomment(s + 1); } } + cached->found = cpp_base_class; + if (cpp_base_class) { + pos->lnum = lnum; + } return cpp_base_class; } @@ -1596,6 +1611,7 @@ int get_c_indent(void) int cont_amount = 0; /* amount for continuation line */ int original_line_islabel; int added_to_amount = 0; + cpp_baseclass_cache_T cache_cpp_baseclass = { false, { MAXLNUM, 0 } }; /* make a copy, value is changed below */ int ind_continuation = curbuf->b_ind_continuation; @@ -2511,7 +2527,7 @@ int get_c_indent(void) */ /* XXX */ n = FALSE; if (lookfor != LOOKFOR_TERM && curbuf->b_ind_cpp_baseclass > 0) { - n = cin_is_cpp_baseclass(&col); + n = cin_is_cpp_baseclass(&cache_cpp_baseclass); l = get_cursor_line_ptr(); } if (n) { @@ -2527,7 +2543,7 @@ int get_c_indent(void) continue; } else /* XXX */ - amount = get_baseclass_amount(col); + amount = get_baseclass_amount(cache_cpp_baseclass.lpos.col); break; } else if (lookfor == LOOKFOR_CPP_BASECLASS) { /* only look, whether there is a cpp base class @@ -3132,12 +3148,12 @@ term_again: */ /* XXX */ n = FALSE; if (curbuf->b_ind_cpp_baseclass != 0 && theline[0] != '{') { - n = cin_is_cpp_baseclass(&col); + n = cin_is_cpp_baseclass(&cache_cpp_baseclass); l = get_cursor_line_ptr(); } if (n) { /* XXX */ - amount = get_baseclass_amount(col); + amount = get_baseclass_amount(cache_cpp_baseclass.lpos.col); break; } diff --git a/src/nvim/version.c b/src/nvim/version.c index 2d66b06f48..49def41bb2 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -270,7 +270,7 @@ static int included_patches[] = { // 726 NA // 725, // 724 NA - // 723, + 723, // 722, // 721, // 720 NA |