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

patch 8.2.3055: strange error for assigning to "x.key" on non-dictionary

Problem:    Strange error for assigning to "x.key" on non-dictionary.
Solution:   Add a specific error message. (closes #8451)
This commit is contained in:
Bram Moolenaar
2021-06-26 15:00:59 +02:00
parent 4d5dfe2083
commit 3a3b10e87a
6 changed files with 21 additions and 2 deletions

View File

@@ -448,3 +448,5 @@ EXTERN char e_libsodium_decryption_failed_premature[]
INIT(= N_("E1201: Decryption failed: pre-mature end of file!")); INIT(= N_("E1201: Decryption failed: pre-mature end of file!"));
EXTERN char e_no_white_space_allowed_after_str_str[] EXTERN char e_no_white_space_allowed_after_str_str[]
INIT(= N_("E1202: No white space allowed after '%s': %s")); INIT(= N_("E1202: No white space allowed after '%s': %s"));
EXTERN char e_dot_can_only_be_used_on_dictionary_str[]
INIT(= N_("E1203: Dot can only be used on a dictionary: %s"));

View File

@@ -924,8 +924,14 @@ get_lval(
lp->ll_tv = &v->di_tv; lp->ll_tv = &v->di_tv;
var1.v_type = VAR_UNKNOWN; var1.v_type = VAR_UNKNOWN;
var2.v_type = VAR_UNKNOWN; var2.v_type = VAR_UNKNOWN;
while (*p == '[' || (*p == '.' && lp->ll_tv->v_type == VAR_DICT)) while (*p == '[' || (*p == '.' && p[1] != '=' && p[1] != '.'))
{ {
if (*p == '.' && lp->ll_tv->v_type != VAR_DICT)
{
if (!quiet)
semsg(_(e_dot_can_only_be_used_on_dictionary_str), name);
return NULL;
}
if (!(lp->ll_tv->v_type == VAR_LIST && lp->ll_tv->vval.v_list != NULL) if (!(lp->ll_tv->v_type == VAR_LIST && lp->ll_tv->vval.v_list != NULL)
&& !(lp->ll_tv->v_type == VAR_DICT) && !(lp->ll_tv->v_type == VAR_DICT)
&& !(lp->ll_tv->v_type == VAR_BLOB && !(lp->ll_tv->v_type == VAR_BLOB

View File

@@ -293,7 +293,7 @@ func Test_let_errors()
let s = "var" let s = "var"
let var = 1 let var = 1
call assert_fails('let var += [1,2]', 'E734:') call assert_fails('let var += [1,2]', 'E734:')
call assert_fails('let {s}.1 = 2', 'E18:') call assert_fails('let {s}.1 = 2', 'E1203:')
call assert_fails('let a[1] = 5', 'E121:') call assert_fails('let a[1] = 5', 'E121:')
let l = [[1,2]] let l = [[1,2]]
call assert_fails('let l[:][0] = [5]', 'E708:') call assert_fails('let l[:][0] = [5]', 'E708:')

View File

@@ -294,6 +294,9 @@ func Test_dict_assign()
let d.1 = 1 let d.1 = 1
let d._ = 2 let d._ = 2
call assert_equal({'1': 1, '_': 2}, d) call assert_equal({'1': 1, '_': 2}, d)
let n = 0
call assert_fails('let n.key = 3', 'E1203: Dot can only be used on a dictionary: n.key = 3')
endfunc endfunc
" Function in script-local List or Dict " Function in script-local List or Dict

View File

@@ -787,6 +787,12 @@ def Test_assignment_dict()
d.dd[0] = 0 d.dd[0] = 0
END END
CheckDefExecFailure(lines, 'E1148:', 2) CheckDefExecFailure(lines, 'E1148:', 2)
lines =<< trim END
var n: any
n.key = 5
END
CheckDefExecAndScriptFailure2(lines, 'E1148:', 'E1203: Dot can only be used on a dictionary: n.key = 5', 2)
enddef enddef
def Test_assignment_local() def Test_assignment_local()

View File

@@ -755,6 +755,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 */
/**/
3055,
/**/ /**/
3054, 3054,
/**/ /**/