patch 8.2.2301: Vim9: cannot unlet a dict or list item
Problem: Vim9: cannot unlet a dict or list item.
Solution: Add ISN_UNLETINDEX. Refactor assignment code to use for unlet.
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim
index da5e782..f2d09fc 100644
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -1349,14 +1349,47 @@
assert_false(exists('s:somevar'))
unlet! s:somevar
+ # dict unlet
+ var dd = {a: 1, b: 2, c: 3}
+ unlet dd['a']
+ unlet dd.c
+ assert_equal({b: 2}, dd)
+
+ # list unlet
+ var ll = [1, 2, 3, 4]
+ unlet ll[1]
+ unlet ll[-1]
+ assert_equal([1, 3], ll)
+
+ # list of dict unlet
+ var dl = [{a: 1, b: 2}, {c: 3}]
+ unlet dl[0]['b']
+ assert_equal([{a: 1}, {c: 3}], dl)
+
+ CheckDefExecFailure([
+ 'var ll = test_null_list()',
+ 'unlet ll[0]',
+ ], 'E684:')
+ CheckDefExecFailure([
+ 'var ll = [1]',
+ 'unlet ll[2]',
+ ], 'E684:')
+ CheckDefExecFailure([
+ 'var dd = test_null_dict()',
+ 'unlet dd["a"]',
+ ], 'E716:')
+ CheckDefExecFailure([
+ 'var dd = {a: 1}',
+ 'unlet dd["b"]',
+ ], 'E716:')
+
# can compile unlet before variable exists
- # This doesn't work yet
- #g:someDict = {key: 'val'}
- #var k = 'key'
- #unlet g:someDict[k]
- #assert_equal({}, g:someDict)
- #unlet g:someDict
- #assert_false(exists('g:someDict'))
+ g:someDict = {key: 'val'}
+ var k = 'key'
+ unlet g:someDict[k]
+ assert_equal({}, g:someDict)
+ unlet g:someDict
+ assert_false(exists('g:someDict'))
CheckScriptFailure([
'vim9script',