Mercurial > vim
diff src/dict.c @ 21034:2f8b0812819f v8.2.1068
patch 8.2.1068: Vim9: no line break allowed inside a dict
Commit: https://github.com/vim/vim/commit/8ea9390b78da9e34a20e7418712921397c0c1989
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Jun 27 14:11:53 2020 +0200
patch 8.2.1068: Vim9: no line break allowed inside a dict
Problem: Vim9: no line break allowed inside a dict.
Solution: Handle line break inside a dict in Vim9 script.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 27 Jun 2020 14:15:04 +0200 |
parents | 7ee565134d4a |
children | 6ad5f0c99ee9 |
line wrap: on
line diff
--- a/src/dict.c +++ b/src/dict.c @@ -792,10 +792,10 @@ get_literal_key(char_u **arg, typval_T * * Return OK or FAIL. Returns NOTDONE for {expr}. */ int -eval_dict(char_u **arg, typval_T *rettv, int flags, int literal) +eval_dict(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int literal) { - int evaluate = flags & EVAL_EVALUATE; - evalarg_T evalarg; + int evaluate = evalarg == NULL ? FALSE + : evalarg->eval_flags & EVAL_EVALUATE; dict_T *d = NULL; typval_T tvkey; typval_T tv; @@ -804,9 +804,8 @@ eval_dict(char_u **arg, typval_T *rettv, char_u *start = skipwhite(*arg + 1); char_u buf[NUMBUFLEN]; int vim9script = current_sctx.sc_version == SCRIPT_VERSION_VIM9; - - CLEAR_FIELD(evalarg); - evalarg.eval_flags = flags; + int had_comma; + int getnext; /* * First check if it's not a curly-braces thing: {expr}. @@ -833,11 +832,14 @@ eval_dict(char_u **arg, typval_T *rettv, tv.v_type = VAR_UNKNOWN; *arg = skipwhite(*arg + 1); + eval_next_non_blank(*arg, evalarg, &getnext); + if (getnext) + *arg = eval_next_line(evalarg); while (**arg != '}' && **arg != NUL) { if ((literal ? get_literal_key(arg, &tvkey) - : eval1(arg, &tvkey, &evalarg)) == FAIL) // recursive! + : eval1(arg, &tvkey, evalarg)) == FAIL) // recursive! goto failret; if (**arg != ':') @@ -857,9 +859,17 @@ eval_dict(char_u **arg, typval_T *rettv, goto failret; } } + if (vim9script && (*arg)[1] != NUL && !VIM_ISWHITE((*arg)[1])) + { + semsg(_(e_white_after), ":"); + goto failret; + } *arg = skipwhite(*arg + 1); - if (eval1(arg, &tv, &evalarg) == FAIL) // recursive! + eval_next_non_blank(*arg, evalarg, &getnext); + if (getnext) + *arg = eval_next_line(evalarg); + if (eval1(arg, &tv, evalarg) == FAIL) // recursive! { if (evaluate) clear_tv(&tvkey); @@ -887,15 +897,30 @@ eval_dict(char_u **arg, typval_T *rettv, } clear_tv(&tvkey); + // the comma must come after the value + had_comma = **arg == ','; + if (had_comma) + { + if (vim9script && (*arg)[1] != NUL && !VIM_ISWHITE((*arg)[1])) + { + semsg(_(e_white_after), ","); + goto failret; + } + *arg = skipwhite(*arg + 1); + } + + // the "}" can be on the next line + eval_next_non_blank(*arg, evalarg, &getnext); + if (getnext) + *arg = eval_next_line(evalarg); if (**arg == '}') break; - if (**arg != ',') + if (!had_comma) { if (evaluate) semsg(_(e_missing_dict_comma), *arg); goto failret; } - *arg = skipwhite(*arg + 1); } if (**arg != '}')