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);