changeset 21130:4a1e8086759b v8.2.1116

patch 8.2.1116: Vim9: parsing command checks for list twice Commit: https://github.com/vim/vim/commit/d2ef6b320bf2e2f3fcc0bb858b16898e6f74b4d9 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Jul 2 21:11:34 2020 +0200 patch 8.2.1116: Vim9: parsing command checks for list twice Problem: Vim9: parsing command checks for list twice. Solution: Adjust how a command is parsed.
author Bram Moolenaar <Bram@vim.org>
date Thu, 02 Jul 2020 21:15:05 +0200
parents 9a40ce00f714
children 42bf2c3c9fee
files src/ex_docmd.c src/testdir/test_vim9_cmd.vim src/version.c
diffstat 3 files changed, 19 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -3219,8 +3219,9 @@ find_ex_command(
      * "lvar = value", "lvar(arg)", "[1, 2 3]->Func()"
      */
     p = eap->cmd;
-    if (lookup != NULL && (*p == '(' || *p == '[' || *p == '{'
-	       || ((p = to_name_const_end(eap->cmd)) > eap->cmd && *p != NUL)))
+    if (lookup != NULL && (*p == '(' || *p == '{'
+	       || ((p = to_name_const_end(eap->cmd)) > eap->cmd && *p != NUL)
+	       || *p == '['))
     {
 	int oplen;
 	int heredoc;
@@ -3233,6 +3234,7 @@ find_ex_command(
 	// "{..." is an dict expression.
 	if (*p == '('
 		|| *p == '{'
+		|| (*p == '[' && p > eap->cmd)
 		|| p[1] == ':'
 		|| (*p == '-' && p[1] == '>'))
 	{
@@ -3240,6 +3242,18 @@ find_ex_command(
 	    return eap->cmd;
 	}
 
+	// "[...]->Method()" is a list expression, but "[a, b] = Func()" is
+	// an assignment.
+	// If there is no line break inside the "[...]" then "p" is advanced to
+	// after the "]" by to_name_const_end(): check if a "=" follows.
+	// If "[...]" has a line break "p" still points at the "[" and it can't
+	// be an assignment.
+	if (*eap->cmd == '[' && (p == eap->cmd || *skipwhite(p) != '='))
+	{
+	    eap->cmdidx = CMD_eval;
+	    return eap->cmd;
+	}
+
 	// Recognize an assignment if we recognize the variable name:
 	// "g:var = expr"
 	// "var = expr"  where "var" is a local var name.
@@ -3253,15 +3267,6 @@ find_ex_command(
 		return eap->cmd;
 	    }
 	}
-
-	// "[...]->Method()" is a list expression.  But "[a, b] = Func()" is
-	// an assignment.
-	if (*p == '[' && (eval_list(&p, NULL, NULL, FALSE) == FAIL
-						      || *skipwhite(p) != '='))
-	{
-	    eap->cmdidx = CMD_eval;
-	    return eap->cmd;
-	}
     }
 #endif
 
--- a/src/testdir/test_vim9_cmd.vim
+++ b/src/testdir/test_vim9_cmd.vim
@@ -190,7 +190,7 @@ def Test_for_linebreak()
   CheckScriptSuccess(lines)
 enddef
 
-def Test_method_cal_linebreak()
+def Test_method_call_linebreak()
   let lines =<< trim END
       vim9script
       let res = []
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1116,
+/**/
     1115,
 /**/
     1114,