From 0e3e7ba05fa9cebe17d38def97ecd38a987d02ec Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 13 Jan 2022 20:18:56 +0000 Subject: [PATCH] patch 8.2.4083: Vim9: no test for "vim9script autoload' using script variable Problem: Vim9: no test for "vim9script autoload' and using script variable in the same script. Solution: Add a simple test. Fix uncovered problem. --- src/evalvars.c | 28 +++++++++++++++++++++++++++- src/testdir/test_vim9_import.vim | 18 ++++++++++++------ src/version.c | 2 ++ 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/evalvars.c b/src/evalvars.c index 9bd1cc14c658e8..92dcd76975be6d 100644 --- a/src/evalvars.c +++ b/src/evalvars.c @@ -2874,6 +2874,32 @@ find_var(char_u *name, hashtab_T **htp, int no_autoload) } } + // When using "vim9script autoload" script-local items are prefixed but can + // be used with s:name. + if (SCRIPT_ID_VALID(current_sctx.sc_sid) + && name[0] == 's' && name[1] == ':') + { + scriptitem_T *si = SCRIPT_ITEM(current_sctx.sc_sid); + + if (si->sn_autoload_prefix != NULL) + { + char_u *auto_name = concat_str(si->sn_autoload_prefix, name + 2); + + if (auto_name != NULL) + { + ht = &globvarht; + ret = find_var_in_ht(ht, *name, auto_name, TRUE); + if (ret != NULL) + { + if (htp != NULL) + *htp = ht; + return ret; + } + } + vim_free(auto_name); + } + } + return NULL; } @@ -3318,7 +3344,7 @@ set_var( } /* - * Set variable "name" to value in "tv". + * Set variable "name" to value in "tv_arg". * When "sid" is non-zero "name" is in the script with this ID. * If the variable already exists and "is_const" is FALSE the value is updated. * Otherwise the variable is created. diff --git a/src/testdir/test_vim9_import.vim b/src/testdir/test_vim9_import.vim index e9d94734a30459..24aa28da2ac8a3 100644 --- a/src/testdir/test_vim9_import.vim +++ b/src/testdir/test_vim9_import.vim @@ -1091,7 +1091,7 @@ def Test_import_gone_when_sourced_twice() enddef " test using an auto-loaded function and variable -def Test_vim9_autoload() +def Test_vim9_autoload_full_name() var lines =<< trim END vim9script def some#gettest(): string @@ -1146,11 +1146,16 @@ def Test_vim9script_autoload() return 'test' enddef - export func GetMore() - return Gettest() .. 'more' + export var name = 'name' + + export func GetFunc() + return Gettest() .. 'more' .. s:name endfunc - export var name = 'name' + export def GetDef(): string + return Gettest() .. 'more' .. name + enddef + export final fname = 'final' export const cname = 'const' END @@ -1165,7 +1170,8 @@ def Test_vim9script_autoload() assert_equal('test', prefixed.Gettest()) assert_equal(1, g:prefixed_loaded) - assert_equal('testmore', prefixed.GetMore()) + assert_equal('testmorename', prefixed.GetFunc()) + assert_equal('testmorename', prefixed.GetDef()) assert_equal('name', prefixed.name) assert_equal('final', prefixed.fname) assert_equal('const', prefixed.cname) @@ -1178,7 +1184,7 @@ def Test_vim9script_autoload() # can also get the items by autoload name lines =<< trim END call assert_equal('test', prefixed#Gettest()) - call assert_equal('testmore', prefixed#GetMore()) + call assert_equal('testmorename', prefixed#GetFunc()) call assert_equal('name', prefixed#name) call assert_equal('final', prefixed#fname) call assert_equal('const', prefixed#cname) diff --git a/src/version.c b/src/version.c index 2a2c3de50bd3b6..ecfa17d4563982 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4083, /**/ 4082, /**/