aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohan Klokkhammer Helsing <johanhelsing@gmail.com>2015-11-16 21:53:53 +0100
committerJohan Klokkhammer Helsing <johanhelsing@gmail.com>2015-12-13 13:06:39 +0100
commit238a8d33fa2da6593013dfbcca1639fdd6fc759b (patch)
tree8651a9acd8b9892d262e7c28c99a133ee8411382
parent123361f187778785aac112a7f34ed7a95e7239b9 (diff)
downloadrneovim-238a8d33fa2da6593013dfbcca1639fdd6fc759b.tar.gz
rneovim-238a8d33fa2da6593013dfbcca1639fdd6fc759b.tar.bz2
rneovim-238a8d33fa2da6593013dfbcca1639fdd6fc759b.zip
vim-patch:7.4.723
Problem: For indenting, finding the C++ baseclass can be slow. Solution: Cache the result. (Hirohito Higashi) https://github.com/vim/vim/commit/4032cfdf17c1c744d0f87219924870378b86a1c4
-rw-r--r--src/nvim/indent_c.c46
-rw-r--r--src/nvim/version.c2
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