Mercurial > vim
diff src/vim9compile.c @ 31590:aee868b9229a v9.0.1127
patch 9.0.1127: no error if function argument shadows class member
Commit: https://github.com/vim/vim/commit/6acf757c6a11c0653b0132a17c22983856da5ad6
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Jan 1 19:53:30 2023 +0000
patch 9.0.1127: no error if function argument shadows class member
Problem: No error if function argument shadows class member.
Solution: Give an error for shadowing a class member.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 01 Jan 2023 21:00:03 +0100 |
parents | 67d9fbe516a3 |
children | 394967126db9 |
line wrap: on
line diff
--- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -302,28 +302,6 @@ script_var_exists(char_u *name, size_t l } /* - * If "name" is a class member in cctx->ctx_ufunc->uf_class return the index in - * class.class_class_members[]. - * Otherwise return -1; - */ - static int -class_member_index(char_u *name, size_t len, cctx_T *cctx) -{ - if (cctx == NULL || cctx->ctx_ufunc == NULL - || cctx->ctx_ufunc->uf_class == NULL) - return -1; - class_T *cl = cctx->ctx_ufunc->uf_class; - for (int i = 0; i < cl->class_class_member_count; ++i) - { - ocmember_T *m = &cl->class_class_members[i]; - if (STRNCMP(name, m->ocm_name, len) == 0 - && m->ocm_name[len] == NUL) - return i; - } - return -1; -} - -/* * Return TRUE if "name" is a local variable, argument, script variable or * imported. */ @@ -338,7 +316,7 @@ variable_exists(char_u *name, size_t len && (cctx->ctx_ufunc->uf_flags & FC_OBJECT) && STRNCMP(name, "this", 4) == 0))) || script_var_exists(name, len, cctx, NULL) == OK - || class_member_index(name, len, cctx) >= 0 + || class_member_index(name, len, NULL, cctx) >= 0 || find_imported(name, len, FALSE) != NULL; } @@ -376,9 +354,6 @@ check_defined( if (len == 1 && *p == '_') return OK; - if (class_member_index(p, len, cctx) >= 0) - return OK; - if (script_var_exists(p, len, cctx, cstack) == OK) { if (is_arg) @@ -388,6 +363,15 @@ check_defined( return FAIL; } + if (class_member_index(p, len, NULL, cctx) >= 0) + { + if (is_arg) + semsg(_(e_argument_already_declared_in_class_str), p); + else + semsg(_(e_variable_already_declared_in_class_str), p); + return FAIL; + } + p[len] = NUL; if ((cctx != NULL && (lookup_local(p, len, NULL, cctx) == OK @@ -1592,8 +1576,14 @@ compile_lhs( } } else if ((lhs->lhs_classmember_idx = class_member_index( - var_start, lhs->lhs_varlen, cctx)) >= 0) + var_start, lhs->lhs_varlen, NULL, cctx)) >= 0) { + if (is_decl) + { + semsg(_(e_variable_already_declared_in_class_str), + lhs->lhs_name); + return FAIL; + } lhs->lhs_dest = dest_class_member; lhs->lhs_class = cctx->ctx_ufunc->uf_class; } @@ -2264,7 +2254,7 @@ compile_assignment( CLEAR_FIELD(lhs); long start_lnum = SOURCING_LNUM; - int has_arg_is_set_prefix = STRNCMP(arg, "ifargisset ", 11) == 0; + int has_arg_is_set_prefix = STRNCMP(arg, "ifargisset ", 11) == 0; if (has_arg_is_set_prefix) { arg += 11;