]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.2734: Vim9: cannot use legacy script-local var from :def function v8.2.2734
authorBram Moolenaar <Bram@vim.org>
Wed, 7 Apr 2021 19:21:13 +0000 (21:21 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 7 Apr 2021 19:21:13 +0000 (21:21 +0200)
Problem:    Vim9: cannot use legacy script-local var from :def function.
Solution:   Do not insist on using "s:" prefix. (closes #8076)

src/proto/vim9compile.pro
src/testdir/test_vim9_expr.vim
src/version.c
src/vim9compile.c

index 05d399867b57ef86f363d4ee8407f8a18c619c63..39624aef1979fefc3675efe86d78aea4c4388d3c 100644 (file)
@@ -1,5 +1,4 @@
 /* vim9compile.c */
-int script_var_exists(char_u *name, size_t len, int vim9script, cctx_T *cctx);
 int check_defined(char_u *p, size_t len, cctx_T *cctx, int is_arg);
 int check_compare_types(exprtype_T type, typval_T *tv1, typval_T *tv2);
 int use_typecheck(type_T *actual, type_T *expected);
index 4e1e3d7faed02460d7c3793303b80e5d1a899775..c86379eb1af384dc952753cf2c8c5c0b7d80e184 100644 (file)
@@ -2714,6 +2714,21 @@ def Test_expr7_negate_add()
   CheckDefAndScriptFailure(lines, 'E1050:')
 enddef
 
+def Test_expr7_legacy_script()
+  var lines =<< trim END
+      let s:legacy = 'legacy'
+      def GetLocal(): string
+        return legacy
+      enddef
+      def GetLocalPrefix(): string
+        return s:legacy
+      enddef
+      call assert_equal('legacy', GetLocal())
+      call assert_equal('legacy', GetLocalPrefix())
+  END
+  CheckScriptSuccess(lines)
+enddef
+
 def Echo(arg: any): string
   return arg
 enddef
index 58d6d9f1723144ec7d397463e16d884545996cc8..4eea2f18559ddfb64e0d5fe5d58cae7ce1aa42cb 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2734,
 /**/
     2733,
 /**/
index feb1838b7b9a65aa768edc7da1357dd5f5035724..c4b5d3c1c0f88a85c7218a0dedf6507ede354534 100644 (file)
@@ -332,22 +332,15 @@ script_is_vim9()
 
 /*
  * Lookup a variable (without s: prefix) in the current script.
- * If "vim9script" is TRUE the script must be Vim9 script.  Used for "var"
- * without "s:".
  * "cctx" is NULL at the script level.
  * Returns OK or FAIL.
  */
-    int
-script_var_exists(char_u *name, size_t len, int vim9script, cctx_T *cctx)
+    static int
+script_var_exists(char_u *name, size_t len, cctx_T *cctx)
 {
-    int                    is_vim9_script;
-
     if (current_sctx.sc_sid <= 0)
        return FAIL;
-    is_vim9_script = script_is_vim9();
-    if (vim9script && !is_vim9_script)
-       return FAIL;
-    if (is_vim9_script)
+    if (script_is_vim9())
     {
        // Check script variables that were visible where the function was
        // defined.
@@ -382,7 +375,7 @@ variable_exists(char_u *name, size_t len, cctx_T *cctx)
     return (cctx != NULL
                && (lookup_local(name, len, NULL, cctx) == OK
                    || arg_exists(name, len, NULL, NULL, NULL, cctx) == OK))
-           || script_var_exists(name, len, FALSE, cctx) == OK
+           || script_var_exists(name, len, cctx) == OK
            || find_imported(name, len, cctx) != NULL;
 }
 
@@ -429,7 +422,7 @@ check_defined(char_u *p, size_t len, cctx_T *cctx, int is_arg)
     int                c = p[len];
     ufunc_T    *ufunc = NULL;
 
-    if (script_var_exists(p, len, FALSE, cctx) == OK)
+    if (script_var_exists(p, len, cctx) == OK)
     {
        if (is_arg)
            semsg(_(e_argument_already_declared_in_script_str), p);
@@ -2990,7 +2983,7 @@ compile_load(
            {
                // "var" can be script-local even without using "s:" if it
                // already exists in a Vim9 script or when it's imported.
-               if (script_var_exists(*arg, len, TRUE, cctx) == OK
+               if (script_var_exists(*arg, len, cctx) == OK
                        || find_imported(name, 0, cctx) != NULL)
                   res = compile_load_scriptvar(cctx, name, *arg, &end, FALSE);
 
@@ -5844,9 +5837,9 @@ compile_lhs(
                                       && STRNCMP(var_start, "s:", 2) == 0;
                int script_var = (script_namespace
                        ? script_var_exists(var_start + 2, lhs->lhs_varlen - 2,
-                                                              FALSE, cctx)
+                                                                         cctx)
                          : script_var_exists(var_start, lhs->lhs_varlen,
-                                                          FALSE, cctx)) == OK;
+                                                                 cctx)) == OK;
                imported_T  *import =
                               find_imported(var_start, lhs->lhs_varlen, cctx);