0
0
mirror of https://github.com/vim/vim.git synced 2025-10-10 06:24:10 -04:00

patch 8.2.0298: Vim9 script: cannot start command with a string constant

Problem:    Vim9 script: cannot start command with a string constant.
Solution:   Recognize expression starting with '('.
This commit is contained in:
Bram Moolenaar
2020-02-22 18:36:32 +01:00
parent 8b430b4c1d
commit 0c6ceaf903
5 changed files with 17 additions and 17 deletions

View File

@@ -131,14 +131,16 @@ Functions can be called without `:call`: >
Using `:call` is still possible, but this is discouraged. Using `:call` is still possible, but this is discouraged.
A method call without `eval` is possible, so long as the start is an A method call without `eval` is possible, so long as the start is an
identifier or can't be an Ex command. It does not work for string constants: > identifier or can't be an Ex command. It does NOT work for string constants: >
myList->add(123) " works myList->add(123) " works
g:myList->add(123) " works g:myList->add(123) " works
[1, 2, 3]->Process() " works [1, 2, 3]->Process() " works
#{a: 1, b: 2}->Process() " works #{a: 1, b: 2}->Process() " works
{'a': 1, 'b': 2}->Process() " works {'a': 1, 'b': 2}->Process() " works
"foobar"->Process() " does NOT work "foobar"->Process() " does NOT work
eval "foobar"->Process() " works ("foobar")->Process() " works
'foobar'->Process() " does NOT work
('foobar')->Process() " works
In case there is ambiguity between a function name and an Ex command, use ":" In case there is ambiguity between a function name and an Ex command, use ":"
to make clear you want to use the Ex command. For example, there is both the to make clear you want to use the Ex command. For example, there is both the

View File

@@ -3146,8 +3146,9 @@ find_ex_command(
* Recognize a Vim9 script function/method call and assignment: * Recognize a Vim9 script function/method call and assignment:
* "lvar = value", "lvar(arg)", "[1, 2 3]->Func()" * "lvar = value", "lvar(arg)", "[1, 2 3]->Func()"
*/ */
if (lookup != NULL && (p = to_name_const_end(eap->cmd)) > eap->cmd p = eap->cmd;
&& *p != NUL) if (lookup != NULL && (*p == '('
|| ((p = to_name_const_end(eap->cmd)) > eap->cmd && *p != NUL)))
{ {
int oplen; int oplen;
int heredoc; int heredoc;
@@ -3156,6 +3157,7 @@ find_ex_command(
// "varname[]" is an expression. // "varname[]" is an expression.
// "g:varname" is an expression. // "g:varname" is an expression.
// "varname->expr" is an expression. // "varname->expr" is an expression.
// "(..." is an expression.
if (*p == '(' if (*p == '('
|| *p == '[' || *p == '['
|| p[1] == ':' || p[1] == ':'

View File

@@ -370,6 +370,11 @@ def Test_vim9script_call()
assert_equal(#{a: 1, b: 2}, dictvar) assert_equal(#{a: 1, b: 2}, dictvar)
#{a: 3, b: 4}->DictFunc() #{a: 3, b: 4}->DictFunc()
assert_equal(#{a: 3, b: 4}, dictvar) assert_equal(#{a: 3, b: 4}, dictvar)
('text')->MyFunc()
assert_equal('text', var)
("some")->MyFunc()
assert_equal('some', var)
END END
writefile(lines, 'Xcall.vim') writefile(lines, 'Xcall.vim')
source Xcall.vim source Xcall.vim

View File

@@ -738,6 +738,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 */
/**/
298,
/**/ /**/
297, 297,
/**/ /**/

View File

@@ -4821,22 +4821,11 @@ compile_def_function(ufunc_T *ufunc, int set_return_type)
p = (*ea.cmd == '&' || *ea.cmd == '$' || *ea.cmd == '@') p = (*ea.cmd == '&' || *ea.cmd == '$' || *ea.cmd == '@')
? ea.cmd + 1 : ea.cmd; ? ea.cmd + 1 : ea.cmd;
p = to_name_end(p); p = to_name_end(p);
if (p > ea.cmd && *p != NUL) if ((p > ea.cmd && *p != NUL) || *p == '(')
{ {
int oplen; int oplen;
int heredoc; int heredoc;
// "funcname(" is always a function call.
// "varname[]" is an expression.
// "varname->expr" is an expression.
if (*p == '('
|| *p == '['
|| ((p - ea.cmd) > 2 && ea.cmd[1] == ':')
|| (*p == '-' && p[1] == '>'))
{
// TODO
}
oplen = assignment_len(skipwhite(p), &heredoc); oplen = assignment_len(skipwhite(p), &heredoc);
if (oplen > 0) if (oplen > 0)
{ {