Mercurial > vim
changeset 23549:4156f972efb1 v8.2.2317
patch 8.2.2317: Vim9: command modifier before list unpack doesn't work
Commit: https://github.com/vim/vim/commit/9e0f883f89c915e08ef5fd9e6bf382af57fa9eb2
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Jan 9 12:09:22 2021 +0100
patch 8.2.2317: Vim9: command modifier before list unpack doesn't work
Problem: Vim9: command modifier before list unpack doesn't work.
Solution: Only recognize "[" directly after the name. (closes https://github.com/vim/vim/issues/7641)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 09 Jan 2021 12:15:05 +0100 |
parents | 32b16cb86594 |
children | 33435ed56bf8 |
files | src/ex_docmd.c src/testdir/test_vim9_assign.vim src/version.c |
diffstat | 3 files changed, 29 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -2745,15 +2745,18 @@ parse_command_modifiers( // silent! verbose = func() // verbose.member = 2 // verbose[expr] = 2 + // But not: + // verbose [a, b] = list if (in_vim9script()) { - char_u *s; + char_u *s, *n; for (s = p; ASCII_ISALPHA(*s); ++s) ; - s = skipwhite(s); - if (vim_strchr((char_u *)".[=", *s) != NULL - || (*s != NUL && s[1] == '=')) + n = skipwhite(s); + if (vim_strchr((char_u *)".=", *n) != NULL + || *s == '[' + || (*n != NUL && n[1] == '=')) break; }
--- a/src/testdir/test_vim9_assign.vim +++ b/src/testdir/test_vim9_assign.vim @@ -1466,21 +1466,27 @@ enddef def Test_assign_command_modifier() var lines =<< trim END - var verbose = 0 - verbose = 1 - assert_equal(1, verbose) - silent verbose = 2 - assert_equal(2, verbose) - silent verbose += 2 - assert_equal(4, verbose) - silent verbose -= 1 - assert_equal(3, verbose) + var verbose = 0 + verbose = 1 + assert_equal(1, verbose) + silent verbose = 2 + assert_equal(2, verbose) + silent verbose += 2 + assert_equal(4, verbose) + silent verbose -= 1 + assert_equal(3, verbose) - var topleft = {one: 1} - sandbox topleft.one = 3 - assert_equal({one: 3}, topleft) - leftabove topleft[' '] = 4 - assert_equal({one: 3, ' ': 4}, topleft) + var topleft = {one: 1} + sandbox topleft.one = 3 + assert_equal({one: 3}, topleft) + leftabove topleft[' '] = 4 + assert_equal({one: 3, ' ': 4}, topleft) + + var x: number + var y: number + silent [x, y] = [1, 2] + assert_equal(1, x) + assert_equal(2, y) END CheckDefAndScriptSuccess(lines) enddef