diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-04-07 21:21:13 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-04-07 21:21:13 +0200 |
commit | 15e5e53ef29a457126f7c699931ab5842431f2ea (patch) | |
tree | 53630cc1e055063999dd34c68d8c77fbd03105ea | |
parent | 130cbfc31235c6cb52ffe718ea0a5bb50fbbc9fd (diff) | |
download | vim-git-15e5e53ef29a457126f7c699931ab5842431f2ea.tar.gz |
patch 8.2.2734: Vim9: cannot use legacy script-local var from :def functionv8.2.2734
Problem: Vim9: cannot use legacy script-local var from :def function.
Solution: Do not insist on using "s:" prefix. (closes #8076)
-rw-r--r-- | src/proto/vim9compile.pro | 1 | ||||
-rw-r--r-- | src/testdir/test_vim9_expr.vim | 15 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 23 |
4 files changed, 25 insertions, 16 deletions
diff --git a/src/proto/vim9compile.pro b/src/proto/vim9compile.pro index 05d399867..39624aef1 100644 --- a/src/proto/vim9compile.pro +++ b/src/proto/vim9compile.pro @@ -1,5 +1,4 @@ /* vim9compile.c */ -int script_var_exists(char_u *name, size_t len, int vim9script, cctx_T *cctx); int check_defined(char_u *p, size_t len, cctx_T *cctx, int is_arg); int check_compare_types(exprtype_T type, typval_T *tv1, typval_T *tv2); int use_typecheck(type_T *actual, type_T *expected); diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim index 4e1e3d7fa..c86379eb1 100644 --- a/src/testdir/test_vim9_expr.vim +++ b/src/testdir/test_vim9_expr.vim @@ -2714,6 +2714,21 @@ def Test_expr7_negate_add() CheckDefAndScriptFailure(lines, 'E1050:') enddef +def Test_expr7_legacy_script() + var lines =<< trim END + let s:legacy = 'legacy' + def GetLocal(): string + return legacy + enddef + def GetLocalPrefix(): string + return s:legacy + enddef + call assert_equal('legacy', GetLocal()) + call assert_equal('legacy', GetLocalPrefix()) + END + CheckScriptSuccess(lines) +enddef + def Echo(arg: any): string return arg enddef diff --git a/src/version.c b/src/version.c index 58d6d9f17..4eea2f185 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2734, +/**/ 2733, /**/ 2732, diff --git a/src/vim9compile.c b/src/vim9compile.c index feb1838b7..c4b5d3c1c 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -332,22 +332,15 @@ script_is_vim9() /* * Lookup a variable (without s: prefix) in the current script. - * If "vim9script" is TRUE the script must be Vim9 script. Used for "var" - * without "s:". * "cctx" is NULL at the script level. * Returns OK or FAIL. */ - int -script_var_exists(char_u *name, size_t len, int vim9script, cctx_T *cctx) + static int +script_var_exists(char_u *name, size_t len, cctx_T *cctx) { - int is_vim9_script; - if (current_sctx.sc_sid <= 0) return FAIL; - is_vim9_script = script_is_vim9(); - if (vim9script && !is_vim9_script) - return FAIL; - if (is_vim9_script) + if (script_is_vim9()) { // Check script variables that were visible where the function was // defined. @@ -382,7 +375,7 @@ variable_exists(char_u *name, size_t len, cctx_T *cctx) return (cctx != NULL && (lookup_local(name, len, NULL, cctx) == OK || arg_exists(name, len, NULL, NULL, NULL, cctx) == OK)) - || script_var_exists(name, len, FALSE, cctx) == OK + || script_var_exists(name, len, cctx) == OK || find_imported(name, len, cctx) != NULL; } @@ -429,7 +422,7 @@ check_defined(char_u *p, size_t len, cctx_T *cctx, int is_arg) int c = p[len]; ufunc_T *ufunc = NULL; - if (script_var_exists(p, len, FALSE, cctx) == OK) + if (script_var_exists(p, len, cctx) == OK) { if (is_arg) semsg(_(e_argument_already_declared_in_script_str), p); @@ -2990,7 +2983,7 @@ compile_load( { // "var" can be script-local even without using "s:" if it // already exists in a Vim9 script or when it's imported. - if (script_var_exists(*arg, len, TRUE, cctx) == OK + if (script_var_exists(*arg, len, cctx) == OK || find_imported(name, 0, cctx) != NULL) res = compile_load_scriptvar(cctx, name, *arg, &end, FALSE); @@ -5844,9 +5837,9 @@ compile_lhs( && STRNCMP(var_start, "s:", 2) == 0; int script_var = (script_namespace ? script_var_exists(var_start + 2, lhs->lhs_varlen - 2, - FALSE, cctx) + cctx) : script_var_exists(var_start, lhs->lhs_varlen, - FALSE, cctx)) == OK; + cctx)) == OK; imported_T *import = find_imported(var_start, lhs->lhs_varlen, cctx); |