changeset 29759:d19adfd545e2 v9.0.0219

patch 9.0.0219: cannot make a funcref with "s:func" in a def function Commit: https://github.com/vim/vim/commit/948a3894d98f5e2a6e7fc57189fe9c2a5919eebf Author: Kota Kato <github@kat0h.com> Date: Tue Aug 16 16:09:59 2022 +0100 patch 9.0.0219: cannot make a funcref with "s:func" in a def function Problem: Cannot make a funcref with "s:func" in a def function in legacy script. Solution: Allow for using a lower case function name after "s:". (Kota Kato, closes #10926)
author Bram Moolenaar <Bram@vim.org>
date Tue, 16 Aug 2022 17:15:03 +0200
parents 7e306219b233
children 946d96da668b
files src/testdir/test_vim9_func.vim src/userfunc.c src/version.c src/vim9expr.c
diffstat 4 files changed, 45 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -1957,6 +1957,45 @@ def Test_call_funcref()
     g:listarg->assert_equal([1, 2, 3])
   END
   v9.CheckScriptSuccess(lines)
+
+  lines =<< trim END
+    function s:func(num)
+      return a:num * 2
+    endfunction
+
+    def s:CallFuncref()
+      var Funcref = function('s:func')
+      Funcref(3)->assert_equal(6)
+    enddef
+    call s:CallFuncref()
+  END
+  v9.CheckScriptSuccess(lines)
+
+  lines =<< trim END
+    function s:func(num)
+      return a:num * 2
+    endfunction
+
+    def s:CallFuncref()
+      var Funcref = function(s:func)
+      Funcref(3)->assert_equal(6)
+    enddef
+    call s:CallFuncref()
+  END
+  v9.CheckScriptSuccess(lines)
+
+  lines =<< trim END
+    function s:func(num)
+      return a:num * 2
+    endfunction
+
+    def s:CallFuncref()
+      var Funcref = s:func
+      Funcref(3)->assert_equal(6)
+    enddef
+    call s:CallFuncref()
+  END
+  v9.CheckScriptSuccess(lines)
 enddef
 
 let SomeFunc = function('len')
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -3995,7 +3995,8 @@ trans_function_name(
     {
 	if (!vim9_local)
 	{
-	    if (vim9script && lead == 2 && !ASCII_ISUPPER(*lv.ll_name))
+	    if (vim9script && lead == 2 && !ASCII_ISUPPER(*lv.ll_name)
+						   && current_script_is_vim9())
 	    {
 		semsg(_(e_function_name_must_start_with_capital_str), start);
 		goto theend;
--- a/src/version.c
+++ b/src/version.c
@@ -736,6 +736,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    219,
+/**/
     218,
 /**/
     217,
--- a/src/vim9expr.c
+++ b/src/vim9expr.c
@@ -8,7 +8,7 @@
  */
 
 /*
- * vim9cmds.c: Dealing with compiled function expressions
+ * vim9expr.c: Dealing with compiled function expressions
  */
 
 #define USING_FLOAT_STUFF
@@ -451,8 +451,7 @@ compile_load(
 			      vim_free(name);
 			      return FAIL;
 			  }
-			  if (is_expr && ASCII_ISUPPER(*name)
-					     && find_func(name, FALSE) != NULL)
+			  if (is_expr && find_func(name, FALSE) != NULL)
 			      res = generate_funcref(cctx, name, FALSE);
 			  else
 			      res = compile_load_scriptvar(cctx, name,