changeset 17661:da7890e3359b v8.1.1828

patch 8.1.1828: not strict enough checking syntax of method invocation commit https://github.com/vim/vim/commit/5184132ec015f5889a3195d911e609d214f06bed Author: Bram Moolenaar <Bram@vim.org> Date: Thu Aug 8 21:10:01 2019 +0200 patch 8.1.1828: not strict enough checking syntax of method invocation Problem: Not strict enough checking syntax of method invocation. Solution: Check there is no white space inside ->method(.
author Bram Moolenaar <Bram@vim.org>
date Thu, 08 Aug 2019 21:15:05 +0200
parents fc25327e28ea
children 0e3981c7a505
files runtime/doc/eval.txt src/eval.c src/testdir/test_method.vim src/version.c
diffstat 4 files changed, 29 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1223,12 +1223,19 @@ For methods that are also available as g
 	name(expr8 [, args])
 There can also be methods specifically for the type of "expr8".
 
-"->name(" must not contain white space.  There can be white space before "->"
-and after the "(".
-
-This allows for chaining, using the type that the method returns: >
+This allows for chaining, passing the value that one method returns to the
+next method: >
 	mylist->filter(filterexpr)->map(mapexpr)->sort()->join()
 <
+							*E274*
+"->name(" must not contain white space.  There can be white space before the
+"->" and after the "(", thus you can split the lines like this: >
+	mylist
+	\ ->filter(filterexpr)
+	\ ->map(mapexpr)
+	\ ->sort()
+	\ ->join()
+<
 
 							*expr9*
 number
--- a/src/eval.c
+++ b/src/eval.c
@@ -4862,6 +4862,12 @@ eval_method(
 		semsg(_(e_missingparen), name);
 	    ret = FAIL;
 	}
+	else if (VIM_ISWHITE((*arg)[-1]))
+	{
+	    if (verbose)
+		semsg(_("E274: No white space allowed before parenthesis"));
+	    ret = FAIL;
+	}
 	else
 	    ret = eval_func(arg, name, len, rettv, evaluate, &base);
     }
--- a/src/testdir/test_method.vim
+++ b/src/testdir/test_method.vim
@@ -112,3 +112,13 @@ func Test_method_funcref()
 
   delfunc Concat
 endfunc
+
+func Test_method_syntax()
+  eval [1, 2, 3]  ->sort( )
+  eval [1, 2, 3]  
+	\ ->sort(
+	\ )
+  call assert_fails('eval [1, 2, 3]-> sort()', 'E260:')
+  call assert_fails('eval [1, 2, 3]->sort ()', 'E274:')
+  call assert_fails('eval [1, 2, 3]-> sort ()', 'E260:')
+endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -770,6 +770,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1828,
+/**/
     1827,
 /**/
     1826,