diff options
author | Sean Dewar <seandewar@users.noreply.github.com> | 2021-08-27 21:09:37 +0100 |
---|---|---|
committer | Sean Dewar <seandewar@users.noreply.github.com> | 2021-10-03 20:06:32 +0100 |
commit | 3137c7d63574a86ddc44f11c839e8e58c2994bf9 (patch) | |
tree | 20bba9c62b55e08793d0d726893cdb2681e98788 | |
parent | 6110480c290011d96af37c0cba1e7309ef645efb (diff) | |
download | rneovim-3137c7d63574a86ddc44f11c839e8e58c2994bf9.tar.gz rneovim-3137c7d63574a86ddc44f11c839e8e58c2994bf9.tar.bz2 rneovim-3137c7d63574a86ddc44f11c839e8e58c2994bf9.zip |
feat(eval/method): partially port v8.1.1925
Adds method call support for all functions in the patch, but it cannot
be fully ported due to missing tests for:
- getcwd(): requires chdir() and Test_chdir_func() from v8.1.1291.
Note that the method call tests for getreg() and getregtype() were
removed in v8.2.1547, which has already been ported, but doesn't seem to
have been replaced with a new test...
This patch also makes getchangelist()'s argument optional (defaults to
the current buffer).
eval.txt includes a typo for gettabwinvar(), which is fixed in
v8.1.1952.
-rw-r--r-- | runtime/doc/eval.txt | 60 | ||||
-rw-r--r-- | src/nvim/eval.lua | 38 | ||||
-rw-r--r-- | src/nvim/eval/funcs.c | 14 | ||||
-rw-r--r-- | src/nvim/testdir/test_bufline.vim | 2 | ||||
-rw-r--r-- | src/nvim/testdir/test_bufwintabinfo.vim | 4 | ||||
-rw-r--r-- | src/nvim/testdir/test_changelist.vim | 4 | ||||
-rw-r--r-- | src/nvim/testdir/test_cmdline.vim | 2 | ||||
-rw-r--r-- | src/nvim/testdir/test_edit.vim | 6 | ||||
-rw-r--r-- | src/nvim/testdir/test_environ.vim | 2 | ||||
-rw-r--r-- | src/nvim/testdir/test_getvar.vim | 4 | ||||
-rw-r--r-- | src/nvim/testdir/test_jumplist.vim | 2 | ||||
-rw-r--r-- | src/nvim/testdir/test_stat.vim | 6 | ||||
-rw-r--r-- | test/functional/legacy/file_perm_spec.lua | 7 |
13 files changed, 107 insertions, 44 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index 832fc6bc1b..24b6e6da6d 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -4701,6 +4701,9 @@ getbufline({buf}, {lnum} [, {end}]) Example: > :let lines = getbufline(bufnr("myfile"), 1, "$") +< Can also be used as a |method|: > + GetBufnr()->getbufline(lnum) + getbufvar({buf}, {varname} [, {def}]) *getbufvar()* The result is the value of option or local buffer variable {varname} in buffer {buf}. Note that the name without "b:" @@ -4721,8 +4724,11 @@ getbufvar({buf}, {varname} [, {def}]) *getbufvar()* Examples: > :let bufmodified = getbufvar(1, "&mod") :echo "todo myvar = " . getbufvar("todo", "myvar") + +< Can also be used as a |method|: > + GetBufnr()->getbufvar(varname) < -getchangelist({buf}) *getchangelist()* +getchangelist([{buf}]) *getchangelist()* Returns the |changelist| for the buffer {buf}. For the use of {buf}, see |bufname()| above. If buffer {buf} doesn't exist, an empty list is returned. @@ -4738,6 +4744,9 @@ getchangelist({buf}) *getchangelist()* position refers to the position in the list. For other buffers, it is set to the length of the list. + Can also be used as a |method|: > + GetBufnr()->getchangelist() + getchar([expr]) *getchar()* Get a single character from the user or input stream. If [expr] is omitted, wait until a character is available. @@ -4948,6 +4957,9 @@ getcompletion({pat}, {type} [, {filtered}]) *getcompletion()* If there are no matches, an empty list is returned. An invalid value for {type} produces an error. + Can also be used as a |method|: > + GetPattern()->getcompletion('color') +< *getcurpos()* getcurpos() Get the position of the cursor. This is like getpos('.'), but includes an extra "curswant" in the list: @@ -4976,6 +4988,9 @@ getcwd([{winnr}[, {tabnr}]]) *getcwd()* < If {winnr} is -1 it is ignored, only the tab is resolved. {winnr} can be the window number or the |window-ID|. + Can also be used as a |method|: > + GetWinnr()->getcwd() + getenv({name}) *getenv()* Return the value of environment variable {name}. The {name} argument is a string, without a leading '$'. Example: > @@ -4985,6 +5000,9 @@ getenv({name}) *getenv()* is different from a variable set to an empty string. See also |expr-env|. + Can also be used as a |method|: > + GetVarname()->getenv() + getfontname([{name}]) *getfontname()* Without an argument returns the name of the normal font being used. Like what is used for the Normal highlight group @@ -5012,6 +5030,9 @@ getfperm({fname}) *getfperm()* < This will hopefully (from a security point of view) display the string "rw-r--r--" or even "rw-------". + Can also be used as a |method|: > + GetFilename()->getfperm() +< For setting permissions use |setfperm()|. getfsize({fname}) *getfsize()* @@ -5022,6 +5043,9 @@ getfsize({fname}) *getfsize()* If the size of {fname} is too big to fit in a Number then -2 is returned. + Can also be used as a |method|: > + GetFilename()->getfsize() + getftime({fname}) *getftime()* The result is a Number, which is the last modification time of the given file {fname}. The value is measured as seconds @@ -5029,6 +5053,9 @@ getftime({fname}) *getftime()* |localtime()| and |strftime()|. If the file {fname} can't be found -1 is returned. + Can also be used as a |method|: > + GetFilename()->getftime() + getftype({fname}) *getftype()* The result is a String, which is a description of the kind of file of the given file {fname}. @@ -5049,6 +5076,9 @@ getftype({fname}) *getftype()* systems that support it. On some systems only "dir" and "file" are returned. + Can also be used as a |method|: > + GetFilename()->getftype() + getjumplist([{winnr} [, {tabnr}]]) *getjumplist()* Returns the |jumplist| for the specified window. @@ -5068,7 +5098,10 @@ getjumplist([{winnr} [, {tabnr}]]) *getjumplist()* filename filename if available lnum line number - *getline()* + Can also be used as a |method|: > + GetWinnr()->getjumplist() + +< *getline()* getline({lnum} [, {end}]) Without {end} the result is a String, which is line {lnum} from the current buffer. Example: > @@ -5091,6 +5124,9 @@ getline({lnum} [, {end}]) :let end = search("^$") - 1 :let lines = getline(start, end) +< Can also be used as a |method|: > + ComputeLnum()->getline() + < To get lines from another buffer see |getbufline()| getloclist({nr},[, {what}]) *getloclist()* @@ -5221,6 +5257,8 @@ getpos({expr}) Get the position for String {expr}. For possible values of call setpos("'a", save_a_mark) < Also see |getcurpos()| and |setpos()|. + Can also be used as a |method|: > + GetMark()->getpos() getqflist([{what}]) *getqflist()* Returns a |List| with all the current quickfix errors. Each @@ -5339,6 +5377,9 @@ getreg([{regname} [, 1 [, {list}]]]) *getreg()* If {regname} is not specified, |v:register| is used. + Can also be used as a |method|: > + GetRegname()->getreg() + getreginfo([{regname}]) *getreginfo()* Returns detailed information about register {regname} as a Dictionary with the following entries: @@ -5377,6 +5418,9 @@ getregtype([{regname}]) *getregtype()* The {regname} argument is a string. If {regname} is not specified, |v:register| is used. + Can also be used as a |method|: > + GetRegname()->getregtype() + gettabinfo([{tabnr}]) *gettabinfo()* If {tabnr} is not specified, then information about all the tab pages is returned as a |List|. Each List item is a @@ -5390,6 +5434,9 @@ gettabinfo([{tabnr}]) *gettabinfo()* tabpage-local variables windows List of |window-ID|s in the tab page. + Can also be used as a |method|: > + GetTabnr()->gettabinfo() + gettabvar({tabnr}, {varname} [, {def}]) *gettabvar()* Get the value of a tab-local variable {varname} in tab page {tabnr}. |t:var| @@ -5400,6 +5447,9 @@ gettabvar({tabnr}, {varname} [, {def}]) *gettabvar()* When the tab or variable doesn't exist {def} or an empty string is returned, there is no error message. + Can also be used as a |method|: > + GetTabnr()->gettabvar(varname) + gettabwinvar({tabnr}, {winnr}, {varname} [, {def}]) *gettabwinvar()* Get the value of window-local variable {varname} in window {winnr} in tab page {tabnr}. @@ -5426,6 +5476,9 @@ gettabwinvar({tabnr}, {winnr}, {varname} [, {def}]) *gettabwinvar()* To obtain all window-local variables use: > gettabwinvar({tabnr}, {winnr}, '&') +< Can also be used as a |method|: > + GetTabnr()->gettabvar(winnr, varname) + gettagstack([{winnr}]) *gettagstack()* The result is a Dict, which is the tag stack of window {winnr}. {winnr} can be the window number or the |window-ID|. @@ -8339,6 +8392,9 @@ setfperm({fname}, {mode}) *setfperm()* *chmod* Returns non-zero for success, zero for failure. + Can also be used as a |method|: > + GetFilename()->setfperm(mode) +< To read permissions see |getfperm()|. setline({lnum}, {text}) *setline()* diff --git a/src/nvim/eval.lua b/src/nvim/eval.lua index f9f6af3bfd..83a72cc233 100644 --- a/src/nvim/eval.lua +++ b/src/nvim/eval.lua @@ -137,9 +137,9 @@ return { garbagecollect={args={0, 1}}, get={args={2, 3}, base=1}, getbufinfo={args={0, 1}}, - getbufline={args={2, 3}}, - getbufvar={args={2, 3}}, - getchangelist={args={1, 1}}, + getbufline={args={2, 3}, base=1}, + getbufvar={args={2, 3}, base=1}, + getchangelist={args={0, 1}, base=1}, getchar={args={0, 1}}, getcharmod={}, getcharsearch={}, @@ -148,30 +148,30 @@ return { getcmdpos={}, getcmdtype={}, getcmdwintype={}, - getcompletion={args={2, 3}}, + getcompletion={args={2, 3}, base=1}, getcurpos={}, - getcwd={args={0,2}}, - getenv={args={1}}, + getcwd={args={0, 2}, base=1}, + getenv={args={1}, base=1}, getfontname={args={0, 1}}, - getfperm={args=1}, - getfsize={args=1}, - getftime={args=1}, - getftype={args=1}, - getjumplist={args={0, 2}}, - getline={args={1, 2}}, + getfperm={args=1, base=1}, + getfsize={args=1, base=1}, + getftime={args=1, base=1}, + getftype={args=1, base=1}, + getjumplist={args={0, 2}, base=1}, + getline={args={1, 2}, base=1}, getloclist={args={1, 2}}, getmarklist={args={0, 1}}, getmatches={args={0, 1}}, getmousepos={}, getpid={}, - getpos={args=1}, + getpos={args=1, base=1}, getqflist={args={0, 1}}, - getreg={args={0, 3}}, + getreg={args={0, 3}, base=1}, getreginfo={args={0, 1}, base=1}, - getregtype={args={0, 1}}, - gettabinfo={args={0, 1}}, - gettabvar={args={2, 3}}, - gettabwinvar={args={3, 4}}, + getregtype={args={0, 1}, base=1}, + gettabinfo={args={0, 1}, base=1}, + gettabvar={args={2, 3}, base=1}, + gettabwinvar={args={3, 4}, base=1}, gettagstack={args={0, 1}}, getwininfo={args={0, 1}}, getwinpos={args={0, 1}}, @@ -311,7 +311,7 @@ return { setcharsearch={args=1}, setcmdpos={args=1}, setenv={args=2}, - setfperm={args=2}, + setfperm={args=2, base=1}, setline={args=2}, setloclist={args={2, 4}}, setmatches={args={1, 2}}, diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c index 5569d74413..b53b50e766 100644 --- a/src/nvim/eval/funcs.c +++ b/src/nvim/eval/funcs.c @@ -3088,10 +3088,16 @@ f_getbufvar_end: static void f_getchangelist(typval_T *argvars, typval_T *rettv, FunPtr fptr) { tv_list_alloc_ret(rettv, 2); - vim_ignored = tv_get_number(&argvars[0]); // issue errmsg if type error - emsg_off++; - const buf_T *const buf = tv_get_buf(&argvars[0], false); - emsg_off--; + + const buf_T *buf; + if (argvars[0].v_type == VAR_UNKNOWN) { + buf = curbuf; + } else { + vim_ignored = tv_get_number(&argvars[0]); // issue errmsg if type error + emsg_off++; + buf = tv_get_buf(&argvars[0], false); + emsg_off--; + } if (buf == NULL) { return; } diff --git a/src/nvim/testdir/test_bufline.vim b/src/nvim/testdir/test_bufline.vim index 52a60b7b85..765ae17736 100644 --- a/src/nvim/testdir/test_bufline.vim +++ b/src/nvim/testdir/test_bufline.vim @@ -21,7 +21,7 @@ func Test_setbufline_getbufline() call assert_equal(1, setbufline(b, 5, ['x'])) call assert_equal(1, setbufline(1234, 1, ['x'])) call assert_equal(0, setbufline(b, 4, ['d', 'e'])) - call assert_equal(['c'], getbufline(b, 3)) + call assert_equal(['c'], b->getbufline(3)) call assert_equal(['d'], getbufline(b, 4)) call assert_equal(['e'], getbufline(b, 5)) call assert_equal([], getbufline(b, 6)) diff --git a/src/nvim/testdir/test_bufwintabinfo.vim b/src/nvim/testdir/test_bufwintabinfo.vim index 4b5b55e6bf..b0258547b8 100644 --- a/src/nvim/testdir/test_bufwintabinfo.vim +++ b/src/nvim/testdir/test_bufwintabinfo.vim @@ -88,7 +88,7 @@ function Test_getbufwintabinfo() call assert_equal(2, tablist[1].tabnr) call assert_equal('build', tablist[0].variables.space) call assert_equal(w2_id, tablist[0].windows[0]) - call assert_equal([], gettabinfo(3)) + call assert_equal([], 3->gettabinfo()) tabonly | only @@ -106,7 +106,7 @@ function Test_getbufwintabinfo() endfunction function Test_get_buf_options() - let opts = getbufvar(bufnr('%'), '&') + let opts = bufnr()->getbufvar('&') call assert_equal(v:t_dict, type(opts)) call assert_equal(8, opts.tabstop) endfunc diff --git a/src/nvim/testdir/test_changelist.vim b/src/nvim/testdir/test_changelist.vim index dd6ea9600c..ce77c1f3c7 100644 --- a/src/nvim/testdir/test_changelist.vim +++ b/src/nvim/testdir/test_changelist.vim @@ -8,8 +8,8 @@ func Test_getchangelist() bwipe! enew - call assert_equal([], getchangelist(10)) - call assert_equal([[], 0], getchangelist('%')) + call assert_equal([], 10->getchangelist()) + call assert_equal([[], 0], getchangelist()) call writefile(['line1', 'line2', 'line3'], 'Xfile1.txt') call writefile(['line1', 'line2', 'line3'], 'Xfile2.txt') diff --git a/src/nvim/testdir/test_cmdline.vim b/src/nvim/testdir/test_cmdline.vim index 5a6824b5c1..ffca415282 100644 --- a/src/nvim/testdir/test_cmdline.vim +++ b/src/nvim/testdir/test_cmdline.vim @@ -260,7 +260,7 @@ func Test_getcompletion() endif let groupcount = len(getcompletion('', 'event')) call assert_true(groupcount > 0) - let matchcount = len(getcompletion('File', 'event')) + let matchcount = len('File'->getcompletion('event')) call assert_true(matchcount > 0) call assert_true(groupcount > matchcount) diff --git a/src/nvim/testdir/test_edit.vim b/src/nvim/testdir/test_edit.vim index e1393e875b..2b389c015f 100644 --- a/src/nvim/testdir/test_edit.vim +++ b/src/nvim/testdir/test_edit.vim @@ -201,11 +201,11 @@ func Test_edit_07() endfu au InsertCharPre <buffer> :call DoIt() call feedkeys("A\<f5>\<c-p>u\<cr>\<c-l>\<cr>", 'tx') - call assert_equal(["Jan\<c-l>",''], getline(1,'$')) + call assert_equal(["Jan\<c-l>",''], 1->getline('$')) %d call setline(1, 'J') call feedkeys("A\<f5>\<c-p>u\<down>\<c-l>\<cr>", 'tx') - call assert_equal(["January"], getline(1,'$')) + call assert_equal(["January"], 1->getline('$')) delfu ListMonths delfu DoIt @@ -348,7 +348,7 @@ func Test_edit_12() call cursor(2, 4) call feedkeys("R^\<c-d>", 'tnix') call assert_equal(["\tabc", "def"], getline(1, '$')) - call assert_equal([0, 2, 2, 0], getpos('.')) + call assert_equal([0, 2, 2, 0], '.'->getpos()) %d call setline(1, ["\tabc", "\t\tdef"]) call cursor(2, 2) diff --git a/src/nvim/testdir/test_environ.vim b/src/nvim/testdir/test_environ.vim index a25d83753c..cc15b63824 100644 --- a/src/nvim/testdir/test_environ.vim +++ b/src/nvim/testdir/test_environ.vim @@ -15,7 +15,7 @@ endfunc func Test_getenv() unlet! $TESTENV - call assert_equal(v:null, getenv('TESTENV')) + call assert_equal(v:null, 'TESTENV'->getenv()) let $TESTENV = 'foo' call assert_equal('foo', getenv('TESTENV')) endfunc diff --git a/src/nvim/testdir/test_getvar.vim b/src/nvim/testdir/test_getvar.vim index 3b61d68ebc..e9868c7887 100644 --- a/src/nvim/testdir/test_getvar.vim +++ b/src/nvim/testdir/test_getvar.vim @@ -31,7 +31,7 @@ func Test_var() let t:other = 777 let def_list = [4, 5, 6, 7] tabrewind - call assert_equal([1, 2, 3], gettabvar(3, 'var_list')) + call assert_equal([1, 2, 3], 3->gettabvar('var_list')) call assert_equal([1, 2, 3], gettabvar(3, 'var_list', def_list)) call assert_equal({'var_list': [1, 2, 3], 'other': 777}, gettabvar(3, '')) call assert_equal({'var_list': [1, 2, 3], 'other': 777}, @@ -61,7 +61,7 @@ func Test_var() let def_dict = {'dict2': 'newval'} wincmd b tabrewind - call assert_equal({'dict': 'tabwin'}, gettabwinvar(2, 3, 'var_dict')) + call assert_equal({'dict': 'tabwin'}, 2->gettabwinvar(3, 'var_dict')) call assert_equal({'dict': 'tabwin'}, \ gettabwinvar(2, 3, 'var_dict', def_dict)) call assert_equal({'var_dict': {'dict': 'tabwin'}}, gettabwinvar(2, 3, '')) diff --git a/src/nvim/testdir/test_jumplist.vim b/src/nvim/testdir/test_jumplist.vim index be1af5e705..9cfbbe2029 100644 --- a/src/nvim/testdir/test_jumplist.vim +++ b/src/nvim/testdir/test_jumplist.vim @@ -39,7 +39,7 @@ func Test_getjumplist() " Traverse the jump list and verify the results 5 exe "normal \<C-O>" - call assert_equal(2, getjumplist(1)[1]) + call assert_equal(2, 1->getjumplist()[1]) exe "normal 2\<C-O>" call assert_equal(0, getjumplist(1, 1)[1]) exe "normal 3\<C-I>" diff --git a/src/nvim/testdir/test_stat.vim b/src/nvim/testdir/test_stat.vim index 5b7df33d2c..170358e023 100644 --- a/src/nvim/testdir/test_stat.vim +++ b/src/nvim/testdir/test_stat.vim @@ -10,7 +10,7 @@ func CheckFileTime(doSleep) let fl = ['Hello World!'] for fname in fnames call writefile(fl, fname) - call add(times, getftime(fname)) + call add(times, fname->getftime()) if a:doSleep sleep 1 endif @@ -19,8 +19,8 @@ func CheckFileTime(doSleep) let time_correct = (times[0] <= times[1] && times[1] <= times[2]) if a:doSleep || time_correct call assert_true(time_correct, printf('Expected %s <= %s <= %s', times[0], times[1], times[2])) - call assert_equal(strlen(fl[0] . "\n"), getfsize(fnames[0])) - call assert_equal('file', getftype(fnames[0])) + call assert_equal(strlen(fl[0] . "\n"), fnames[0]->getfsize()) + call assert_equal('file', fnames[0]->getftype()) call assert_equal('rw-', getfperm(fnames[0])[0:2]) let result = 1 endif diff --git a/test/functional/legacy/file_perm_spec.lua b/test/functional/legacy/file_perm_spec.lua index 8fdee95e91..ccdbfe0534 100644 --- a/test/functional/legacy/file_perm_spec.lua +++ b/test/functional/legacy/file_perm_spec.lua @@ -3,7 +3,7 @@ require('os') local helpers = require('test.functional.helpers')(after_each) local clear, call, eq = helpers.clear, helpers.call, helpers.eq -local neq, exc_exec = helpers.neq, helpers.exc_exec +local neq, exc_exec, eval = helpers.neq, helpers.exc_exec, helpers.eval describe('Test getting and setting file permissions', function() local tempfile = helpers.tmpname() @@ -14,11 +14,12 @@ describe('Test getting and setting file permissions', function() end) it('file permissions', function() + -- eval() is used to test VimL method syntax for setfperm() and getfperm() eq('', call('getfperm', tempfile)) - eq(0, call('setfperm', tempfile, 'r--------')) + eq(0, eval("'" .. tempfile .. "'->setfperm('r--------')")) call('writefile', {'one'}, tempfile) - eq(9, call('len', call('getfperm', tempfile))) + eq(9, eval("len('" .. tempfile .. "'->getfperm())")) eq(1, call('setfperm', tempfile, 'rwx------')) if helpers.is_os('win') then |