0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

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.
This commit is contained in:
Bram Moolenaar
2020-07-02 21:11:34 +02:00
parent c19fd917be
commit d2ef6b320b
3 changed files with 19 additions and 12 deletions

View File

@@ -3219,8 +3219,9 @@ find_ex_command(
* "lvar = value", "lvar(arg)", "[1, 2 3]->Func()" * "lvar = value", "lvar(arg)", "[1, 2 3]->Func()"
*/ */
p = eap->cmd; p = eap->cmd;
if (lookup != NULL && (*p == '(' || *p == '[' || *p == '{' if (lookup != NULL && (*p == '(' || *p == '{'
|| ((p = to_name_const_end(eap->cmd)) > eap->cmd && *p != NUL))) || ((p = to_name_const_end(eap->cmd)) > eap->cmd && *p != NUL)
|| *p == '['))
{ {
int oplen; int oplen;
int heredoc; int heredoc;
@@ -3233,6 +3234,7 @@ find_ex_command(
// "{..." is an dict expression. // "{..." is an dict expression.
if (*p == '(' if (*p == '('
|| *p == '{' || *p == '{'
|| (*p == '[' && p > eap->cmd)
|| p[1] == ':' || p[1] == ':'
|| (*p == '-' && p[1] == '>')) || (*p == '-' && p[1] == '>'))
{ {
@@ -3240,6 +3242,18 @@ find_ex_command(
return eap->cmd; 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: // Recognize an assignment if we recognize the variable name:
// "g:var = expr" // "g:var = expr"
// "var = expr" where "var" is a local var name. // "var = expr" where "var" is a local var name.
@@ -3253,15 +3267,6 @@ find_ex_command(
return eap->cmd; 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 #endif

View File

@@ -190,7 +190,7 @@ def Test_for_linebreak()
CheckScriptSuccess(lines) CheckScriptSuccess(lines)
enddef enddef
def Test_method_cal_linebreak() def Test_method_call_linebreak()
let lines =<< trim END let lines =<< trim END
vim9script vim9script
let res = [] let res = []

View File

@@ -754,6 +754,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1116,
/**/ /**/
1115, 1115,
/**/ /**/