]> granicus.if.org Git - vim/commitdiff
patch 8.2.4030: a script local funcref is not found from a mapping v8.2.4030
authorBram Moolenaar <Bram@vim.org>
Fri, 7 Jan 2022 18:20:55 +0000 (18:20 +0000)
committerBram Moolenaar <Bram@vim.org>
Fri, 7 Jan 2022 18:20:55 +0000 (18:20 +0000)
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)

src/evalvars.c
src/proto/evalvars.pro
src/testdir/test_vim9_script.vim
src/userfunc.c
src/version.c

index 730c7d12280d88799fffc88b7b04d3b0d687fd6a..965b2048e4d9f8a9dac29fc2eef14abd08304b2c 100644 (file)
@@ -2690,7 +2690,7 @@ eval_variable(
        {
            if ((flags & EVAL_VAR_IMPORT) == 0)
            {
-               if (sid != 0 && SCRIPT_ID_VALID(sid))
+               if (SCRIPT_ID_VALID(sid))
                {
                    ht = &SCRIPT_VARS(sid);
                    if (ht != NULL)
@@ -2877,6 +2877,35 @@ find_var(char_u *name, hashtab_T **htp, int no_autoload)
     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".
  * When "varname" is empty returns curwin/curtab/etc vars dictionary.
index de1f7a1f3d807419f62385f7a5243623099e69f0..487f88b61d7a701f435d4dd21fb4349a3aa12622 100644 (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);
 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_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);
 hashtab_T *get_script_local_ht(void);
 int lookup_scriptitem(char_u *name, size_t len, int cmd, cctx_T *dummy);
index faa26719dfd0ab0568b5ec9aae952e80eca8d357..b6dcf36212c178104205b1373bd03eb8dfb46a98 100644 (file)
@@ -1662,32 +1662,31 @@ def Test_import_in_filetype()
   &rtp = save_rtp
 enddef
 
-" FIXME
-"def Test_use_import_in_mapping()
-"  var lines =<< trim END
-"      vim9script
-"      export def Funcx()
-"        g:result = 42
-"      enddef
-"  END
-"  writefile(lines, 'XsomeExport.vim')
-"  lines =<< trim END
-"      vim9script
-"      import './XsomeExport.vim' as some
-"      var Funcy = some.Funcx
-"      nnoremap <F3> :call <sid>Funcy()<cr>
-"  END
-"  writefile(lines, 'Xmapscript.vim')
-"
-"  source Xmapscript.vim
-"  feedkeys("\<F3>", "xt")
-"  assert_equal(42, g:result)
-"
-"  unlet g:result
-"  delete('XsomeExport.vim')
-"  delete('Xmapscript.vim')
-"  nunmap <F3>
-"enddef
+def Test_use_import_in_mapping()
+  var lines =<< trim END
+      vim9script
+      export def Funcx()
+        g:result = 42
+      enddef
+  END
+  writefile(lines, 'XsomeExport.vim')
+  lines =<< trim END
+      vim9script
+      import './XsomeExport.vim' as some
+      var Funcy = some.Funcx
+      nnoremap <F3> :call <sid>Funcy()<cr>
+  END
+  writefile(lines, 'Xmapscript.vim')
+
+  source Xmapscript.vim
+  feedkeys("\<F3>", "xt")
+  assert_equal(42, g:result)
+
+  unlet g:result
+  delete('XsomeExport.vim')
+  delete('Xmapscript.vim')
+  nunmap <F3>
+enddef
 
 def Test_vim9script_mix()
   var lines =<< trim END
index 7446d6ec93870e32fcea3147c55f33ce08be101a..6821569b686cde8f435fdb0c4554a7f7367fe6c6 100644 (file)
@@ -1589,7 +1589,7 @@ deref_func_name(
     cc = name[*lenp];
     name[*lenp] = NUL;
 
-    v = find_var(name, &ht, no_autoload);
+    v = find_var_also_in_script(name, &ht, no_autoload);
     name[*lenp] = cc;
     if (v != NULL)
     {
index 5bd5f836d24942472a4860ad60f18122a8a775ae..5658467464584935d39d2fbf8e0e86e1a62a1c1b 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4030,
 /**/
     4029,
 /**/