summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-02-22 18:36:32 +0100
committerBram Moolenaar <Bram@vim.org>2020-02-22 18:36:32 +0100
commit0c6ceaf90389b41545d803458c4813013811c756 (patch)
tree885e0983a420271d5d98b58e7669252d972f8bd5
parent8b430b4c1df74bde757a7e5ee0ee2854fdad6472 (diff)
patch 8.2.0298: Vim9 script: cannot start command with a string constantv8.2.0298
Problem: Vim9 script: cannot start command with a string constant. Solution: Recognize expression starting with '('.
-rw-r--r--runtime/doc/vim9.txt8
-rw-r--r--src/ex_docmd.c6
-rw-r--r--src/testdir/test_vim9_script.vim5
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c13
5 files changed, 17 insertions, 17 deletions
diff --git a/runtime/doc/vim9.txt b/runtime/doc/vim9.txt
index c79ae62de1..05c1c8e3de 100644
--- a/runtime/doc/vim9.txt
+++ b/runtime/doc/vim9.txt
@@ -131,21 +131,23 @@ Functions can be called without `:call`: >
Using `:call` is still possible, but this is discouraged.
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
g:myList->add(123) " works
[1, 2, 3]->Process() " works
#{a: 1, b: 2}->Process() " works
{'a': 1, 'b': 2}->Process() " works
"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 ":"
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
with `substitute(` this will use the function, prepend a colon to use the
command instead: >
- :substitute(pattern(replacement(
+ :substitute(pattern (replacement (
No curly braces expansion ~
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 511e8c5dea..70c0da2f03 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -3146,8 +3146,9 @@ find_ex_command(
* Recognize a Vim9 script function/method call and assignment:
* "lvar = value", "lvar(arg)", "[1, 2 3]->Func()"
*/
- if (lookup != NULL && (p = to_name_const_end(eap->cmd)) > eap->cmd
- && *p != NUL)
+ p = eap->cmd;
+ if (lookup != NULL && (*p == '('
+ || ((p = to_name_const_end(eap->cmd)) > eap->cmd && *p != NUL)))
{
int oplen;
int heredoc;
@@ -3156,6 +3157,7 @@ find_ex_command(
// "varname[]" is an expression.
// "g:varname" is an expression.
// "varname->expr" is an expression.
+ // "(..." is an expression.
if (*p == '('
|| *p == '['
|| p[1] == ':'
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index 107ee02450..5dbc9f9ea7 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -370,6 +370,11 @@ def Test_vim9script_call()
assert_equal(#{a: 1, b: 2}, dictvar)
#{a: 3, b: 4}->DictFunc()
assert_equal(#{a: 3, b: 4}, dictvar)
+
+ ('text')->MyFunc()
+ assert_equal('text', var)
+ ("some")->MyFunc()
+ assert_equal('some', var)
END
writefile(lines, 'Xcall.vim')
source Xcall.vim
diff --git a/src/version.c b/src/version.c
index aa9ff36faf..d889ce7e8a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -739,6 +739,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 298,
+/**/
297,
/**/
296,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index aeb950ca6a..6408b67bf7 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -4821,22 +4821,11 @@ compile_def_function(ufunc_T *ufunc, int set_return_type)
p = (*ea.cmd == '&' || *ea.cmd == '$' || *ea.cmd == '@')
? ea.cmd + 1 : ea.cmd;
p = to_name_end(p);
- if (p > ea.cmd && *p != NUL)
+ if ((p > ea.cmd && *p != NUL) || *p == '(')
{
int oplen;
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);
if (oplen > 0)
{