aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/indent_c.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/indent_c.c')
-rw-r--r--src/nvim/indent_c.c46
1 files changed, 31 insertions, 15 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;
}