Mercurial > vim
comparison src/eval.c @ 21552:cbc570e66d11 v8.2.1326
patch 8.2.1326: Vim9: skipping over white space after list
Commit: https://github.com/vim/vim/commit/9d489566815d7913afc5dfc2a772bacede3970fb
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Jul 30 20:08:50 2020 +0200
patch 8.2.1326: Vim9: skipping over white space after list
Problem: Vim9: skipping over white space after list.
Solution: Do not skip white space, a following [] would be misinterpreted.
(closes #6552) Fix a few side effects.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 30 Jul 2020 20:15:05 +0200 |
parents | 4d3e983313dc |
children | 46956b6811a1 |
comparison
equal
deleted
inserted
replaced
21551:24c7210c4134 | 21552:cbc570e66d11 |
---|---|
1911 * "arg" must point somewhere inside a line, not at the start. | 1911 * "arg" must point somewhere inside a line, not at the start. |
1912 */ | 1912 */ |
1913 char_u * | 1913 char_u * |
1914 eval_next_non_blank(char_u *arg, evalarg_T *evalarg, int *getnext) | 1914 eval_next_non_blank(char_u *arg, evalarg_T *evalarg, int *getnext) |
1915 { | 1915 { |
1916 char_u *p = skipwhite(arg); | |
1917 | |
1916 *getnext = FALSE; | 1918 *getnext = FALSE; |
1917 if (in_vim9script() | 1919 if (in_vim9script() |
1918 && evalarg != NULL | 1920 && evalarg != NULL |
1919 && (evalarg->eval_cookie != NULL || evalarg->eval_cctx != NULL) | 1921 && (evalarg->eval_cookie != NULL || evalarg->eval_cctx != NULL) |
1920 && (*arg == NUL || (VIM_ISWHITE(arg[-1]) | 1922 && (*p == NUL || (VIM_ISWHITE(p[-1]) && vim9_comment_start(p)))) |
1921 && vim9_comment_start(arg)))) | 1923 { |
1922 { | 1924 char_u *next; |
1923 char_u *p; | |
1924 | 1925 |
1925 if (evalarg->eval_cookie != NULL) | 1926 if (evalarg->eval_cookie != NULL) |
1926 p = getline_peek(evalarg->eval_getline, evalarg->eval_cookie); | 1927 next = getline_peek(evalarg->eval_getline, evalarg->eval_cookie); |
1927 else | 1928 else |
1928 p = peek_next_line_from_context(evalarg->eval_cctx); | 1929 next = peek_next_line_from_context(evalarg->eval_cctx); |
1929 | 1930 |
1930 if (p != NULL) | 1931 if (next != NULL) |
1931 { | 1932 { |
1932 *getnext = TRUE; | 1933 *getnext = TRUE; |
1933 return skipwhite(p); | 1934 return skipwhite(next); |
1934 } | 1935 } |
1935 } | 1936 } |
1936 return arg; | 1937 return p; |
1937 } | 1938 } |
1938 | 1939 |
1939 /* | 1940 /* |
1940 * To be called after eval_next_non_blank() sets "getnext" to TRUE. | 1941 * To be called after eval_next_non_blank() sets "getnext" to TRUE. |
1941 */ | 1942 */ |
2037 int called_emsg_before = called_emsg; | 2038 int called_emsg_before = called_emsg; |
2038 int flags = evalarg == NULL ? 0 : evalarg->eval_flags; | 2039 int flags = evalarg == NULL ? 0 : evalarg->eval_flags; |
2039 | 2040 |
2040 p = skipwhite(arg); | 2041 p = skipwhite(arg); |
2041 ret = eval1(&p, rettv, evalarg); | 2042 ret = eval1(&p, rettv, evalarg); |
2043 p = skipwhite(p); | |
2042 | 2044 |
2043 if (ret == FAIL || !ends_excmd2(arg, p)) | 2045 if (ret == FAIL || !ends_excmd2(arg, p)) |
2044 { | 2046 { |
2045 if (ret != FAIL) | 2047 if (ret != FAIL) |
2046 clear_tv(rettv); | 2048 clear_tv(rettv); |
2105 orig_flags = evalarg_used->eval_flags; | 2107 orig_flags = evalarg_used->eval_flags; |
2106 evaluate = evalarg_used->eval_flags & EVAL_EVALUATE; | 2108 evaluate = evalarg_used->eval_flags & EVAL_EVALUATE; |
2107 | 2109 |
2108 if (getnext) | 2110 if (getnext) |
2109 *arg = eval_next_line(evalarg_used); | 2111 *arg = eval_next_line(evalarg_used); |
2112 else | |
2113 *arg = p; | |
2110 | 2114 |
2111 result = FALSE; | 2115 result = FALSE; |
2112 if (evaluate) | 2116 if (evaluate) |
2113 { | 2117 { |
2114 int error = FALSE; | 2118 int error = FALSE; |
2140 clear_tv(rettv); | 2144 clear_tv(rettv); |
2141 return FAIL; | 2145 return FAIL; |
2142 } | 2146 } |
2143 if (getnext) | 2147 if (getnext) |
2144 *arg = eval_next_line(evalarg_used); | 2148 *arg = eval_next_line(evalarg_used); |
2149 else | |
2150 *arg = p; | |
2145 | 2151 |
2146 /* | 2152 /* |
2147 * Get the third variable. Recursive! | 2153 * Get the third variable. Recursive! |
2148 */ | 2154 */ |
2149 *arg = skipwhite_and_linebreak(*arg + 1, evalarg_used); | 2155 *arg = skipwhite_and_linebreak(*arg + 1, evalarg_used); |
2232 */ | 2238 */ |
2233 while (p[0] == '|' && p[1] == '|') | 2239 while (p[0] == '|' && p[1] == '|') |
2234 { | 2240 { |
2235 if (getnext) | 2241 if (getnext) |
2236 *arg = eval_next_line(evalarg_used); | 2242 *arg = eval_next_line(evalarg_used); |
2243 else | |
2244 *arg = p; | |
2237 | 2245 |
2238 /* | 2246 /* |
2239 * Get the second variable. | 2247 * Get the second variable. |
2240 */ | 2248 */ |
2241 *arg = skipwhite_and_linebreak(*arg + 2, evalarg_used); | 2249 *arg = skipwhite_and_linebreak(*arg + 2, evalarg_used); |
2347 */ | 2355 */ |
2348 while (p[0] == '&' && p[1] == '&') | 2356 while (p[0] == '&' && p[1] == '&') |
2349 { | 2357 { |
2350 if (getnext) | 2358 if (getnext) |
2351 *arg = eval_next_line(evalarg_used); | 2359 *arg = eval_next_line(evalarg_used); |
2360 else | |
2361 *arg = p; | |
2352 | 2362 |
2353 /* | 2363 /* |
2354 * Get the second variable. | 2364 * Get the second variable. |
2355 */ | 2365 */ |
2356 *arg = skipwhite_and_linebreak(*arg + 2, evalarg_used); | 2366 *arg = skipwhite_and_linebreak(*arg + 2, evalarg_used); |
2573 if (op != '+' && op != '-' && !concat) | 2583 if (op != '+' && op != '-' && !concat) |
2574 break; | 2584 break; |
2575 | 2585 |
2576 if (getnext) | 2586 if (getnext) |
2577 *arg = eval_next_line(evalarg); | 2587 *arg = eval_next_line(evalarg); |
2588 else | |
2589 *arg = p; | |
2578 evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE); | 2590 evaluate = evalarg == NULL ? 0 : (evalarg->eval_flags & EVAL_EVALUATE); |
2579 if ((op != '+' || (rettv->v_type != VAR_LIST | 2591 if ((op != '+' || (rettv->v_type != VAR_LIST |
2580 && rettv->v_type != VAR_BLOB)) | 2592 && rettv->v_type != VAR_BLOB)) |
2581 #ifdef FEAT_FLOAT | 2593 #ifdef FEAT_FLOAT |
2582 && (op == '.' || rettv->v_type != VAR_FLOAT) | 2594 && (op == '.' || rettv->v_type != VAR_FLOAT) |
2754 for (;;) | 2766 for (;;) |
2755 { | 2767 { |
2756 int evaluate; | 2768 int evaluate; |
2757 int getnext; | 2769 int getnext; |
2758 typval_T var2; | 2770 typval_T var2; |
2771 char_u *p; | |
2759 int op; | 2772 int op; |
2760 varnumber_T n1, n2; | 2773 varnumber_T n1, n2; |
2761 #ifdef FEAT_FLOAT | 2774 #ifdef FEAT_FLOAT |
2762 float_T f1, f2; | 2775 float_T f1, f2; |
2763 #endif | 2776 #endif |
2764 int error; | 2777 int error; |
2765 | 2778 |
2766 op = *eval_next_non_blank(*arg, evalarg, &getnext); | 2779 p = eval_next_non_blank(*arg, evalarg, &getnext); |
2780 op = *p; | |
2767 if (op != '*' && op != '/' && op != '%') | 2781 if (op != '*' && op != '/' && op != '%') |
2768 break; | 2782 break; |
2769 | 2783 |
2770 if (getnext) | 2784 if (getnext) |
2771 *arg = eval_next_line(evalarg); | 2785 *arg = eval_next_line(evalarg); |
2786 else | |
2787 *arg = p; | |
2772 | 2788 |
2773 #ifdef FEAT_FLOAT | 2789 #ifdef FEAT_FLOAT |
2774 f1 = 0; | 2790 f1 = 0; |
2775 f2 = 0; | 2791 f2 = 0; |
2776 #endif | 2792 #endif |
3113 } | 3129 } |
3114 } | 3130 } |
3115 vim_free(alias); | 3131 vim_free(alias); |
3116 } | 3132 } |
3117 | 3133 |
3118 *arg = skipwhite(*arg); | |
3119 | |
3120 // Handle following '[', '(' and '.' for expr[expr], expr.name, | 3134 // Handle following '[', '(' and '.' for expr[expr], expr.name, |
3121 // expr(expr), expr->name(expr) | 3135 // expr(expr), expr->name(expr) |
3122 if (ret == OK) | 3136 if (ret == OK) |
3123 ret = handle_subscript(arg, rettv, evalarg, TRUE); | 3137 ret = handle_subscript(arg, rettv, evalarg, TRUE); |
3124 | 3138 |
5150 // When at the end of the line and ".name" or "->{" or "->X" follows in | 5164 // When at the end of the line and ".name" or "->{" or "->X" follows in |
5151 // the next line then consume the line break. | 5165 // the next line then consume the line break. |
5152 p = eval_next_non_blank(*arg, evalarg, &getnext); | 5166 p = eval_next_non_blank(*arg, evalarg, &getnext); |
5153 if (getnext | 5167 if (getnext |
5154 && ((rettv->v_type == VAR_DICT && *p == '.' && eval_isdictc(p[1])) | 5168 && ((rettv->v_type == VAR_DICT && *p == '.' && eval_isdictc(p[1])) |
5155 || (*p == '-' && p[1] == '>' | 5169 || (p[0] == '-' && p[1] == '>' |
5156 && (p[2] == '{' || ASCII_ISALPHA(p[2]))))) | 5170 && (p[2] == '{' || ASCII_ISALPHA(p[2]))))) |
5157 { | 5171 { |
5158 *arg = eval_next_line(evalarg); | 5172 *arg = eval_next_line(evalarg); |
5159 check_white = FALSE; | 5173 check_white = FALSE; |
5160 } | 5174 } |
5176 ret = FAIL; | 5190 ret = FAIL; |
5177 } | 5191 } |
5178 dict_unref(selfdict); | 5192 dict_unref(selfdict); |
5179 selfdict = NULL; | 5193 selfdict = NULL; |
5180 } | 5194 } |
5181 else if (**arg == '-' && (*arg)[1] == '>') | 5195 else if (p[0] == '-' && p[1] == '>') |
5182 { | 5196 { |
5197 *arg = p; | |
5183 if (ret == OK) | 5198 if (ret == OK) |
5184 { | 5199 { |
5185 if ((*arg)[2] == '{') | 5200 if ((*arg)[2] == '{') |
5186 // expr->{lambda}() | 5201 // expr->{lambda}() |
5187 ret = eval_lambda(arg, rettv, evalarg, verbose); | 5202 ret = eval_lambda(arg, rettv, evalarg, verbose); |