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
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2317,
+/**/
     2316,
 /**/
     2315,