forked from aniani/vim
patch 8.2.1306: checking for first character of dict key is inconsistent
Problem: Checking for first character of dict key is inconsistent. Solution: Add eval_isdictc(). (closes #6546)
This commit is contained in:
21
src/eval.c
21
src/eval.c
@@ -3464,7 +3464,7 @@ eval_index(
|
|||||||
* dict.name
|
* dict.name
|
||||||
*/
|
*/
|
||||||
key = *arg + 1;
|
key = *arg + 1;
|
||||||
for (len = 0; ASCII_ISALNUM(key[len]) || key[len] == '_'; ++len)
|
for (len = 0; eval_isdictc(key[len]); ++len)
|
||||||
;
|
;
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
return FAIL;
|
return FAIL;
|
||||||
@@ -4997,7 +4997,7 @@ find_name_end(
|
|||||||
&& (eval_isnamec(*p)
|
&& (eval_isnamec(*p)
|
||||||
|| (*p == '{' && !vim9script)
|
|| (*p == '{' && !vim9script)
|
||||||
|| ((flags & FNE_INCL_BR) && (*p == '['
|
|| ((flags & FNE_INCL_BR) && (*p == '['
|
||||||
|| (*p == '.' && eval_isnamec1(p[1]))))
|
|| (*p == '.' && eval_isdictc(p[1]))))
|
||||||
|| mb_nest != 0
|
|| mb_nest != 0
|
||||||
|| br_nest != 0); MB_PTR_ADV(p))
|
|| br_nest != 0); MB_PTR_ADV(p))
|
||||||
{
|
{
|
||||||
@@ -5128,7 +5128,7 @@ make_expanded_name(
|
|||||||
int
|
int
|
||||||
eval_isnamec(int c)
|
eval_isnamec(int c)
|
||||||
{
|
{
|
||||||
return (ASCII_ISALNUM(c) || c == '_' || c == ':' || c == AUTOLOAD_CHAR);
|
return ASCII_ISALNUM(c) || c == '_' || c == ':' || c == AUTOLOAD_CHAR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -5138,7 +5138,17 @@ eval_isnamec(int c)
|
|||||||
int
|
int
|
||||||
eval_isnamec1(int c)
|
eval_isnamec1(int c)
|
||||||
{
|
{
|
||||||
return (ASCII_ISALPHA(c) || c == '_');
|
return ASCII_ISALPHA(c) || c == '_';
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return TRUE if character "c" can be used as the first character of a
|
||||||
|
* dictionary key.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
eval_isdictc(int c)
|
||||||
|
{
|
||||||
|
return ASCII_ISALNUM(c) || c == '_';
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -5171,8 +5181,7 @@ handle_subscript(
|
|||||||
// the next line then consume the line break.
|
// the next line then consume the line break.
|
||||||
p = eval_next_non_blank(*arg, evalarg, &getnext);
|
p = eval_next_non_blank(*arg, evalarg, &getnext);
|
||||||
if (getnext
|
if (getnext
|
||||||
&& ((rettv->v_type == VAR_DICT && *p == '.'
|
&& ((rettv->v_type == VAR_DICT && *p == '.' && eval_isdictc(p[1]))
|
||||||
&& ASCII_ISALPHA(p[1]))
|
|
||||||
|| (*p == '-' && p[1] == '>'
|
|| (*p == '-' && p[1] == '>'
|
||||||
&& (p[2] == '{' || ASCII_ISALPHA(p[2])))))
|
&& (p[2] == '{' || ASCII_ISALPHA(p[2])))))
|
||||||
{
|
{
|
||||||
|
@@ -58,6 +58,7 @@ int get_name_len(char_u **arg, char_u **alias, int evaluate, int verbose);
|
|||||||
char_u *find_name_end(char_u *arg, char_u **expr_start, char_u **expr_end, int flags);
|
char_u *find_name_end(char_u *arg, char_u **expr_start, char_u **expr_end, int flags);
|
||||||
int eval_isnamec(int c);
|
int eval_isnamec(int c);
|
||||||
int eval_isnamec1(int c);
|
int eval_isnamec1(int c);
|
||||||
|
int eval_isdictc(int c);
|
||||||
int handle_subscript(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int verbose);
|
int handle_subscript(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int verbose);
|
||||||
int item_copy(typval_T *from, typval_T *to, int deep, int copyID);
|
int item_copy(typval_T *from, typval_T *to, int deep, int copyID);
|
||||||
void echo_one(typval_T *rettv, int with_space, int *atstart, int *needclr);
|
void echo_one(typval_T *rettv, int with_space, int *atstart, int *needclr);
|
||||||
|
@@ -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', 'E15:')
|
call assert_fails('let {s}.1 = 2', 'E18:')
|
||||||
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:')
|
||||||
|
@@ -282,6 +282,13 @@ func Test_dict_func()
|
|||||||
call assert_equal('xxx3', Fn('xxx'))
|
call assert_equal('xxx3', Fn('xxx'))
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_dict_assign()
|
||||||
|
let d = {}
|
||||||
|
let d.1 = 1
|
||||||
|
let d._ = 2
|
||||||
|
call assert_equal({'1': 1, '_': 2}, d)
|
||||||
|
endfunc
|
||||||
|
|
||||||
" Function in script-local List or Dict
|
" Function in script-local List or Dict
|
||||||
func Test_script_local_dict_func()
|
func Test_script_local_dict_func()
|
||||||
let g:dict = {}
|
let g:dict = {}
|
||||||
|
@@ -1310,6 +1310,11 @@ def Test_expr_member()
|
|||||||
])
|
])
|
||||||
assert_equal(1, d
|
assert_equal(1, d
|
||||||
.one)
|
.one)
|
||||||
|
d = {'1': 1, '_': 2}
|
||||||
|
assert_equal(1, d
|
||||||
|
.1)
|
||||||
|
assert_equal(2, d
|
||||||
|
._)
|
||||||
|
|
||||||
# getting the one member should clear the dict after getting the item
|
# getting the one member should clear the dict after getting the item
|
||||||
assert_equal('one', #{one: 'one'}.one)
|
assert_equal('one', #{one: 'one'}.one)
|
||||||
@@ -1330,10 +1335,16 @@ def Test_expr_member_vim9script()
|
|||||||
vim9script
|
vim9script
|
||||||
let d = #{one:
|
let d = #{one:
|
||||||
'one',
|
'one',
|
||||||
two: 'two'}
|
two: 'two',
|
||||||
|
1: 1,
|
||||||
|
_: 2}
|
||||||
assert_equal('one', d.one)
|
assert_equal('one', d.one)
|
||||||
assert_equal('one', d
|
assert_equal('one', d
|
||||||
.one)
|
.one)
|
||||||
|
assert_equal(1, d
|
||||||
|
.1)
|
||||||
|
assert_equal(2, d
|
||||||
|
._)
|
||||||
assert_equal('one', d[
|
assert_equal('one', d[
|
||||||
'one'
|
'one'
|
||||||
])
|
])
|
||||||
|
@@ -754,6 +754,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 */
|
||||||
|
/**/
|
||||||
|
1306,
|
||||||
/**/
|
/**/
|
||||||
1305,
|
1305,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -3758,7 +3758,7 @@ compile_subscript(
|
|||||||
if (next != NULL &&
|
if (next != NULL &&
|
||||||
((next[0] == '-' && next[1] == '>'
|
((next[0] == '-' && next[1] == '>'
|
||||||
&& (next[2] == '{' || ASCII_ISALPHA(next[2])))
|
&& (next[2] == '{' || ASCII_ISALPHA(next[2])))
|
||||||
|| (next[0] == '.' && ASCII_ISALPHA(next[1]))))
|
|| (next[0] == '.' && eval_isdictc(next[1]))))
|
||||||
{
|
{
|
||||||
next = next_line_from_context(cctx, TRUE);
|
next = next_line_from_context(cctx, TRUE);
|
||||||
if (next == NULL)
|
if (next == NULL)
|
||||||
@@ -3922,7 +3922,7 @@ compile_subscript(
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
// dictionary member: dict.name
|
// dictionary member: dict.name
|
||||||
p = *arg;
|
p = *arg;
|
||||||
if (eval_isnamec1(*p))
|
if (eval_isdictc(*p))
|
||||||
while (eval_isnamec(*p))
|
while (eval_isnamec(*p))
|
||||||
MB_PTR_ADV(p);
|
MB_PTR_ADV(p);
|
||||||
if (p == *arg)
|
if (p == *arg)
|
||||||
|
Reference in New Issue
Block a user