]> granicus.if.org Git - vim/commitdiff
patch 8.2.1515: Vim9: can create s:var in legacy script but cannot unlet v8.2.1515
authorBram Moolenaar <Bram@vim.org>
Sun, 23 Aug 2020 13:21:55 +0000 (15:21 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 23 Aug 2020 13:21:55 +0000 (15:21 +0200)
Problem:    Vim9: can create s:var in legacy script but cannot unlet.
Solution:   Allow :unlet for legacy script var.

src/testdir/test_vim9_script.vim
src/version.c
src/vim9compile.c

index 5a251473cdd0fa4ed10fdd9c87775ca1db346920..05b4e9f0224bef6185234c20ad01979992cc20ef 100644 (file)
@@ -608,6 +608,13 @@ def Test_unlet()
   assert_false(exists('g:somevar'))
   unlet! g:somevar
 
+  # also works for script-local variable in legacy Vim script
+  s:somevar = 'legacy'
+  assert_true(exists('s:somevar'))
+  unlet s:somevar
+  assert_false(exists('s:somevar'))
+  unlet! s:somevar
+
   call CheckScriptFailure([
         'vim9script',
         'let svar = 123',
index 02457eb5e9ef12c1bb3ded547b69e5723f833f66..65b9d0fd721fcf1e23ffa9167af477e1d76a14b3 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1515,
 /**/
     1514,
 /**/
index e4b7d44adbfbe1831ba301d1d68c9aa576e9bf2d..c0cea2992cdd488bf187aa4a2d66be78164f4371 100644 (file)
@@ -258,6 +258,15 @@ lookup_arg(
     return FAIL;
 }
 
+/*
+ * Returnd TRUE if the script context is Vim9 script.
+ */
+    static int
+script_is_vim9()
+{
+    return SCRIPT_ITEM(current_sctx.sc_sid)->sn_version == SCRIPT_VERSION_VIM9;
+}
+
 /*
  * Lookup a variable in the current script.
  * If "vim9script" is TRUE the script must be Vim9 script.  Used for "var"
@@ -271,8 +280,7 @@ lookup_script(char_u *name, size_t len, int vim9script)
     hashtab_T      *ht = &SCRIPT_VARS(current_sctx.sc_sid);
     dictitem_T     *di;
 
-    if (vim9script && SCRIPT_ITEM(current_sctx.sc_sid)->sn_version
-                                                       != SCRIPT_VERSION_VIM9)
+    if (vim9script && !script_is_vim9())
        return FAIL;
     cc = name[len];
     name[len] = NUL;
@@ -5234,6 +5242,9 @@ check_vim9_unlet(char_u *name)
 {
     if (name[1] != ':' || vim_strchr((char_u *)"gwtb", *name) == NULL)
     {
+       // "unlet s:var" is allowed in legacy script.
+       if (*name == 's' && !script_is_vim9())
+           return OK;
        semsg(_(e_cannot_unlet_str), name);
        return FAIL;
     }