To: vim_dev@googlegroups.com Subject: Patch 8.2.1116 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.1116 Problem: Vim9: parsing command checks for list twice. Solution: Adjust how a command is parsed. Files: src/ex_docmd.c, src/testdir/test_vim9_cmd.vim *** ../vim-8.2.1115/src/ex_docmd.c 2020-07-01 20:07:11.557328210 +0200 --- src/ex_docmd.c 2020-07-01 23:10:00.329596571 +0200 *************** *** 3219,3226 **** * "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))) { int oplen; int heredoc; --- 3219,3227 ---- * "lvar = value", "lvar(arg)", "[1, 2 3]->Func()" */ p = eap->cmd; ! if (lookup != NULL && (*p == '(' || *p == '{' ! || ((p = to_name_const_end(eap->cmd)) > eap->cmd && *p != NUL) ! || *p == '[')) { int oplen; int heredoc; *************** *** 3233,3238 **** --- 3234,3240 ---- // "{..." is an dict expression. if (*p == '(' || *p == '{' + || (*p == '[' && p > eap->cmd) || p[1] == ':' || (*p == '-' && p[1] == '>')) { *************** *** 3240,3245 **** --- 3242,3259 ---- 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,3267 **** 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 --- 3267,3272 ---- *** ../vim-8.2.1115/src/testdir/test_vim9_cmd.vim 2020-07-01 20:07:11.557328210 +0200 --- src/testdir/test_vim9_cmd.vim 2020-07-01 23:08:48.645979662 +0200 *************** *** 190,196 **** CheckScriptSuccess(lines) enddef ! def Test_method_cal_linebreak() let lines =<< trim END vim9script let res = [] --- 190,196 ---- CheckScriptSuccess(lines) enddef ! def Test_method_call_linebreak() let lines =<< trim END vim9script let res = [] *** ../vim-8.2.1115/src/version.c 2020-07-02 20:59:01.424604401 +0200 --- src/version.c 2020-07-02 21:10:41.125073499 +0200 *************** *** 756,757 **** --- 756,759 ---- { /* Add new patch number below this line */ + /**/ + 1116, /**/ -- DENNIS: Look, strange women lying on their backs in ponds handing out swords ... that's no basis for a system of government. Supreme executive power derives from a mandate from the masses, not from some farcical aquatic ceremony. "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///