changeset 24377:f9f8cceaece3 v8.2.2729

patch 8.2.2729: Vim9: wrong error message for referring to legacy script var Commit: https://github.com/vim/vim/commit/643ce6c0c694667a2afd24bb39d8e9d36d94d7a9 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Apr 6 21:17:27 2021 +0200 patch 8.2.2729: Vim9: wrong error message for referring to legacy script var 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)
author Bram Moolenaar <Bram@vim.org>
date Tue, 06 Apr 2021 21:30:04 +0200
parents d9b9f9e0c7ee
children a64ba8b570d0
files src/testdir/test_vim9_assign.vim src/version.c src/vim9compile.c
diffstat 3 files changed, 40 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -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
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2729,
+/**/
     2728,
 /**/
     2727,
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -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);