Mercurial > vim
diff src/vim9compile.c @ 23966:09bde146adcb v8.2.2525
patch 8.2.2525: Vim9: only local variables checked for a name
Commit: https://github.com/vim/vim/commit/e0890d678d4d31ca1810c90f3afe2ba89dfedcfa
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Feb 17 14:52:14 2021 +0100
patch 8.2.2525: Vim9: only local variables checked for a name
Problem: Vim9: only local variables checked for a name.
Solution: Also check arguments and script variables. (closes https://github.com/vim/vim/issues/7838)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 17 Feb 2021 15:00:04 +0100 |
parents | 9854b4c6d5e6 |
children | 54b2aa1f0d42 |
line wrap: on
line diff
--- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -373,6 +373,19 @@ script_var_exists(char_u *name, size_t l } /* + * Return TRUE if "name" is a local variable, argument, script variable or + * imported. + */ + static int +variable_exists(char_u *name, size_t len, cctx_T *cctx) +{ + return lookup_local(name, len, NULL, cctx) == OK + || arg_exists(name, len, NULL, NULL, NULL, cctx) == OK + || script_var_exists(name, len, FALSE, cctx) == OK + || find_imported(name, len, cctx) != NULL; +} + +/* * Check if "p[len]" is already defined, either in script "import_sid" or in * compilation context "cctx". "cctx" is NULL at the script level. * Does not check the global namespace. @@ -6444,10 +6457,7 @@ may_compile_assignment(exarg_T *eap, cha || *eap->cmd == '$' || *eap->cmd == '@' || ((len) > 2 && eap->cmd[1] == ':') - || lookup_local(eap->cmd, len, NULL, cctx) == OK - || arg_exists(eap->cmd, len, NULL, NULL, NULL, cctx) == OK - || script_var_exists(eap->cmd, len, FALSE, cctx) == OK - || find_imported(eap->cmd, len, cctx) != NULL) + || variable_exists(eap->cmd, len, cctx)) { *line = compile_assignment(eap->cmd, eap, CMD_SIZE, cctx); if (*line == NULL || *line == eap->cmd) @@ -8332,7 +8342,7 @@ compile_def_function( } } p = find_ex_command(&ea, NULL, starts_with_colon ? NULL - : (int (*)(char_u *, size_t, void *, cctx_T *))lookup_local, + : (int (*)(char_u *, size_t, cctx_T *))variable_exists, &cctx); if (p == NULL)