Mercurial > vim
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 { |