# HG changeset patch # User Bram Moolenaar # Date 1617823804 -7200 # Node ID 72f3e40f046c6de61fe3bfb60391c6961d8605f0 # Parent 5c98ea5f5d6e65a0cd13d643913295fdf283c5af patch 8.2.2734: Vim9: cannot use legacy script-local var from :def function Commit: https://github.com/vim/vim/commit/15e5e53ef29a457126f7c699931ab5842431f2ea Author: Bram Moolenaar Date: Wed Apr 7 21:21:13 2021 +0200 patch 8.2.2734: Vim9: cannot use legacy script-local var from :def function Problem: Vim9: cannot use legacy script-local var from :def function. Solution: Do not insist on using "s:" prefix. (closes https://github.com/vim/vim/issues/8076) diff --git a/src/proto/vim9compile.pro b/src/proto/vim9compile.pro --- 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 --- 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 --- 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 --- 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) -{ - int is_vim9_script; - + static int +script_var_exists(char_u *name, size_t len, cctx_T *cctx) +{ 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 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, cct 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);