changeset 21479:90d859a402cc v8.2.1290

patch 8.2.1290: Vim9: cannot replace a global function Commit: https://github.com/vim/vim/commit/925e9fd6339981c1015410e1b6a6dd19e34f36cc Author: Bram Moolenaar <Bram@vim.org> Date: Sat Jul 25 15:41:11 2020 +0200 patch 8.2.1290: Vim9: cannot replace a global function Problem: Vim9: cannot replace a global function. Solution: Allow for "!" on a global function. (closes https://github.com/vim/vim/issues/6524) Also fix that :delfunc on a :def function only made it empty.
author Bram Moolenaar <Bram@vim.org>
date Sat, 25 Jul 2020 15:45:04 +0200
parents d452597ad7ff
children 440d226ff54a
files src/testdir/test_vim9_script.vim src/userfunc.c src/version.c
diffstat 3 files changed, 59 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -468,6 +468,54 @@ def Test_delfunction()
       'enddef',
       'DoThat()',
       ], 'E1084:')
+
+  # Check that global :def function can be replaced and deleted
+  let lines =<< trim END
+      vim9script
+      def g:Global(): string
+        return "yes"
+      enddef
+      assert_equal("yes", g:Global())
+      def! g:Global(): string
+        return "no"
+      enddef
+      assert_equal("no", g:Global())
+      delfunc g:Global
+      assert_false(exists('*g:Global'))
+  END
+  CheckScriptSuccess(lines)
+
+  # Check that global function can be replaced by a :def function and deleted
+  lines =<< trim END
+      vim9script
+      func g:Global()
+        return "yes"
+      endfunc
+      assert_equal("yes", g:Global())
+      def! g:Global(): string
+        return "no"
+      enddef
+      assert_equal("no", g:Global())
+      delfunc g:Global
+      assert_false(exists('*g:Global'))
+  END
+  CheckScriptSuccess(lines)
+
+  # Check that global :def function can be replaced by a function and deleted
+  lines =<< trim END
+      vim9script
+      def g:Global(): string
+        return "yes"
+      enddef
+      assert_equal("yes", g:Global())
+      func! g:Global()
+        return "no"
+      endfunc
+      assert_equal("no", g:Global())
+      delfunc g:Global
+      assert_false(exists('*g:Global'))
+  END
+  CheckScriptSuccess(lines)
 enddef
 
 func Test_wrong_type()
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -1148,6 +1148,8 @@ func_clear_free(ufunc_T *fp, int force)
     func_clear(fp, force);
     if (force || fp->uf_dfunc_idx == 0)
 	func_free(fp, force);
+    else
+	fp->uf_flags |= FC_DEAD;
 }
 
 
@@ -2557,12 +2559,6 @@ def_function(exarg_T *eap, char_u *name_
     char_u	*heredoc_trimmed = NULL;
     int		vim9script = in_vim9script();
 
-    if (vim9script && eap->forceit)
-    {
-	emsg(_(e_nobang));
-	return NULL;
-    }
-
     /*
      * ":function" without argument: list functions.
      */
@@ -2732,6 +2728,13 @@ def_function(exarg_T *eap, char_u *name_
     }
     p = skipwhite(p + 1);
 
+    // In Vim9 script only global functions can be redefined.
+    if (vim9script && eap->forceit && !is_global)
+    {
+	emsg(_(e_nobang));
+	goto ret_free;
+    }
+
     ga_init2(&newlines, (int)sizeof(char_u *), 3);
 
     if (!eap->skip && name_arg == NULL)
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1290,
+/**/
     1289,
 /**/
     1288,