patch 8.2.1463: Vim9: list slice not supported yet
Problem: Vim9: list slice not supported yet.
Solution: Add support for list slicing.
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim
index d901cb0..3ed36f3 100644
--- a/src/testdir/test_vim9_disassemble.vim
+++ b/src/testdir/test_vim9_disassemble.vim
@@ -992,6 +992,28 @@
assert_equal('b', StringIndex())
enddef
+def StringSlice(): string
+ let s = "abcd"
+ let res = s[1:8]
+ return res
+enddef
+
+def Test_disassemble_string_slice()
+ let instr = execute('disassemble StringSlice')
+ assert_match('StringSlice\_s*' ..
+ 'let s = "abcd"\_s*' ..
+ '\d PUSHS "abcd"\_s*' ..
+ '\d STORE $0\_s*' ..
+ 'let res = s\[1:8]\_s*' ..
+ '\d LOAD $0\_s*' ..
+ '\d PUSHNR 1\_s*' ..
+ '\d PUSHNR 8\_s*' ..
+ '\d STRSLICE\_s*' ..
+ '\d STORE $1\_s*',
+ instr)
+ assert_equal('bcd', StringSlice())
+enddef
+
def ListIndex(): number
let l = [1, 2, 3]
let res = l[1]
@@ -1016,6 +1038,31 @@
assert_equal(2, ListIndex())
enddef
+def ListSlice(): list<number>
+ let l = [1, 2, 3]
+ let res = l[1:8]
+ return res
+enddef
+
+def Test_disassemble_list_slice()
+ let instr = execute('disassemble ListSlice')
+ assert_match('ListSlice\_s*' ..
+ 'let l = \[1, 2, 3]\_s*' ..
+ '\d PUSHNR 1\_s*' ..
+ '\d PUSHNR 2\_s*' ..
+ '\d PUSHNR 3\_s*' ..
+ '\d NEWLIST size 3\_s*' ..
+ '\d STORE $0\_s*' ..
+ 'let res = l\[1:8]\_s*' ..
+ '\d LOAD $0\_s*' ..
+ '\d PUSHNR 1\_s*' ..
+ '\d PUSHNR 8\_s*' ..
+ '\d LISTSLICE\_s*' ..
+ '\d STORE $1\_s*',
+ instr)
+ assert_equal([2, 3], ListSlice())
+enddef
+
def DictMember(): number
let d = #{item: 1}
let res = d.item
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim
index cae719d..6f3cedf 100644
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -2121,6 +2121,34 @@
CheckScriptSuccess(['vim9script'] + lines)
enddef
+def Test_expr7_list_subscript()
+ let lines =<< trim END
+ let list = [0, 1, 2, 3, 4]
+ assert_equal(0, list[0])
+ assert_equal(4, list[4])
+ assert_equal(4, list[-1])
+ assert_equal(0, list[-5])
+
+ assert_equal([0, 1, 2, 3, 4], list[0:4])
+ assert_equal([0, 1, 2, 3, 4], list[:])
+ assert_equal([1, 2, 3, 4], list[1:])
+ assert_equal([2, 3, 4], list[2:-1])
+ assert_equal([4], list[4:-1])
+ assert_equal([], list[5:-1])
+ assert_equal([], list[999:-1])
+
+ assert_equal([0, 1, 2, 3], list[0:3])
+ assert_equal([0], list[0:0])
+ assert_equal([0, 1, 2, 3, 4], list[0:-1])
+ assert_equal([0, 1, 2], list[0:-3])
+ assert_equal([0], list[0:-5])
+ assert_equal([], list[0:-6])
+ assert_equal([], list[0:-99])
+ END
+ CheckDefSuccess(lines)
+ CheckScriptSuccess(['vim9script'] + lines)
+enddef
+
def Test_expr7_subscript_linebreak()
let range = range(
3)