mirror of
https://github.com/vim/vim.git
synced 2025-10-11 06:34:16 -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:
@@ -131,21 +131,23 @@ 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
|
||||||
`:substitute` command and the `substitute()` function. When the line starts
|
`:substitute` command and the `substitute()` function. When the line starts
|
||||||
with `substitute(` this will use the function, prepend a colon to use the
|
with `substitute(` this will use the function, prepend a colon to use the
|
||||||
command instead: >
|
command instead: >
|
||||||
:substitute(pattern(replacement(
|
:substitute(pattern (replacement (
|
||||||
|
|
||||||
|
|
||||||
No curly braces expansion ~
|
No curly braces expansion ~
|
||||||
|
@@ -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] == ':'
|
||||||
|
@@ -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
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -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)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user