]> granicus.if.org Git - vim/commitdiff
patch 8.2.2729: Vim9: wrong error message for referring to legacy script var v8.2.2729
authorBram Moolenaar <Bram@vim.org>
Tue, 6 Apr 2021 19:17:27 +0000 (21:17 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 6 Apr 2021 19:17:27 +0000 (21:17 +0200)
Problem:    Vim9: wrong error message for referring to legacy script variable.
Solution:   Do allow referring to a variable in legacy script without "s:" if
            it exists at compile time. (closes #8076)

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

index 73351b44f4483027b6c9521e942c14f691d2bfe1..c35084d55046f4802035d65fa4df91c666060923 100644 (file)
@@ -1476,6 +1476,41 @@ def Test_var_declaration_fails()
   CheckDefFailure(['const foo: number'], 'E1021:')
 enddef
 
+def Test_script_local_in_legacy()
+  # OK to define script-local later when prefixed with s:
+  var lines =<< trim END
+    def SetLater()
+      s:legacy = 'two'
+    enddef
+    defcompile
+    let s:legacy = 'one'
+    call SetLater()
+    call assert_equal('two', s:legacy)
+  END
+  CheckScriptSuccess(lines)
+
+  # OK to leave out s: prefix when script-local already defined
+  lines =<< trim END
+    let s:legacy = 'one'
+    def SetNoPrefix()
+      legacy = 'two'
+    enddef
+    call SetNoPrefix()
+    call assert_equal('two', s:legacy)
+  END
+  CheckScriptSuccess(lines)
+
+  # Not OK to leave out s: prefix when script-local defined later
+  lines =<< trim END
+    def SetLaterNoPrefix()
+      legacy = 'two'
+    enddef
+    defcompile
+    let s:legacy = 'one'
+  END
+  CheckScriptFailure(lines, 'E476:', 1)
+enddef
+
 def Test_var_type_check()
   var lines =<< trim END
     vim9script
index f041987844313f7c8b86b65107d399361c164335..8d44824a19aec2c6923ca010f8bf71610c8b5876 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2729,
 /**/
     2728,
 /**/
index 6ff00f7d49ad2b4be99714f931cd798de3580155..c9ca5953fc681d00ac1be424f3c17d1768a2cafc 100644 (file)
@@ -5708,17 +5708,9 @@ generate_store_var(
            return generate_STORE(cctx, ISN_STOREV, vimvaridx, NULL);
        case dest_script:
            if (scriptvar_idx < 0)
-           {
-               char_u  *name_s = name;
-               int     r;
-
-               // "s:" is included in the name.
-               r = generate_OLDSCRIPT(cctx, ISN_STORES, name_s,
+               // "s:" may be included in the name.
+               return generate_OLDSCRIPT(cctx, ISN_STORES, name,
                                                          scriptvar_sid, type);
-               if (name_s != name)
-                   vim_free(name_s);
-               return r;
-           }
            return generate_VIM9SCRIPT(cctx, ISN_STORESCRIPT,
                                           scriptvar_sid, scriptvar_idx, type);
        case dest_local:
@@ -5854,7 +5846,7 @@ compile_lhs(
                        ? script_var_exists(var_start + 2, lhs->lhs_varlen - 2,
                                                               FALSE, cctx)
                          : script_var_exists(var_start, lhs->lhs_varlen,
-                                                           TRUE, cctx)) == OK;
+                                                          FALSE, cctx)) == OK;
                imported_T  *import =
                               find_imported(var_start, lhs->lhs_varlen, cctx);