0
0
mirror of https://github.com/vim/vim.git synced 2025-09-27 04:14:06 -04:00

patch 8.2.4030: a script local funcref is not found from a mapping

Problem:    A script local funcref is not found from a mapping.
Solution:   When looking for a function, also find a script-local funcref.
            (closes #9485)
This commit is contained in:
Bram Moolenaar
2022-01-07 18:20:55 +00:00
parent b2d85e3784
commit 71f21938bc
5 changed files with 59 additions and 28 deletions

View File

@@ -2690,7 +2690,7 @@ eval_variable(
{ {
if ((flags & EVAL_VAR_IMPORT) == 0) if ((flags & EVAL_VAR_IMPORT) == 0)
{ {
if (sid != 0 && SCRIPT_ID_VALID(sid)) if (SCRIPT_ID_VALID(sid))
{ {
ht = &SCRIPT_VARS(sid); ht = &SCRIPT_VARS(sid);
if (ht != NULL) if (ht != NULL)
@@ -2877,6 +2877,35 @@ find_var(char_u *name, hashtab_T **htp, int no_autoload)
return NULL; return NULL;
} }
/*
* Like find_var() but if the name starts with <SNR>99_ then look in the
* referenced script (used for a funcref).
*/
dictitem_T *
find_var_also_in_script(char_u *name, hashtab_T **htp, int no_autoload)
{
if (STRNCMP(name, "<SNR>", 5) == 0 && isdigit(name[5]))
{
char_u *p = name + 5;
int sid = getdigits(&p);
if (SCRIPT_ID_VALID(sid) && *p == '_')
{
hashtab_T *ht = &SCRIPT_VARS(sid);
if (ht != NULL)
{
dictitem_T *di = find_var_in_ht(ht, 0, p + 1, no_autoload);
if (di != NULL)
return di;
}
}
}
return find_var(name, htp, no_autoload);
}
/* /*
* Find variable "varname" in hashtab "ht" with name "htname". * Find variable "varname" in hashtab "ht" with name "htname".
* When "varname" is empty returns curwin/curtab/etc vars dictionary. * When "varname" is empty returns curwin/curtab/etc vars dictionary.

View File

@@ -60,6 +60,7 @@ char_u *set_cmdarg(exarg_T *eap, char_u *oldarg);
int eval_variable(char_u *name, int len, scid_T sid, typval_T *rettv, dictitem_T **dip, int flags); int eval_variable(char_u *name, int len, scid_T sid, typval_T *rettv, dictitem_T **dip, int flags);
void check_vars(char_u *name, int len); void check_vars(char_u *name, int len);
dictitem_T *find_var(char_u *name, hashtab_T **htp, int no_autoload); dictitem_T *find_var(char_u *name, hashtab_T **htp, int no_autoload);
dictitem_T *find_var_also_in_script(char_u *name, hashtab_T **htp, int no_autoload);
dictitem_T *find_var_in_ht(hashtab_T *ht, int htname, char_u *varname, int no_autoload); dictitem_T *find_var_in_ht(hashtab_T *ht, int htname, char_u *varname, int no_autoload);
hashtab_T *get_script_local_ht(void); hashtab_T *get_script_local_ht(void);
int lookup_scriptitem(char_u *name, size_t len, int cmd, cctx_T *dummy); int lookup_scriptitem(char_u *name, size_t len, int cmd, cctx_T *dummy);

View File

@@ -1662,32 +1662,31 @@ def Test_import_in_filetype()
&rtp = save_rtp &rtp = save_rtp
enddef enddef
" FIXME def Test_use_import_in_mapping()
"def Test_use_import_in_mapping() var lines =<< trim END
" var lines =<< trim END vim9script
" vim9script export def Funcx()
" export def Funcx() g:result = 42
" g:result = 42 enddef
" enddef END
" END writefile(lines, 'XsomeExport.vim')
" writefile(lines, 'XsomeExport.vim') lines =<< trim END
" lines =<< trim END vim9script
" vim9script import './XsomeExport.vim' as some
" import './XsomeExport.vim' as some var Funcy = some.Funcx
" var Funcy = some.Funcx nnoremap <F3> :call <sid>Funcy()<cr>
" nnoremap <F3> :call <sid>Funcy()<cr> END
" END writefile(lines, 'Xmapscript.vim')
" writefile(lines, 'Xmapscript.vim')
" source Xmapscript.vim
" source Xmapscript.vim feedkeys("\<F3>", "xt")
" feedkeys("\<F3>", "xt") assert_equal(42, g:result)
" assert_equal(42, g:result)
" unlet g:result
" unlet g:result delete('XsomeExport.vim')
" delete('XsomeExport.vim') delete('Xmapscript.vim')
" delete('Xmapscript.vim') nunmap <F3>
" nunmap <F3> enddef
"enddef
def Test_vim9script_mix() def Test_vim9script_mix()
var lines =<< trim END var lines =<< trim END

View File

@@ -1589,7 +1589,7 @@ deref_func_name(
cc = name[*lenp]; cc = name[*lenp];
name[*lenp] = NUL; name[*lenp] = NUL;
v = find_var(name, &ht, no_autoload); v = find_var_also_in_script(name, &ht, no_autoload);
name[*lenp] = cc; name[*lenp] = cc;
if (v != NULL) if (v != NULL)
{ {

View File

@@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
4030,
/**/ /**/
4029, 4029,
/**/ /**/