mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	feat(eval/method): partially port v8.1.1954
Does not include listener_*() functions. js_*() functions are N/A. json_encode() and json_decode() didn't include tests; add some anyway (to json_functions_spec.lua). test_lua.vim isn't included yet, so add tests to luaeval_spec.lua.
This commit is contained in:
		| @@ -1204,7 +1204,7 @@ next method: > | |||||||
| 	mylist->filter(filterexpr)->map(mapexpr)->sort()->join() | 	mylist->filter(filterexpr)->map(mapexpr)->sort()->join() | ||||||
| < | < | ||||||
| Example of using a lambda: > | Example of using a lambda: > | ||||||
| 	GetPercentage->{x -> x * 100}()->printf('%d%%') | 	GetPercentage()->{x -> x * 100}()->printf('%d%%') | ||||||
| < | < | ||||||
| When using -> the |expr7| operators will be applied first, thus: > | When using -> the |expr7| operators will be applied first, thus: > | ||||||
| 	-1.234->string() | 	-1.234->string() | ||||||
| @@ -6384,6 +6384,9 @@ json_decode({expr})					*json_decode()* | |||||||
| 		recommended and the only one required to be supported. | 		recommended and the only one required to be supported. | ||||||
| 		Non-UTF-8 characters are an error. | 		Non-UTF-8 characters are an error. | ||||||
|  |  | ||||||
|  | 		Can also be used as a |method|: > | ||||||
|  | 			ReadObject()->json_decode() | ||||||
|  |  | ||||||
| json_encode({expr})					*json_encode()* | json_encode({expr})					*json_encode()* | ||||||
| 		Convert {expr} into a JSON string.  Accepts | 		Convert {expr} into a JSON string.  Accepts | ||||||
| 		|msgpack-special-dict| as the input.  Will not convert | 		|msgpack-special-dict| as the input.  Will not convert | ||||||
| @@ -6396,6 +6399,9 @@ json_encode({expr})					*json_encode()* | |||||||
| 		or special escapes like "\t", other are dumped as-is. | 		or special escapes like "\t", other are dumped as-is. | ||||||
| 		|Blob|s are converted to arrays of the individual bytes. | 		|Blob|s are converted to arrays of the individual bytes. | ||||||
|  |  | ||||||
|  | 		Can also be used as a |method|: > | ||||||
|  | 			GetObject()->json_encode() | ||||||
|  |  | ||||||
| keys({dict})						*keys()* | keys({dict})						*keys()* | ||||||
| 		Return a |List| with all the keys of {dict}.  The |List| is in | 		Return a |List| with all the keys of {dict}.  The |List| is in | ||||||
| 		arbitrary order.  Also see |items()| and |values()|. | 		arbitrary order.  Also see |items()| and |values()|. | ||||||
| @@ -6459,6 +6465,10 @@ libcall({libname}, {funcname}, {argument}) | |||||||
| 		object code must be compiled as position-independent ('PIC'). | 		object code must be compiled as position-independent ('PIC'). | ||||||
| 		Examples: > | 		Examples: > | ||||||
| 			:echo libcall("libc.so", "getenv", "HOME") | 			:echo libcall("libc.so", "getenv", "HOME") | ||||||
|  |  | ||||||
|  | <		Can also be used as a |method|, where the base is passed as | ||||||
|  | 		the argument to the called function: > | ||||||
|  | 			GetValue()->libcall("libc.so", "getenv") | ||||||
| < | < | ||||||
| 							*libcallnr()* | 							*libcallnr()* | ||||||
| libcallnr({libname}, {funcname}, {argument}) | libcallnr({libname}, {funcname}, {argument}) | ||||||
| @@ -6468,6 +6478,10 @@ libcallnr({libname}, {funcname}, {argument}) | |||||||
| 			:echo libcallnr("/usr/lib/libc.so", "getpid", "") | 			:echo libcallnr("/usr/lib/libc.so", "getpid", "") | ||||||
| 			:call libcallnr("libc.so", "printf", "Hello World!\n") | 			:call libcallnr("libc.so", "printf", "Hello World!\n") | ||||||
| 			:call libcallnr("libc.so", "sleep", 10) | 			:call libcallnr("libc.so", "sleep", 10) | ||||||
|  | < | ||||||
|  | 		Can also be used as a |method|, where the base is passed as | ||||||
|  | 		the argument to the called function: > | ||||||
|  | 			GetValue()->libcallnr("libc.so", "printf") | ||||||
| < | < | ||||||
| 							*line()* | 							*line()* | ||||||
| line({expr})	The result is a Number, which is the line number of the file | line({expr})	The result is a Number, which is the line number of the file | ||||||
| @@ -6493,6 +6507,9 @@ line({expr})	The result is a Number, which is the line number of the file | |||||||
| 			line(".")		line number of the cursor | 			line(".")		line number of the cursor | ||||||
| 			line("'t")		line number of mark t | 			line("'t")		line number of mark t | ||||||
| 			line("'" . marker)	line number of mark marker | 			line("'" . marker)	line number of mark marker | ||||||
|  | < | ||||||
|  | 		Can also be used as a |method|: > | ||||||
|  | 			GetValue()->line() | ||||||
|  |  | ||||||
| line2byte({lnum})					*line2byte()* | line2byte({lnum})					*line2byte()* | ||||||
| 		Return the byte count from the start of the buffer for line | 		Return the byte count from the start of the buffer for line | ||||||
| @@ -6507,6 +6524,9 @@ line2byte({lnum})					*line2byte()* | |||||||
| 		|getline()|.  When {lnum} is invalid -1 is returned. | 		|getline()|.  When {lnum} is invalid -1 is returned. | ||||||
| 		Also see |byte2line()|, |go| and |:goto|. | 		Also see |byte2line()|, |go| and |:goto|. | ||||||
|  |  | ||||||
|  | 		Can also be used as a |method|: > | ||||||
|  | 			GetLnum()->line2byte() | ||||||
|  |  | ||||||
| lispindent({lnum})					*lispindent()* | lispindent({lnum})					*lispindent()* | ||||||
| 		Get the amount of indent for line {lnum} according the lisp | 		Get the amount of indent for line {lnum} according the lisp | ||||||
| 		indenting rules, as with 'lisp'. | 		indenting rules, as with 'lisp'. | ||||||
| @@ -6514,6 +6534,9 @@ lispindent({lnum})					*lispindent()* | |||||||
| 		relevant.  {lnum} is used just like in |getline()|. | 		relevant.  {lnum} is used just like in |getline()|. | ||||||
| 		When {lnum} is invalid, -1 is returned. | 		When {lnum} is invalid, -1 is returned. | ||||||
|  |  | ||||||
|  | 		Can also be used as a |method|: > | ||||||
|  | 			GetLnum()->lispindent() | ||||||
|  |  | ||||||
| list2str({list} [, {utf8}])				*list2str()* | list2str({list} [, {utf8}])				*list2str()* | ||||||
| 		Convert each number in {list} to a character string can | 		Convert each number in {list} to a character string can | ||||||
| 		concatenate them all.  Examples: > | 		concatenate them all.  Examples: > | ||||||
| @@ -6528,6 +6551,9 @@ list2str({list} [, {utf8}])				*list2str()* | |||||||
| 		With utf-8 composing characters work as expected: > | 		With utf-8 composing characters work as expected: > | ||||||
| 			list2str([97, 769])	returns "á" | 			list2str([97, 769])	returns "á" | ||||||
| < | < | ||||||
|  | 		Can also be used as a |method|: > | ||||||
|  | 			GetList()->list2str() | ||||||
|  |  | ||||||
| localtime()						*localtime()* | localtime()						*localtime()* | ||||||
| 		Return the current time, measured as seconds since 1st Jan | 		Return the current time, measured as seconds since 1st Jan | ||||||
| 		1970.  See also |strftime()|, |strptime()| and |getftime()|. | 		1970.  See also |strftime()|, |strptime()| and |getftime()|. | ||||||
| @@ -6562,6 +6588,9 @@ luaeval({expr}[, {expr}]) | |||||||
| 		Evaluate Lua expression {expr} and return its result converted | 		Evaluate Lua expression {expr} and return its result converted | ||||||
| 		to Vim data structures. See |lua-eval| for more details. | 		to Vim data structures. See |lua-eval| for more details. | ||||||
|  |  | ||||||
|  | 		Can also be used as a |method|: > | ||||||
|  | 			GetExpr()->luaeval() | ||||||
|  |  | ||||||
| map({expr1}, {expr2})					*map()* | map({expr1}, {expr2})					*map()* | ||||||
| 		{expr1} must be a |List|, |Blob| or |Dictionary|. | 		{expr1} must be a |List|, |Blob| or |Dictionary|. | ||||||
| 		Replace each item in {expr1} with the result of evaluating | 		Replace each item in {expr1} with the result of evaluating | ||||||
|   | |||||||
| @@ -220,21 +220,21 @@ return { | |||||||
|     jobstop={args=1}, |     jobstop={args=1}, | ||||||
|     jobwait={args={1, 2}}, |     jobwait={args={1, 2}}, | ||||||
|     join={args={1, 2}, base=1}, |     join={args={1, 2}, base=1}, | ||||||
|     json_decode={args=1}, |     json_decode={args=1, base=1}, | ||||||
|     json_encode={args=1}, |     json_encode={args=1, base=1}, | ||||||
|     keys={args=1, base=1}, |     keys={args=1, base=1}, | ||||||
|     last_buffer_nr={},  -- obsolete |     last_buffer_nr={},  -- obsolete | ||||||
|     len={args=1, base=1}, |     len={args=1, base=1}, | ||||||
|     libcall={args=3}, |     libcall={args=3, base=3}, | ||||||
|     libcallnr={args=3}, |     libcallnr={args=3, base=3}, | ||||||
|     line={args={1, 2}}, |     line={args={1, 2}, base=1}, | ||||||
|     line2byte={args=1}, |     line2byte={args=1, base=1}, | ||||||
|     lispindent={args=1}, |     lispindent={args=1, base=1}, | ||||||
|     list2str={args={1, 2}}, |     list2str={args={1, 2}, base=1}, | ||||||
|     localtime={}, |     localtime={}, | ||||||
|     log={args=1, base=1, func="float_op_wrapper", data="&log"}, |     log={args=1, base=1, func="float_op_wrapper", data="&log"}, | ||||||
|     log10={args=1, base=1, func="float_op_wrapper", data="&log10"}, |     log10={args=1, base=1, func="float_op_wrapper", data="&log10"}, | ||||||
|     luaeval={args={1, 2}}, |     luaeval={args={1, 2}, base=1}, | ||||||
|     map={args=2, base=1}, |     map={args=2, base=1}, | ||||||
|     maparg={args={1, 4}}, |     maparg={args={1, 4}}, | ||||||
|     mapcheck={args={1, 3}}, |     mapcheck={args={1, 3}}, | ||||||
|   | |||||||
| @@ -88,7 +88,7 @@ func Test_argadd_empty_curbuf() | |||||||
|   argadd Xargadd |   argadd Xargadd | ||||||
|   call assert_equal(curbuf, bufnr('%')) |   call assert_equal(curbuf, bufnr('%')) | ||||||
|   call assert_equal('', bufname('%')) |   call assert_equal('', bufname('%')) | ||||||
|   call assert_equal(1, line('$')) |   call assert_equal(1, '$'->line()) | ||||||
|   rew |   rew | ||||||
|   call assert_notequal(curbuf, '%'->bufnr()) |   call assert_notequal(curbuf, '%'->bufnr()) | ||||||
|   call assert_equal('Xargadd', '%'->bufname()) |   call assert_equal('Xargadd', '%'->bufname()) | ||||||
|   | |||||||
| @@ -905,7 +905,7 @@ func Test_byte2line_line2byte() | |||||||
|   call assert_equal([-1, -1, 1, 1, 2, 2, 2, 3, 3, -1], |   call assert_equal([-1, -1, 1, 1, 2, 2, 2, 3, 3, -1], | ||||||
|   \                 map(range(-1, 8), 'v:val->byte2line()')) |   \                 map(range(-1, 8), 'v:val->byte2line()')) | ||||||
|   call assert_equal([-1, -1, 1, 3, 6, 8, -1], |   call assert_equal([-1, -1, 1, 3, 6, 8, -1], | ||||||
|   \                 map(range(-1, 5), 'line2byte(v:val)')) |   \                 map(range(-1, 5), 'v:val->line2byte()')) | ||||||
|  |  | ||||||
|   set fileformat=dos |   set fileformat=dos | ||||||
|   call assert_equal([-1, -1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, -1], |   call assert_equal([-1, -1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, -1], | ||||||
| @@ -1505,17 +1505,17 @@ func Test_libcall_libcallnr() | |||||||
|   endif |   endif | ||||||
|  |  | ||||||
|   if has('win32') |   if has('win32') | ||||||
|     call assert_equal($USERPROFILE, libcall(libc, 'getenv', 'USERPROFILE')) |     call assert_equal($USERPROFILE, 'USERPROFILE'->libcall(libc, 'getenv')) | ||||||
|   else |   else | ||||||
|     call assert_equal($HOME, libcall(libc, 'getenv', 'HOME')) |     call assert_equal($HOME, 'HOME'->libcall(libc, 'getenv')) | ||||||
|   endif |   endif | ||||||
|  |  | ||||||
|   " If function returns NULL, libcall() should return an empty string. |   " If function returns NULL, libcall() should return an empty string. | ||||||
|   call assert_equal('', libcall(libc, 'getenv', 'X_ENV_DOES_NOT_EXIT')) |   call assert_equal('', libcall(libc, 'getenv', 'X_ENV_DOES_NOT_EXIT')) | ||||||
|  |  | ||||||
|   " Test libcallnr() with string and integer argument. |   " Test libcallnr() with string and integer argument. | ||||||
|   call assert_equal(4, libcallnr(libc, 'strlen', 'abcd')) |   call assert_equal(4, 'abcd'->libcallnr(libc, 'strlen')) | ||||||
|   call assert_equal(char2nr('A'), libcallnr(libc, 'toupper', char2nr('a'))) |   call assert_equal(char2nr('A'), char2nr('a')->libcallnr(libc, 'toupper')) | ||||||
|  |  | ||||||
|   call assert_fails("call libcall(libc, 'Xdoesnotexist_', '')", 'E364:') |   call assert_fails("call libcall(libc, 'Xdoesnotexist_', '')", 'E364:') | ||||||
|   call assert_fails("call libcallnr(libc, 'Xdoesnotexist_', '')", 'E364:') |   call assert_fails("call libcallnr(libc, 'Xdoesnotexist_', '')", 'E364:') | ||||||
|   | |||||||
| @@ -43,6 +43,9 @@ func Test_lisp_indent() | |||||||
| 	      \ ',@body', | 	      \ ',@body', | ||||||
| 	      \ '(princ "</a>")))' | 	      \ '(princ "</a>")))' | ||||||
| 	      \ ]) | 	      \ ]) | ||||||
|  |   call assert_equal(7, lispindent(2)) | ||||||
|  |   call assert_equal(5, 6->lispindent()) | ||||||
|  |  | ||||||
|   set lisp |   set lisp | ||||||
|   set lispwords& |   set lispwords& | ||||||
|   let save_copt = &cpoptions |   let save_copt = &cpoptions | ||||||
|   | |||||||
| @@ -111,7 +111,7 @@ func Test_list2str_str2list_utf8() | |||||||
|   let s = "\u304b\u3099\u3044" |   let s = "\u304b\u3099\u3044" | ||||||
|   let l = [0x304b, 0x3099, 0x3044] |   let l = [0x304b, 0x3099, 0x3044] | ||||||
|   call assert_equal(l, str2list(s, 1)) |   call assert_equal(l, str2list(s, 1)) | ||||||
|   call assert_equal(s, list2str(l, 1)) |   call assert_equal(s, l->list2str(1)) | ||||||
|   if &enc ==# 'utf-8' |   if &enc ==# 'utf-8' | ||||||
|     call assert_equal(str2list(s), str2list(s, 1)) |     call assert_equal(str2list(s), str2list(s, 1)) | ||||||
|     call assert_equal(list2str(l), list2str(l, 1)) |     call assert_equal(list2str(l), list2str(l, 1)) | ||||||
|   | |||||||
| @@ -86,14 +86,15 @@ describe('luaeval()', function() | |||||||
|   -- meaningful later. |   -- meaningful later. | ||||||
|  |  | ||||||
|   it('correctly evaluates scalars', function() |   it('correctly evaluates scalars', function() | ||||||
|  |     -- Also test method call (->) syntax | ||||||
|     eq(1, funcs.luaeval('1')) |     eq(1, funcs.luaeval('1')) | ||||||
|     eq(0, eval('type(luaeval("1"))')) |     eq(0, eval('"1"->luaeval()->type()')) | ||||||
|  |  | ||||||
|     eq(1.5, funcs.luaeval('1.5')) |     eq(1.5, funcs.luaeval('1.5')) | ||||||
|     eq(5, eval('type(luaeval("1.5"))')) |     eq(5, eval('"1.5"->luaeval()->type()')) | ||||||
|  |  | ||||||
|     eq("test", funcs.luaeval('"test"')) |     eq("test", funcs.luaeval('"test"')) | ||||||
|     eq(1, eval('type(luaeval("\'test\'"))')) |     eq(1, eval('"\'test\'"->luaeval()->type()')) | ||||||
|  |  | ||||||
|     eq('', funcs.luaeval('""')) |     eq('', funcs.luaeval('""')) | ||||||
|     eq('\000', funcs.luaeval([['\0']])) |     eq('\000', funcs.luaeval([['\0']])) | ||||||
|   | |||||||
| @@ -168,7 +168,8 @@ describe('json_decode() function', function() | |||||||
|   end) |   end) | ||||||
|  |  | ||||||
|   it('parses floating-point numbers', function() |   it('parses floating-point numbers', function() | ||||||
|     eq('100000.0', eval('string(json_decode("100000.0"))')) |     -- Also test method call (->) syntax | ||||||
|  |     eq('100000.0', eval('"100000.0"->json_decode()->string()')) | ||||||
|     eq(100000.5, funcs.json_decode('100000.5')) |     eq(100000.5, funcs.json_decode('100000.5')) | ||||||
|     eq(-100000.5, funcs.json_decode('-100000.5')) |     eq(-100000.5, funcs.json_decode('-100000.5')) | ||||||
|     eq(-100000.5e50, funcs.json_decode('-100000.5e50')) |     eq(-100000.5e50, funcs.json_decode('-100000.5e50')) | ||||||
| @@ -549,11 +550,12 @@ describe('json_encode() function', function() | |||||||
|   end) |   end) | ||||||
|  |  | ||||||
|   it('dumps floats', function() |   it('dumps floats', function() | ||||||
|     eq('0.0', eval('json_encode(0.0)')) |     -- Also test method call (->) syntax | ||||||
|  |     eq('0.0', eval('0.0->json_encode()')) | ||||||
|     eq('10.5', funcs.json_encode(10.5)) |     eq('10.5', funcs.json_encode(10.5)) | ||||||
|     eq('-10.5', funcs.json_encode(-10.5)) |     eq('-10.5', funcs.json_encode(-10.5)) | ||||||
|     eq('-1.0e-5', funcs.json_encode(-1e-5)) |     eq('-1.0e-5', funcs.json_encode(-1e-5)) | ||||||
|     eq('1.0e50', eval('json_encode(1.0e50)')) |     eq('1.0e50', eval('1.0e50->json_encode()')) | ||||||
|   end) |   end) | ||||||
|  |  | ||||||
|   it('fails to dump NaN and infinite values', function() |   it('fails to dump NaN and infinite values', function() | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Sean Dewar
					Sean Dewar