diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-02-22 18:36:32 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-02-22 18:36:32 +0100 |
commit | 0c6ceaf90389b41545d803458c4813013811c756 (patch) | |
tree | 885e0983a420271d5d98b58e7669252d972f8bd5 | |
parent | 8b430b4c1df74bde757a7e5ee0ee2854fdad6472 (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.txt | 8 | ||||
-rw-r--r-- | src/ex_docmd.c | 6 | ||||
-rw-r--r-- | src/testdir/test_vim9_script.vim | 5 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 13 |
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) { |