changeset 19481:c27837cbe922 v8.2.0298

patch 8.2.0298: Vim9 script: cannot start command with a string constant Commit: https://github.com/vim/vim/commit/0c6ceaf90389b41545d803458c4813013811c756 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Feb 22 18:36:32 2020 +0100 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 '('.
author Bram Moolenaar <Bram@vim.org>
date Sat, 22 Feb 2020 18:45:04 +0100
parents 341343c30a23
children 5bb16fb9c9d1
files runtime/doc/vim9.txt src/ex_docmd.c src/testdir/test_vim9_script.vim src/version.c src/vim9compile.c
diffstat 5 files changed, 17 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- 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 ~
--- 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] == ':'
--- 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
--- 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,
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -4821,22 +4821,11 @@ compile_def_function(ufunc_T *ufunc, int
 	    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)
 		{