comparison src/vim9compile.c @ 23088:285cde4b8d0e v8.2.2090

patch 8.2.2090: Vim9: dict does not accept a key in quotes Commit: https://github.com/vim/vim/commit/c5e6a7179d7dee4315b412b56e172bb1ff092d3e Author: Bram Moolenaar <Bram@vim.org> Date: Fri Dec 4 19:12:14 2020 +0100 patch 8.2.2090: Vim9: dict does not accept a key in quotes Problem: Vim9: dict does not accept a key in quotes. Solution: Recognize a key in single or double quotes.
author Bram Moolenaar <Bram@vim.org>
date Fri, 04 Dec 2020 19:15:03 +0100
parents 2120e4b40e12
children 9c3a6c33c0e5
comparison
equal deleted inserted replaced
23087:ca8a14cbafb6 23088:285cde4b8d0e
3022 } 3022 }
3023 3023
3024 if (**arg == '}') 3024 if (**arg == '}')
3025 break; 3025 break;
3026 3026
3027 // {name: value} uses "name" as a literal key and 3027 if (**arg == '[')
3028 // {[expr]: value} uses an evaluated key.
3029 if (**arg != '[')
3030 {
3031 char_u *end = skip_literal_key(*arg);
3032
3033 if (end == *arg)
3034 {
3035 semsg(_(e_invalid_key_str), *arg);
3036 return FAIL;
3037 }
3038 key = vim_strnsave(*arg, end - *arg);
3039 if (generate_PUSHS(cctx, key) == FAIL)
3040 return FAIL;
3041 *arg = end;
3042 }
3043 else
3044 { 3028 {
3045 isn_T *isn; 3029 isn_T *isn;
3046 3030
3031 // {[expr]: value} uses an evaluated key.
3047 *arg = skipwhite(*arg + 1); 3032 *arg = skipwhite(*arg + 1);
3048 if (compile_expr0(arg, cctx) == FAIL) 3033 if (compile_expr0(arg, cctx) == FAIL)
3049 return FAIL; 3034 return FAIL;
3050 isn = ((isn_T *)instr->ga_data) + instr->ga_len - 1; 3035 isn = ((isn_T *)instr->ga_data) + instr->ga_len - 1;
3051 if (isn->isn_type == ISN_PUSHS) 3036 if (isn->isn_type == ISN_PUSHS)
3063 { 3048 {
3064 emsg(_(e_missing_matching_bracket_after_dict_key)); 3049 emsg(_(e_missing_matching_bracket_after_dict_key));
3065 return FAIL; 3050 return FAIL;
3066 } 3051 }
3067 ++*arg; 3052 ++*arg;
3053 }
3054 else
3055 {
3056 // {"name": value},
3057 // {'name': value},
3058 // {name: value} use "name" as a literal key
3059 key = get_literal_key(arg);
3060 if (key == NULL)
3061 return FAIL;
3062 if (generate_PUSHS(cctx, key) == FAIL)
3063 return FAIL;
3068 } 3064 }
3069 3065
3070 // Check for duplicate keys, if using string keys. 3066 // Check for duplicate keys, if using string keys.
3071 if (key != NULL) 3067 if (key != NULL)
3072 { 3068 {