changeset 17783:45eca7143d7c v8.1.1888

patch 8.1.1888: more functions can be used as methods commit https://github.com/vim/vim/commit/073e4b92e613d22ce7b16e0fbf5c0e40cb5f9b2c Author: Bram Moolenaar <Bram@vim.org> Date: Sun Aug 18 23:01:56 2019 +0200 patch 8.1.1888: more functions can be used as methods Problem: More functions can be used as methods. Solution: Make various functions usable as a method.
author Bram Moolenaar <Bram@vim.org>
date Sun, 18 Aug 2019 23:15:03 +0200
parents 634884027f45
children 0a3a42786ec8
files runtime/doc/eval.txt src/evalfunc.c src/testdir/test_arglist.vim src/testdir/test_balloon_gui.vim src/testdir/test_functions.vim src/testdir/test_hide.vim src/testdir/test_popup.vim src/testdir/test_vimscript.vim src/version.c
diffstat 9 files changed, 79 insertions(+), 39 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1,4 +1,4 @@
-*eval.txt*	For Vim version 8.1.  Last change: 2019 Aug 17
+*eval.txt*	For Vim version 8.1.  Last change: 2019 Aug 18
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -2937,6 +2937,8 @@ and({expr}, {expr})					*and()*
 		to a number.  A List, Dict or Float argument causes an error.
 		Example: >
 			:let flag = and(bits, 0x80)
+<		Can also be used as a |method|: >
+			:let flag = bits->and(0x80)
 
 
 append({lnum}, {text})					*append()*
@@ -3088,6 +3090,8 @@ balloon_show({expr})					*balloon_show()
 			func BalloonCallback(result)
 			  call balloon_show(a:result)
 			endfunc
+<		Can also be used as a |method|: >
+			GetText()->balloon_show()
 <
 		The intended use is that fetching the content of the balloon
 		is initiated from 'balloonexpr'.  It will invoke an
@@ -3105,7 +3109,10 @@ balloon_split({msg})					*balloon_split(
 		splits are made for the current window size and optimize to
 		show debugger output.
 		Returns a |List| with the split lines.
-		{only available when compiled with the |+balloon_eval_term|
+		Can also be used as a |method|: >
+			GetText()->balloon_split()->balloon_show()
+
+<		{only available when compiled with the |+balloon_eval_term|
 		feature}
 
 							*browse()*
@@ -3117,8 +3124,8 @@ browse({save}, {title}, {initdir}, {defa
 		    {title}	title for the requester
 		    {initdir}	directory to start browsing in
 		    {default}	default file name
-		When the "Cancel" button is hit, something went wrong, or
-		browsing is not possible, an empty string is returned.
+		An empty string is returned when the "Cancel" button is hit,
+		something went wrong, or browsing is not possible.
 
 							*browsedir()*
 browsedir({title}, {initdir})
@@ -3144,6 +3151,8 @@ bufadd({name})						*bufadd()*
 			let bufnr = bufadd('someName')
 			call bufload(bufnr)
 			call setbufline(bufnr, 1, ['some', 'text'])
+<		Can also be used as a |method|: >
+			let bufnr = 'somename'->bufadd()
 
 bufexists({expr})					*bufexists()*
 		The result is a Number, which is |TRUE| if a buffer called
@@ -3166,14 +3175,20 @@ bufexists({expr})					*bufexists()*
 		for MS-Windows 8.3 names in the form "c:\DOCUME~1"
 		Use "bufexists(0)" to test for the existence of an alternate
 		file name.
-							*buffer_exists()*
-		Obsolete name: buffer_exists().
+
+		Can also be used as a |method|: >
+			let exists = 'somename'->bufexists()
+<
+		Obsolete name: buffer_exists().		*buffer_exists()*
 
 buflisted({expr})					*buflisted()*
 		The result is a Number, which is |TRUE| if a buffer called
 		{expr} exists and is listed (has the 'buflisted' option set).
 		The {expr} argument is used like with |bufexists()|.
 
+		Can also be used as a |method|: >
+			let listed = 'somename'->buflisted()
+
 bufload({expr})						*bufload()*
 		Ensure the buffer {expr} is loaded.  When the buffer name
 		refers to an existing file then the file is read.  Otherwise
@@ -3183,11 +3198,17 @@ bufload({expr})						*bufload()*
 		there will be no dialog, the buffer will be loaded anyway.
 		The {expr} argument is used like with |bufexists()|.
 
+		Can also be used as a |method|: >
+			eval 'somename'->bufload()
+
 bufloaded({expr})					*bufloaded()*
 		The result is a Number, which is |TRUE| if a buffer called
 		{expr} exists and is loaded (shown in a window or hidden).
 		The {expr} argument is used like with |bufexists()|.
 
+		Can also be used as a |method|: >
+			let loaded = 'somename'->bufloaded()
+
 bufname({expr})						*bufname()*
 		The result is the name of a buffer, as it is displayed by the
 		":ls" command.
@@ -3209,6 +3230,9 @@ bufname({expr})						*bufname()*
 		If the {expr} is a String, but you want to use it as a buffer
 		number, force it to be a Number by adding zero to it: >
 			:echo bufname("3" + 0)
+<		Can also be used as a |method|: >
+			echo bufnr->bufname()
+
 <		If the buffer doesn't exist, or doesn't have a name, an empty
 		string is returned. >
 	bufname("#")		alternate buffer name
@@ -3232,8 +3256,11 @@ bufnr({expr} [, {create}])
 		of existing buffers.  Note that not all buffers with a smaller
 		number necessarily exist, because ":bwipeout" may have removed
 		them.  Use bufexists() to test for the existence of a buffer.
-							*buffer_number()*
-		Obsolete name: buffer_number().
+
+		Can also be used as a |method|: >
+			echo bufref->bufnr()
+<
+		Obsolete name: buffer_number().		*buffer_number()*
 							*last_buffer_nr()*
 		Obsolete name for bufnr("$"): last_buffer_nr().
 
@@ -5834,6 +5861,8 @@ invert({expr})						*invert()*
 		Bitwise invert.  The argument is converted to a number.  A
 		List, Dict or Float argument causes an error.  Example: >
 			:let bits = invert(bits)
+<		Can also be used as a |method|: >
+			:let bits = bits->invert()
 
 isdirectory({directory})				*isdirectory()*
 		The result is a Number, which is |TRUE| when a directory
@@ -6762,11 +6791,14 @@ nr2char({expr} [, {utf8}])				*nr2char()
 		    let str = join(map(list, {_, val -> nr2char(val)}), '')
 <		Result: "ABC"
 
+
 or({expr}, {expr})					*or()*
 		Bitwise OR on the two arguments.  The arguments are converted
 		to a number.  A List, Dict or Float argument causes an error.
 		Example: >
 			:let bits = or(bits, 0x80)
+<		Can also be used as a |method|: >
+			:let bits = bits->or(0x80)
 
 
 pathshorten({expr})					*pathshorten()*
@@ -9689,6 +9721,8 @@ xor({expr}, {expr})					*xor()*
 		to a number.  A List, Dict or Float argument causes an error.
 		Example: >
 			:let bits = xor(bits, 0x80)
+<		Can also be used as a |method|: >
+			:let bits = bits->xor(0x80)
 <
 
 
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -419,7 +419,7 @@ static funcentry_T global_functions[] =
     {"acos",		1, 1, FEARG_1,	  f_acos},	// WJMc
 #endif
     {"add",		2, 2, FEARG_1,	  f_add},
-    {"and",		2, 2, 0,	  f_and},
+    {"and",		2, 2, FEARG_1,	  f_and},
     {"append",		2, 2, FEARG_LAST, f_append},
     {"appendbufline",	3, 3, FEARG_LAST, f_appendbufline},
     {"argc",		0, 1, 0,	  f_argc},
@@ -447,23 +447,23 @@ static funcentry_T global_functions[] =
 #endif
 #ifdef FEAT_BEVAL
     {"balloon_gettext",	0, 0, 0,	  f_balloon_gettext},
-    {"balloon_show",	1, 1, 0,	  f_balloon_show},
+    {"balloon_show",	1, 1, FEARG_1,	  f_balloon_show},
 # if defined(FEAT_BEVAL_TERM)
-    {"balloon_split",	1, 1, 0,	  f_balloon_split},
+    {"balloon_split",	1, 1, FEARG_1,	  f_balloon_split},
 # endif
 #endif
     {"browse",		4, 4, 0,	  f_browse},
     {"browsedir",	2, 2, 0,	  f_browsedir},
-    {"bufadd",		1, 1, 0,	  f_bufadd},
-    {"bufexists",	1, 1, 0,	  f_bufexists},
-    {"buffer_exists",	1, 1, 0,	  f_bufexists},	// obsolete
+    {"bufadd",		1, 1, FEARG_1,	  f_bufadd},
+    {"bufexists",	1, 1, FEARG_1,	  f_bufexists},
+    {"buffer_exists",	1, 1, FEARG_1,	  f_bufexists},	// obsolete
     {"buffer_name",	1, 1, 0,	  f_bufname},	// obsolete
     {"buffer_number",	1, 1, 0,	  f_bufnr},	// obsolete
-    {"buflisted",	1, 1, 0,	  f_buflisted},
-    {"bufload",		1, 1, 0,	  f_bufload},
-    {"bufloaded",	1, 1, 0,	  f_bufloaded},
-    {"bufname",		1, 1, 0,	  f_bufname},
-    {"bufnr",		1, 2, 0,	  f_bufnr},
+    {"buflisted",	1, 1, FEARG_1,	  f_buflisted},
+    {"bufload",		1, 1, FEARG_1,	  f_bufload},
+    {"bufloaded",	1, 1, FEARG_1,	  f_bufloaded},
+    {"bufname",		1, 1, FEARG_1,	  f_bufname},
+    {"bufnr",		1, 2, FEARG_1,	  f_bufnr},
     {"bufwinid",	1, 1, 0,	  f_bufwinid},
     {"bufwinnr",	1, 1, 0,	  f_bufwinnr},
     {"byte2line",	1, 1, 0,	  f_byte2line},
@@ -626,7 +626,7 @@ static funcentry_T global_functions[] =
     {"inputsave",	0, 0, 0,	  f_inputsave},
     {"inputsecret",	1, 2, 0,	  f_inputsecret},
     {"insert",		2, 3, FEARG_1,	  f_insert},
-    {"invert",		1, 1, 0,	  f_invert},
+    {"invert",		1, 1, FEARG_1,	  f_invert},
     {"isdirectory",	1, 1, 0,	  f_isdirectory},
 #if defined(FEAT_FLOAT) && defined(HAVE_MATH_H)
     {"isinf",		1, 1, FEARG_1,	  f_isinf},
@@ -690,7 +690,7 @@ static funcentry_T global_functions[] =
 #endif
     {"nextnonblank",	1, 1, 0,	  f_nextnonblank},
     {"nr2char",		1, 2, 0,	  f_nr2char},
-    {"or",		2, 2, 0,	  f_or},
+    {"or",		2, 2, FEARG_1,	  f_or},
     {"pathshorten",	1, 1, 0,	  f_pathshorten},
 #ifdef FEAT_PERL
     {"perleval",	1, 1, 0,	  f_perleval},
@@ -976,7 +976,7 @@ static funcentry_T global_functions[] =
     {"winwidth",	1, 1, 0,	  f_winwidth},
     {"wordcount",	0, 0, 0,	  f_wordcount},
     {"writefile",	2, 3, 0,	  f_writefile},
-    {"xor",		2, 2, 0,	  f_xor},
+    {"xor",		2, 2, FEARG_1,	  f_xor},
 };
 
 /*
--- a/src/testdir/test_arglist.vim
+++ b/src/testdir/test_arglist.vim
@@ -90,8 +90,8 @@ func Test_argadd_empty_curbuf()
   call assert_equal('', bufname('%'))
   call assert_equal(1, line('$'))
   rew
-  call assert_notequal(curbuf, bufnr('%'))
-  call assert_equal('Xargadd', bufname('%'))
+  call assert_notequal(curbuf, '%'->bufnr())
+  call assert_equal('Xargadd', '%'->bufname())
   call assert_equal(2, line('$'))
 
   call delete('Xargadd')
--- a/src/testdir/test_balloon_gui.vim
+++ b/src/testdir/test_balloon_gui.vim
@@ -12,7 +12,7 @@ func Test_balloon_show_gui()
   call balloon_show('')
 
   let msg = 'that that'
-  call balloon_show(msg)
+  eval msg->balloon_show()
   call assert_equal(msg, balloon_gettext())
   sleep 10m
   call balloon_show('')
--- a/src/testdir/test_functions.vim
+++ b/src/testdir/test_functions.vim
@@ -1537,12 +1537,12 @@ func Test_bufadd_bufload()
 
   let curbuf = bufnr('')
   call writefile(['some', 'text'], 'XotherName')
-  let buf = bufadd('XotherName')
+  let buf = 'XotherName'->bufadd()
   call assert_notequal(0, buf)
-  call assert_equal(1, bufexists('XotherName'))
+  eval 'XotherName'->bufexists()->assert_equal(1)
   call assert_equal(0, getbufvar(buf, '&buflisted'))
   call assert_equal(0, bufloaded(buf))
-  call bufload(buf)
+  eval buf->bufload()
   call assert_equal(1, bufloaded(buf))
   call assert_equal(['some', 'text'], getbufline(buf, 1, '$'))
   call assert_equal(curbuf, bufnr(''))
--- a/src/testdir/test_hide.vim
+++ b/src/testdir/test_hide.vim
@@ -37,7 +37,7 @@ function Test_hide()
   " :hide as a command
   hide
   call assert_equal([orig_bname, orig_winnr], [bufname(''), winnr('$')])
-  call assert_equal([1, 1], [buflisted('Xf1'), bufloaded('Xf1')])
+  call assert_equal([1, 1], ['Xf1'->buflisted(), 'Xf1'->bufloaded()])
   bwipeout! Xf1
 
   new Xf1
--- a/src/testdir/test_popup.vim
+++ b/src/testdir/test_popup.vim
@@ -758,9 +758,8 @@ func Test_popup_and_previewwindow_dump()
 endfunc
 
 func Test_balloon_split()
-  if !exists('*balloon_split')
-    return
-  endif
+  CheckFunction balloon_split
+
   call assert_equal([
         \ 'tempname: 0x555555e380a0 "/home/mool/.viminfz.tmp"',
         \ ], balloon_split(
@@ -771,13 +770,14 @@ func Test_balloon_split()
         \ ], balloon_split(
         \ 'one two three four one two three four one two three four'))
 
-  call assert_equal([
-        \ 'struct = {',
-        \ '  one = 1,',
-        \ '  two = 2,',
-        \ '  three = 3}',
-        \ ], balloon_split(
-        \ 'struct = {one = 1, two = 2, three = 3}'))
+  eval 'struct = {one = 1, two = 2, three = 3}'
+        \ ->balloon_split()
+        \ ->assert_equal([
+        \   'struct = {',
+        \   '  one = 1,',
+        \   '  two = 2,',
+        \   '  three = 3}',
+        \ ])
 
   call assert_equal([
         \ 'struct = {',
--- a/src/testdir/test_vimscript.vim
+++ b/src/testdir/test_vimscript.vim
@@ -1330,6 +1330,7 @@ func Test_bitwise_functions()
     " and
     call assert_equal(127, and(127, 127))
     call assert_equal(16, and(127, 16))
+    eval 127->and(16)->assert_equal(16)
     call assert_equal(0, and(127, 128))
     call assert_fails("call and(1.0, 1)", 'E805:')
     call assert_fails("call and([], 1)", 'E745:')
@@ -1340,6 +1341,7 @@ func Test_bitwise_functions()
     " or
     call assert_equal(23, or(16, 7))
     call assert_equal(15, or(8, 7))
+    eval 8->or(7)->assert_equal(15)
     call assert_equal(123, or(0, 123))
     call assert_fails("call or(1.0, 1)", 'E805:')
     call assert_fails("call or([], 1)", 'E745:')
@@ -1350,6 +1352,7 @@ func Test_bitwise_functions()
     " xor
     call assert_equal(0, xor(127, 127))
     call assert_equal(111, xor(127, 16))
+    eval 127->xor(16)->assert_equal(111)
     call assert_equal(255, xor(127, 128))
     call assert_fails("call xor(1.0, 1)", 'E805:')
     call assert_fails("call xor([], 1)", 'E745:')
@@ -1359,6 +1362,7 @@ func Test_bitwise_functions()
     call assert_fails("call xor(1, {})", 'E728:')
     " invert
     call assert_equal(65408, and(invert(127), 65535))
+    eval 127->invert()->and(65535)->assert_equal(65408)
     call assert_equal(65519, and(invert(16), 65535))
     call assert_equal(65407, and(invert(128), 65535))
     call assert_fails("call invert(1.0)", 'E805:')
--- a/src/version.c
+++ b/src/version.c
@@ -766,6 +766,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1888,
+/**/
     1887,
 /**/
     1886,