0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 9.0.1569: cannot use "this.member" in lambda in class method

Problem:    Cannot use "this.member" in lambda in class method.
Solution:   Adjust check for reserved keyword. (Hirohito Higashi,
            closes #12416, closes #12076, closes #12336)
This commit is contained in:
h-east
2023-05-19 19:01:17 +01:00
committed by Bram Moolenaar
parent d49f646bf5
commit 2bd6a09691
6 changed files with 30 additions and 10 deletions

View File

@@ -1654,7 +1654,7 @@ set_var_lval(
{ {
cc = *endp; cc = *endp;
*endp = NUL; *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; return;
if (lp->ll_blob != NULL) if (lp->ll_blob != NULL)

View 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); 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); 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_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 : */ /* vim: set ft=c : */

View File

@@ -856,6 +856,27 @@ def Test_class_member()
END END
v9.CheckScriptSuccess(lines) 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 # check shadowing
lines =<< trim END lines =<< trim END
vim9script vim9script

View File

@@ -695,6 +695,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1569,
/**/ /**/
1568, 1568,
/**/ /**/

View File

@@ -1580,7 +1580,8 @@ compile_lhs(
else else
{ {
// No specific kind of variable recognized, just a name. // 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; return FAIL;
if (lookup_local(var_start, lhs->lhs_varlen, if (lookup_local(var_start, lhs->lhs_varlen,

View File

@@ -838,7 +838,7 @@ vim9_declare_scriptvar(exarg_T *eap, char_u *arg)
// parse type, check for reserved name // parse type, check for reserved name
p = skipwhite(p + 1); p = skipwhite(p + 1);
type = parse_type(&p, &si->sn_type_list, TRUE); 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); vim_free(name);
return p; return p;
@@ -1127,17 +1127,13 @@ static char *reserved[] = {
}; };
int int
check_reserved_name(char_u *name, cctx_T *cctx) check_reserved_name(char_u *name, int is_objm_access)
{ {
int idx; int idx;
for (idx = 0; reserved[idx] != NULL; ++idx) for (idx = 0; reserved[idx] != NULL; ++idx)
if (STRCMP(reserved[idx], name) == 0 if (STRCMP(reserved[idx], name) == 0
// "this" can be used in an object method && !(STRCMP("this", name) == 0 && is_objm_access))
&& !(STRCMP("this", name) == 0
&& cctx != NULL
&& cctx->ctx_ufunc != NULL
&& (cctx->ctx_ufunc->uf_flags & (FC_OBJECT|FC_NEW))))
{ {
semsg(_(e_cannot_use_reserved_name_str), name); semsg(_(e_cannot_use_reserved_name_str), name);
return FAIL; return FAIL;