]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.1569: cannot use "this.member" in lambda in class method v9.0.1569
authorh-east <h.east.727@gmail.com>
Fri, 19 May 2023 18:01:17 +0000 (19:01 +0100)
committerBram Moolenaar <Bram@vim.org>
Fri, 19 May 2023 18:01:17 +0000 (19:01 +0100)
Problem:    Cannot use "this.member" in lambda in class method.
Solution:   Adjust check for reserved keyword. (Hirohito Higashi,
            closes #12416, closes #12076, closes #12336)

src/eval.c
src/proto/vim9script.pro
src/testdir/test_vim9_class.vim
src/version.c
src/vim9compile.c
src/vim9script.c

index bae728079525d227b81f1f06ec37415c9a2cb13d..b8d954d6a2e47a47f162215a979f707db3030ef7 100644 (file)
@@ -1654,7 +1654,7 @@ set_var_lval(
     {
        cc = *endp;
        *endp = NUL;
-       if (in_vim9script() && check_reserved_name(lp->ll_name, NULL) == FAIL)
+       if (in_vim9script() && check_reserved_name(lp->ll_name, FALSE) == FAIL)
            return;
 
        if (lp->ll_blob != NULL)
index 9a0bcdf37ca985fa24d7023f490041ec9fa4ef7a..1608255544e3c93b284f15768b7107cd3b080141 100644 (file)
@@ -19,5 +19,5 @@ void update_vim9_script_var(int create, dictitem_T *di, char_u *name, int flags,
 void hide_script_var(scriptitem_T *si, int idx, int func_defined);
 svar_T *find_typval_in_script(typval_T *dest, scid_T sid, int must_find);
 int check_script_var_type(svar_T *sv, typval_T *value, char_u *name, where_T where);
-int check_reserved_name(char_u *name, cctx_T *cctx);
+int check_reserved_name(char_u *name, int is_objm_access);
 /* vim: set ft=c : */
index 1aee9e08dc12d42d64122d9f0426834e87d8c9c2..d89b14ea7423357acee08e90ab42b0470055f55d 100644 (file)
@@ -856,6 +856,27 @@ def Test_class_member()
   END
   v9.CheckScriptSuccess(lines)
 
+  # access private member in lambda body
+  lines =<< trim END
+      vim9script
+
+      class Foo
+        this._x: number = 6
+
+        def Add(n: number): number
+          var Lam = () => {
+            this._x = this._x + n
+          }
+          Lam()
+          return this._x
+        enddef
+      endclass
+
+      var foo = Foo.new()
+      assert_equal(13, foo.Add(7))
+  END
+  v9.CheckScriptSuccess(lines)
+
   # check shadowing
   lines =<< trim END
       vim9script
index 54d927e05e6ae6bb8af4fef248586e5821cfd388..f7ea30f211b0020beb7b47b5d6bc43c1b2c56e5b 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1569,
 /**/
     1568,
 /**/
index 265f846618b1ad144ff8ae77f3008accc7666de3..e6663570f09a2d48ac704ce37a2a35bb90f7f11e 100644 (file)
@@ -1580,7 +1580,8 @@ compile_lhs(
        else
        {
            // No specific kind of variable recognized, just a name.
-           if (check_reserved_name(lhs->lhs_name, cctx) == FAIL)
+           if (check_reserved_name(lhs->lhs_name, lhs->lhs_has_index
+                                               && *var_end == '.') == FAIL)
                return FAIL;
 
            if (lookup_local(var_start, lhs->lhs_varlen,
index 5bf2cc7f997eb36b6023a477e2a5a186a48a01cd..b1849db8e04a1943fb1286aedd11e5298b11b39a 100644 (file)
@@ -838,7 +838,7 @@ vim9_declare_scriptvar(exarg_T *eap, char_u *arg)
     // parse type, check for reserved name
     p = skipwhite(p + 1);
     type = parse_type(&p, &si->sn_type_list, TRUE);
-    if (type == NULL || check_reserved_name(name, NULL) == FAIL)
+    if (type == NULL || check_reserved_name(name, FALSE) == FAIL)
     {
        vim_free(name);
        return p;
@@ -1127,17 +1127,13 @@ static char *reserved[] = {
 };
 
     int
-check_reserved_name(char_u *name, cctx_T *cctx)
+check_reserved_name(char_u *name, int is_objm_access)
 {
     int idx;
 
     for (idx = 0; reserved[idx] != NULL; ++idx)
        if (STRCMP(reserved[idx], name) == 0
-               // "this" can be used in an object method
-               && !(STRCMP("this", name) == 0
-                   && cctx != NULL
-                   && cctx->ctx_ufunc != NULL
-                   && (cctx->ctx_ufunc->uf_flags & (FC_OBJECT|FC_NEW))))
+               && !(STRCMP("this", name) == 0 && is_objm_access))
        {
            semsg(_(e_cannot_use_reserved_name_str), name);
            return FAIL;