mirror of
https://github.com/vim/vim.git
synced 2025-09-27 04:14:06 -04:00
patch 9.0.2091: Vim9: cannot convert list to string using +=
Problem: Vim9: cannot convert list to string using += (after 9.0.2072) Solution: convert dict index to string later in compile_member() fixes: #13485 closes: #13486 Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
4f174f0de9
commit
6709816f78
@@ -3001,6 +3001,60 @@ def Test_list_item_assign()
|
|||||||
Foo()
|
Foo()
|
||||||
END
|
END
|
||||||
v9.CheckSourceSuccess(lines)
|
v9.CheckSourceSuccess(lines)
|
||||||
|
|
||||||
|
lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
|
||||||
|
var l: list<list<string>> = [['x', 'x', 'x'], ['y', 'y', 'y']]
|
||||||
|
var z: number = 1
|
||||||
|
|
||||||
|
[l[1][2], z] = ['a', 20]
|
||||||
|
assert_equal([['x', 'x', 'x'], ['y', 'y', 'a']], l)
|
||||||
|
END
|
||||||
|
v9.CheckSourceSuccess(lines)
|
||||||
|
enddef
|
||||||
|
|
||||||
|
" Test for assigning to a multi-dimensional dict item.
|
||||||
|
def Test_dict_item_assign()
|
||||||
|
# This used to fail with the error "E1105: Cannot convert list to string"
|
||||||
|
# (Github issue #13485)
|
||||||
|
var lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
def F()
|
||||||
|
var d: dict<dict<number>> = {a: {b: 0}}
|
||||||
|
|
||||||
|
for group in keys(d)
|
||||||
|
d['a']['b'] += 1
|
||||||
|
endfor
|
||||||
|
assert_equal({a: {b: 1}}, d)
|
||||||
|
enddef
|
||||||
|
F()
|
||||||
|
END
|
||||||
|
v9.CheckSourceSuccess(lines)
|
||||||
|
|
||||||
|
# This used to crash Vim
|
||||||
|
lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
def F()
|
||||||
|
var d: dict<dict<number>> = {a: {b: 0}}
|
||||||
|
d['a']['b'] += 1
|
||||||
|
assert_equal({a: {b: 1}}, d)
|
||||||
|
enddef
|
||||||
|
F()
|
||||||
|
END
|
||||||
|
v9.CheckSourceSuccess(lines)
|
||||||
|
|
||||||
|
# Assignment at script level
|
||||||
|
lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
var d: dict<dict<number>> = {a: {b: 0}}
|
||||||
|
|
||||||
|
for group in keys(d)
|
||||||
|
d['a']['b'] += 1
|
||||||
|
endfor
|
||||||
|
assert_equal({a: {b: 1}}, d)
|
||||||
|
END
|
||||||
|
v9.CheckSourceSuccess(lines)
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
|
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
|
||||||
|
@@ -560,7 +560,6 @@ def Test_disassemble_store_index()
|
|||||||
'\d LOAD $0\_s*' ..
|
'\d LOAD $0\_s*' ..
|
||||||
'\d MEMBER dd\_s*' ..
|
'\d MEMBER dd\_s*' ..
|
||||||
'\d\+ USEDICT\_s*' ..
|
'\d\+ USEDICT\_s*' ..
|
||||||
'\d\+ 2STRING stack\[-2\]\_s*' ..
|
|
||||||
'\d\+ STOREINDEX any\_s*' ..
|
'\d\+ STOREINDEX any\_s*' ..
|
||||||
'\d\+ RETURN void',
|
'\d\+ RETURN void',
|
||||||
res)
|
res)
|
||||||
|
@@ -704,6 +704,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 */
|
||||||
|
/**/
|
||||||
|
2091,
|
||||||
/**/
|
/**/
|
||||||
2090,
|
2090,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -2221,15 +2221,6 @@ compile_load_lhs(
|
|||||||
return FAIL;
|
return FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lhs->lhs_type->tt_type == VAR_DICT && var_start[varlen] == '[')
|
|
||||||
{
|
|
||||||
// If the lhs is a Dict variable and an item is accessed by "[",
|
|
||||||
// then need to convert the key into a string. The top item in the
|
|
||||||
// type stack is the Dict and the second last item is the key.
|
|
||||||
if (may_generate_2STRING(-2, FALSE, cctx) == FAIL)
|
|
||||||
return FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now we can properly check the type. The variable is indexed, thus
|
// Now we can properly check the type. The variable is indexed, thus
|
||||||
// we need the member type. For a class or object we don't know the
|
// we need the member type. For a class or object we don't know the
|
||||||
// type yet, it depends on what member is used.
|
// type yet, it depends on what member is used.
|
||||||
|
Reference in New Issue
Block a user