Mercurial > vim
comparison src/evalvars.c @ 23450:a8e7acf71fa4 v8.2.2268
patch 8.2.2268: Vim9: list unpack seen as declaration
Commit: https://github.com/vim/vim/commit/3862ea3f620f02569c2d816ca9ceeeac3a0ad901
Author: Bram Moolenaar <Bram@vim.org>
Date: Fri Jan 1 21:05:55 2021 +0100
patch 8.2.2268: Vim9: list unpack seen as declaration
Problem: Vim9: list unpack seen as declaration.
Solution: Check for "var". (closes https://github.com/vim/vim/issues/7594)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Fri, 01 Jan 2021 21:15:04 +0100 |
parents | 8f31b990ab1e |
children | d2b1269c2c68 |
comparison
equal
deleted
inserted
replaced
23449:f04821549e6f | 23450:a8e7acf71fa4 |
---|---|
910 char_u *arg_start, | 910 char_u *arg_start, |
911 typval_T *tv, | 911 typval_T *tv, |
912 int copy, // copy values from "tv", don't move | 912 int copy, // copy values from "tv", don't move |
913 int semicolon, // from skip_var_list() | 913 int semicolon, // from skip_var_list() |
914 int var_count, // from skip_var_list() | 914 int var_count, // from skip_var_list() |
915 int flags, // ASSIGN_FINAL, ASSIGN_CONST, ASSIGN_NO_DECL | 915 int flags, // ASSIGN_FINAL, ASSIGN_CONST, etc. |
916 char_u *op) | 916 char_u *op) |
917 { | 917 { |
918 char_u *arg = arg_start; | 918 char_u *arg = arg_start; |
919 list_T *l; | 919 list_T *l; |
920 int i; | 920 int i; |
1265 static char_u * | 1265 static char_u * |
1266 ex_let_one( | 1266 ex_let_one( |
1267 char_u *arg, // points to variable name | 1267 char_u *arg, // points to variable name |
1268 typval_T *tv, // value to assign to variable | 1268 typval_T *tv, // value to assign to variable |
1269 int copy, // copy value from "tv" | 1269 int copy, // copy value from "tv" |
1270 int flags, // ASSIGN_CONST, ASSIGN_FINAL, ASSIGN_NO_DECL | 1270 int flags, // ASSIGN_CONST, ASSIGN_FINAL, etc. |
1271 char_u *endchars, // valid chars after variable name or NULL | 1271 char_u *endchars, // valid chars after variable name or NULL |
1272 char_u *op) // "+", "-", "." or NULL | 1272 char_u *op) // "+", "-", "." or NULL |
1273 { | 1273 { |
1274 int c1; | 1274 int c1; |
1275 char_u *name; | 1275 char_u *name; |
1277 char_u *arg_end = NULL; | 1277 char_u *arg_end = NULL; |
1278 int len; | 1278 int len; |
1279 int opt_flags; | 1279 int opt_flags; |
1280 char_u *tofree = NULL; | 1280 char_u *tofree = NULL; |
1281 | 1281 |
1282 if (in_vim9script() && (flags & ASSIGN_NO_DECL) == 0 | 1282 if (in_vim9script() && (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0 |
1283 && (flags & (ASSIGN_CONST | ASSIGN_FINAL)) == 0 | 1283 && (flags & (ASSIGN_CONST | ASSIGN_FINAL)) == 0 |
1284 && vim_strchr((char_u *)"$@&", *arg) != NULL) | 1284 && vim_strchr((char_u *)"$@&", *arg) != NULL) |
1285 { | 1285 { |
1286 vim9_declare_error(arg); | 1286 vim9_declare_error(arg); |
1287 return NULL; | 1287 return NULL; |
1474 else if (eval_isnamec1(*arg) || *arg == '{') | 1474 else if (eval_isnamec1(*arg) || *arg == '{') |
1475 { | 1475 { |
1476 lval_T lv; | 1476 lval_T lv; |
1477 | 1477 |
1478 p = get_lval(arg, tv, &lv, FALSE, FALSE, | 1478 p = get_lval(arg, tv, &lv, FALSE, FALSE, |
1479 (flags & ASSIGN_NO_DECL) ? GLV_NO_DECL : 0, FNE_CHECK_START); | 1479 (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) |
1480 ? GLV_NO_DECL : 0, FNE_CHECK_START); | |
1480 if (p != NULL && lv.ll_name != NULL) | 1481 if (p != NULL && lv.ll_name != NULL) |
1481 { | 1482 { |
1482 if (endchars != NULL && vim_strchr(endchars, | 1483 if (endchars != NULL && vim_strchr(endchars, |
1483 *skipwhite(lv.ll_name_end)) == NULL) | 1484 *skipwhite(lv.ll_name_end)) == NULL) |
1484 emsg(_(e_letunexp)); | 1485 emsg(_(e_letunexp)); |
3051 set_var( | 3052 set_var( |
3052 char_u *name, | 3053 char_u *name, |
3053 typval_T *tv, | 3054 typval_T *tv, |
3054 int copy) // make copy of value in "tv" | 3055 int copy) // make copy of value in "tv" |
3055 { | 3056 { |
3056 set_var_const(name, NULL, tv, copy, ASSIGN_NO_DECL); | 3057 set_var_const(name, NULL, tv, copy, ASSIGN_DECL); |
3057 } | 3058 } |
3058 | 3059 |
3059 /* | 3060 /* |
3060 * Set variable "name" to value in "tv". | 3061 * Set variable "name" to value in "tv". |
3061 * If the variable already exists and "is_const" is FALSE the value is updated. | 3062 * If the variable already exists and "is_const" is FALSE the value is updated. |
3065 set_var_const( | 3066 set_var_const( |
3066 char_u *name, | 3067 char_u *name, |
3067 type_T *type, | 3068 type_T *type, |
3068 typval_T *tv_arg, | 3069 typval_T *tv_arg, |
3069 int copy, // make copy of value in "tv" | 3070 int copy, // make copy of value in "tv" |
3070 int flags) // ASSIGN_CONST, ASSIGN_FINAL, ASSIGN_NO_DECL | 3071 int flags) // ASSIGN_CONST, ASSIGN_FINAL, etc. |
3071 { | 3072 { |
3072 typval_T *tv = tv_arg; | 3073 typval_T *tv = tv_arg; |
3073 typval_T bool_tv; | 3074 typval_T bool_tv; |
3074 dictitem_T *di; | 3075 dictitem_T *di; |
3075 char_u *varname; | 3076 char_u *varname; |
3085 } | 3086 } |
3086 is_script_local = ht == get_script_local_ht(); | 3087 is_script_local = ht == get_script_local_ht(); |
3087 | 3088 |
3088 if (vim9script | 3089 if (vim9script |
3089 && !is_script_local | 3090 && !is_script_local |
3090 && (flags & ASSIGN_NO_DECL) == 0 | 3091 && (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0 |
3091 && (flags & (ASSIGN_CONST | ASSIGN_FINAL)) == 0 | 3092 && (flags & (ASSIGN_CONST | ASSIGN_FINAL)) == 0 |
3092 && name[1] == ':') | 3093 && name[1] == ':') |
3093 { | 3094 { |
3094 vim9_declare_error(name); | 3095 vim9_declare_error(name); |
3095 goto failed; | 3096 goto failed; |
3124 goto failed; | 3125 goto failed; |
3125 } | 3126 } |
3126 | 3127 |
3127 if (is_script_local && vim9script) | 3128 if (is_script_local && vim9script) |
3128 { | 3129 { |
3129 if ((flags & ASSIGN_NO_DECL) == 0) | 3130 if ((flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0) |
3130 { | 3131 { |
3131 semsg(_(e_redefining_script_item_str), name); | 3132 semsg(_(e_redefining_script_item_str), name); |
3132 goto failed; | 3133 goto failed; |
3133 } | 3134 } |
3134 | 3135 |
3198 } | 3199 } |
3199 } | 3200 } |
3200 | 3201 |
3201 clear_tv(&di->di_tv); | 3202 clear_tv(&di->di_tv); |
3202 } | 3203 } |
3203 else // add a new variable | 3204 else |
3204 { | 3205 { |
3206 // add a new variable | |
3207 if (vim9script && is_script_local && (flags & ASSIGN_NO_DECL)) | |
3208 { | |
3209 semsg(_(e_unknown_variable_str), name); | |
3210 goto failed; | |
3211 } | |
3212 | |
3205 // Can't add "v:" or "a:" variable. | 3213 // Can't add "v:" or "a:" variable. |
3206 if (ht == &vimvarht || ht == get_funccal_args_ht()) | 3214 if (ht == &vimvarht || ht == get_funccal_args_ht()) |
3207 { | 3215 { |
3208 semsg(_(e_illvar), name); | 3216 semsg(_(e_illvar), name); |
3209 goto failed; | 3217 goto failed; |