Patch 8.1.1954
Problem:    More functions can be used as a method.
Solution:   Allow more functions to be used as a method.
Files:      runtime/doc/eval.txt, src/evalfunc.c,
            src/testdir/test_arglist.vim, src/testdir/test_functions.vim,
            src/testdir/test_json.vim, src/testdir/test_lispwords.vim,
            src/testdir/test_listener.vim, src/testdir/test_lua.vim,
            src/testdir/test_utf8.vim


*** ../vim-8.1.1953/runtime/doc/eval.txt        2019-08-31 21:17:35.590131466 
+0200
--- runtime/doc/eval.txt        2019-08-31 22:13:35.499178117 +0200
***************
*** 1228,1234 ****
        mylist->filter(filterexpr)->map(mapexpr)->sort()->join()
  <
  Example of using a lambda: >
!       GetPercentage->{x -> x * 100}()->printf('%d%%')
  <
  When using -> the |expr7| operators will be applied first, thus: >
        -1.234->string()
--- 1228,1234 ----
        mylist->filter(filterexpr)->map(mapexpr)->sort()->join()
  <
  Example of using a lambda: >
!       GetPercentage()->{x -> x * 100}()->printf('%d%%')
  <
  When using -> the |expr7| operators will be applied first, thus: >
        -1.234->string()
***************
*** 6198,6203 ****
--- 6206,6214 ----
                - Empty items in an array (between two commas) are allowed and
                  result in v:none items.
  
+               Can also be used as a |method|: >
+                       ReadObject()->js_decode()
+ 
  js_encode({expr})                                     *js_encode()*
                This is similar to |json_encode()| with these differences:
                - Object key names are not in quotes.
***************
*** 6212,6217 ****
--- 6223,6230 ----
                This encoding is valid for JavaScript. It is more efficient
                than JSON, especially when using an array with optional items.
  
+               Can also be used as a |method|: >
+                       GetObject()->js_encode()
  
  json_decode({string})                                 *json_decode()*
                This parses a JSON formatted string and returns the equivalent
***************
*** 6246,6251 ****
--- 6259,6266 ----
                accepted by json_decode() as the result must be a valid Vim
                type, e.g. this fails: {"a":"b", "a":"c"}
  
+               Can also be used as a |method|: >
+                       ReadObject()->json_decode()
  
  json_encode({expr})                                   *json_encode()*
                Encode {expr} as JSON and return this as a string.
***************
*** 6272,6277 ****
--- 6287,6295 ----
                missing in the JSON standard, but several implementations do
                allow it.  If not then you will get an error.
  
+               Can also be used as a |method|: >
+                       GetObject()->json_encode()
+ 
  keys({dict})                                          *keys()*
                Return a |List| with all the keys of {dict}.  The |List| is in
                arbitrary order.  Also see |items()| and |values()|.
***************
*** 6338,6343 ****
--- 6356,6365 ----
                feature is present}
                Examples: >
                        :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({libname}, {funcname}, {argument})
***************
*** 6350,6355 ****
--- 6372,6381 ----
                        :call libcallnr("libc.so", "printf", "Hello World!\n")
                        :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({expr})  The result is a Number, which is the line number of the file
                position given with {expr}.  The accepted positions are:
***************
*** 6377,6382 ****
--- 6403,6411 ----
                To jump to the last known position when opening a file see
                |last-position-jump|.
  
+               Can also be used as a |method|: >
+                       GetValue()->line()
+ 
  line2byte({lnum})                                     *line2byte()*
                Return the byte count from the start of the buffer for line
                {lnum}.  This includes the end-of-line character, depending on
***************
*** 6391,6396 ****
--- 6420,6428 ----
                disabled at compile time, -1 is returned.
                Also see |byte2line()|, |go| and |:goto|.
  
+               Can also be used as a |method|: >
+                       GetLnum()->line2byte()
+ 
  lispindent({lnum})                                    *lispindent()*
                Get the amount of indent for line {lnum} according the lisp
                indenting rules, as with 'lisp'.
***************
*** 6399,6404 ****
--- 6431,6439 ----
                When {lnum} is invalid or Vim was not compiled the
                |+lispindent| feature, -1 is returned.
  
+               Can also be used as a |method|: >
+                       GetLnum()->lispindent()
+ 
  list2str({list} [, {utf8}])                           *list2str()*
                Convert each number in {list} to a character string can
                concatenate them all.  Examples: >
***************
*** 6413,6418 ****
--- 6448,6456 ----
                With utf-8 composing characters work as expected: >
                        list2str([97, 769])     returns "á"
  <
+               Can also be used as a |method|: >
+                       GetList()->list2str()
+ 
  listener_add({callback} [, {buf}])                    *listener_add()*
                Add a callback function that will be invoked when changes have
                been made to buffer {buf}.
***************
*** 6482,6487 ****
--- 6520,6529 ----
                The {callback} is also not invoked when the buffer is
                unloaded, use the |BufUnload| autocmd event for that.
  
+               Can also be used as a |method|, where the base is passed as
+               the second argument, the buffer: >
+                       GetBuffer()->listener_add(callback)
+ 
  listener_flush([{buf}])                                       
*listener_flush()*
                Invoke listener callbacks for buffer {buf}.  If there are no
                pending changes then no callbacks are invoked.
***************
*** 6490,6500 ****
--- 6532,6548 ----
                values, see |bufname()|.  When {buf} is omitted the current
                buffer is used.
  
+               Can also be used as a |method|: >
+                       GetBuffer()->listener_flush()
+ 
  listener_remove({id})                                 *listener_remove()*
                Remove a listener previously added with listener_add().
                Returns zero when {id} could not be found, one when {id} was
                removed.
  
+               Can also be used as a |method|: >
+                       GetListenerId()->listener_remove()
+ 
  localtime()                                           *localtime()*
                Return the current time, measured as seconds since 1st Jan
                1970.  See also |strftime()| and |getftime()|.
***************
*** 6542,6548 ****
                as-is.
                Other objects are returned as zero without any errors.
                See |lua-luaeval| for more details.
!               {only available when compiled with the |+lua| feature}
  
  map({expr1}, {expr2})                                 *map()*
                {expr1} must be a |List| or a |Dictionary|.
--- 6590,6600 ----
                as-is.
                Other objects are returned as zero without any errors.
                See |lua-luaeval| for more details.
! 
!               Can also be used as a |method|: >
!                       GetExpr()->luaeval()
! 
! <             {only available when compiled with the |+lua| feature}
  
  map({expr1}, {expr2})                                 *map()*
                {expr1} must be a |List| or a |Dictionary|.
*** ../vim-8.1.1953/src/evalfunc.c      2019-08-31 21:17:35.594131454 +0200
--- src/evalfunc.c      2019-08-31 22:13:46.119114253 +0200
***************
*** 635,663 ****
      {"job_stop",      1, 2, FEARG_1,    f_job_stop},
  #endif
      {"join",          1, 2, FEARG_1,    f_join},
!     {"js_decode",     1, 1, 0,          f_js_decode},
!     {"js_encode",     1, 1, 0,          f_js_encode},
!     {"json_decode",   1, 1, 0,          f_json_decode},
!     {"json_encode",   1, 1, 0,          f_json_encode},
      {"keys",          1, 1, FEARG_1,    f_keys},
      {"last_buffer_nr",        0, 0, 0,          f_last_buffer_nr}, // obsolete
      {"len",           1, 1, FEARG_1,    f_len},
!     {"libcall",               3, 3, 0,          f_libcall},
!     {"libcallnr",     3, 3, 0,          f_libcallnr},
!     {"line",          1, 1, 0,          f_line},
!     {"line2byte",     1, 1, 0,          f_line2byte},
!     {"lispindent",    1, 1, 0,          f_lispindent},
!     {"list2str",      1, 2, 0,          f_list2str},
!     {"listener_add",  1, 2, 0,          f_listener_add},
!     {"listener_flush",        0, 1, 0,          f_listener_flush},
!     {"listener_remove",       1, 1, 0,          f_listener_remove},
      {"localtime",     0, 0, 0,          f_localtime},
  #ifdef FEAT_FLOAT
      {"log",           1, 1, FEARG_1,    f_log},
      {"log10",         1, 1, FEARG_1,    f_log10},
  #endif
  #ifdef FEAT_LUA
!     {"luaeval",               1, 2, 0,          f_luaeval},
  #endif
      {"map",           2, 2, FEARG_1,    f_map},
      {"maparg",                1, 4, 0,          f_maparg},
--- 635,663 ----
      {"job_stop",      1, 2, FEARG_1,    f_job_stop},
  #endif
      {"join",          1, 2, FEARG_1,    f_join},
!     {"js_decode",     1, 1, FEARG_1,    f_js_decode},
!     {"js_encode",     1, 1, FEARG_1,    f_js_encode},
!     {"json_decode",   1, 1, FEARG_1,    f_json_decode},
!     {"json_encode",   1, 1, FEARG_1,    f_json_encode},
      {"keys",          1, 1, FEARG_1,    f_keys},
      {"last_buffer_nr",        0, 0, 0,          f_last_buffer_nr}, // obsolete
      {"len",           1, 1, FEARG_1,    f_len},
!     {"libcall",               3, 3, FEARG_3,    f_libcall},
!     {"libcallnr",     3, 3, FEARG_3,    f_libcallnr},
!     {"line",          1, 1, FEARG_1,    f_line},
!     {"line2byte",     1, 1, FEARG_1,    f_line2byte},
!     {"lispindent",    1, 1, FEARG_1,    f_lispindent},
!     {"list2str",      1, 2, FEARG_1,    f_list2str},
!     {"listener_add",  1, 2, FEARG_2,    f_listener_add},
!     {"listener_flush",        0, 1, FEARG_1,    f_listener_flush},
!     {"listener_remove",       1, 1, FEARG_1,    f_listener_remove},
      {"localtime",     0, 0, 0,          f_localtime},
  #ifdef FEAT_FLOAT
      {"log",           1, 1, FEARG_1,    f_log},
      {"log10",         1, 1, FEARG_1,    f_log10},
  #endif
  #ifdef FEAT_LUA
!     {"luaeval",               1, 2, FEARG_1,    f_luaeval},
  #endif
      {"map",           2, 2, FEARG_1,    f_map},
      {"maparg",                1, 4, 0,          f_maparg},
*** ../vim-8.1.1953/src/testdir/test_arglist.vim        2019-08-24 
22:14:52.826215824 +0200
--- src/testdir/test_arglist.vim        2019-08-31 21:47:34.013172169 +0200
***************
*** 88,94 ****
    argadd Xargadd
    call assert_equal(curbuf, bufnr('%'))
    call assert_equal('', bufname('%'))
!   call assert_equal(1, line('$'))
    rew
    call assert_notequal(curbuf, '%'->bufnr())
    call assert_equal('Xargadd', '%'->bufname())
--- 88,94 ----
    argadd Xargadd
    call assert_equal(curbuf, bufnr('%'))
    call assert_equal('', bufname('%'))
!   call assert_equal(1, '$'->line())
    rew
    call assert_notequal(curbuf, '%'->bufnr())
    call assert_equal('Xargadd', '%'->bufname())
*** ../vim-8.1.1953/src/testdir/test_functions.vim      2019-08-31 
21:17:35.594131454 +0200
--- src/testdir/test_functions.vim      2019-08-31 21:48:47.392759812 +0200
***************
*** 883,889 ****
    call assert_equal([-1, -1, 1, 1, 2, 2, 2, 3, 3, -1],
    \                 map(range(-1, 8), 'v:val->byte2line()'))
    call assert_equal([-1, -1, 1, 3, 6, 8, -1],
!   \                 map(range(-1, 5), 'line2byte(v:val)'))
  
    set fileformat=dos
    call assert_equal([-1, -1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, -1],
--- 883,889 ----
    call assert_equal([-1, -1, 1, 1, 2, 2, 2, 3, 3, -1],
    \                 map(range(-1, 8), 'v:val->byte2line()'))
    call assert_equal([-1, -1, 1, 3, 6, 8, -1],
!   \                 map(range(-1, 5), 'v:val->line2byte()'))
  
    set fileformat=dos
    call assert_equal([-1, -1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, -1],
***************
*** 1351,1367 ****
    endif
  
    if has('win32')
!     call assert_equal($USERPROFILE, libcall(libc, 'getenv', 'USERPROFILE'))
    else
!     call assert_equal($HOME, libcall(libc, 'getenv', 'HOME'))
    endif
  
    " If function returns NULL, libcall() should return an empty string.
    call assert_equal('', libcall(libc, 'getenv', 'X_ENV_DOES_NOT_EXIT'))
  
    " Test libcallnr() with string and integer argument.
!   call assert_equal(4, libcallnr(libc, 'strlen', 'abcd'))
!   call assert_equal(char2nr('A'), libcallnr(libc, 'toupper', char2nr('a')))
  
    call assert_fails("call libcall(libc, 'Xdoesnotexist_', '')", 'E364:')
    call assert_fails("call libcallnr(libc, 'Xdoesnotexist_', '')", 'E364:')
--- 1351,1367 ----
    endif
  
    if has('win32')
!     call assert_equal($USERPROFILE, 'USERPROFILE'->libcall(libc, 'getenv'))
    else
!     call assert_equal($HOME, 'HOME'->libcall(libc, 'getenv'))
    endif
  
    " If function returns NULL, libcall() should return an empty string.
    call assert_equal('', libcall(libc, 'getenv', 'X_ENV_DOES_NOT_EXIT'))
  
    " Test libcallnr() with string and integer argument.
!   call assert_equal(4, 'abcd'->libcallnr(libc, 'strlen'))
!   call assert_equal(char2nr('A'), char2nr('a')->libcallnr(libc, 'toupper'))
  
    call assert_fails("call libcall(libc, 'Xdoesnotexist_', '')", 'E364:')
    call assert_fails("call libcallnr(libc, 'Xdoesnotexist_', '')", 'E364:')
*** ../vim-8.1.1953/src/testdir/test_json.vim   2019-05-19 19:59:30.164255569 
+0200
--- src/testdir/test_json.vim   2019-08-31 21:38:17.296263416 +0200
***************
*** 70,76 ****
  func Test_json_encode()
    call assert_equal(s:json1, json_encode(s:var1))
    call assert_equal(s:json2, json_encode(s:var2))
!   call assert_equal(s:json3, json_encode(s:var3))
    call assert_equal(s:json4, json_encode(s:var4))
    call assert_equal(s:json5, json_encode(s:var5))
  
--- 70,76 ----
  func Test_json_encode()
    call assert_equal(s:json1, json_encode(s:var1))
    call assert_equal(s:json2, json_encode(s:var2))
!   call assert_equal(s:json3, s:var3->json_encode())
    call assert_equal(s:json4, json_encode(s:var4))
    call assert_equal(s:json5, json_encode(s:var5))
  
***************
*** 110,116 ****
  func Test_json_decode()
    call assert_equal(s:var1, json_decode(s:json1))
    call assert_equal(s:var2, json_decode(s:json2))
!   call assert_equal(s:var3, json_decode(s:json3))
    call assert_equal(s:var4, json_decode(s:json4))
    call assert_equal(s:var5, json_decode(s:json5))
  
--- 110,116 ----
  func Test_json_decode()
    call assert_equal(s:var1, json_decode(s:json1))
    call assert_equal(s:var2, json_decode(s:json2))
!   call assert_equal(s:var3, s:json3->json_decode())
    call assert_equal(s:var4, json_decode(s:json4))
    call assert_equal(s:var5, json_decode(s:json5))
  
***************
*** 188,194 ****
  func Test_js_encode()
    call assert_equal(s:json1, js_encode(s:var1))
    call assert_equal(s:json2, js_encode(s:var2))
!   call assert_equal(s:json3, js_encode(s:var3))
    call assert_equal(s:json4, js_encode(s:var4))
    call assert_equal(s:json5, js_encode(s:var5))
  
--- 188,194 ----
  func Test_js_encode()
    call assert_equal(s:json1, js_encode(s:var1))
    call assert_equal(s:json2, js_encode(s:var2))
!   call assert_equal(s:json3, s:var3->js_encode())
    call assert_equal(s:json4, js_encode(s:var4))
    call assert_equal(s:json5, js_encode(s:var5))
  
***************
*** 226,232 ****
  func Test_js_decode()
    call assert_equal(s:var1, js_decode(s:json1))
    call assert_equal(s:var2, js_decode(s:json2))
!   call assert_equal(s:var3, js_decode(s:json3))
    call assert_equal(s:var4, js_decode(s:json4))
    call assert_equal(s:var5, js_decode(s:json5))
  
--- 226,232 ----
  func Test_js_decode()
    call assert_equal(s:var1, js_decode(s:json1))
    call assert_equal(s:var2, js_decode(s:json2))
!   call assert_equal(s:var3, s:json3->js_decode())
    call assert_equal(s:var4, js_decode(s:json4))
    call assert_equal(s:var5, js_decode(s:json5))
  
*** ../vim-8.1.1953/src/testdir/test_lispwords.vim      2017-10-26 
21:33:30.000000000 +0200
--- src/testdir/test_lispwords.vim      2019-08-31 22:04:56.138343250 +0200
***************
*** 43,48 ****
--- 43,51 ----
              \ ',@body',
              \ '(princ "</a>")))'
              \ ])
+   call assert_equal(7, lispindent(2))
+   call assert_equal(5, 6->lispindent())
+ 
    set lisp
    set lispwords&
    let save_copt = &cpoptions
*** ../vim-8.1.1953/src/testdir/test_listener.vim       2019-07-13 
20:14:39.626623070 +0200
--- src/testdir/test_listener.vim       2019-08-31 22:12:39.391515873 +0200
***************
*** 59,68 ****
    " a change above a previous change without a line number change is reported
    " together
    call setline(1, ['one one', 'two'])
!   call listener_flush()
    call append(2, 'two two')
    call setline(1, 'something')
!   call listener_flush()
    call assert_equal([{'lnum': 3, 'end': 3, 'col': 1, 'added': 1},
        \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], s:list)
  
--- 59,68 ----
    " a change above a previous change without a line number change is reported
    " together
    call setline(1, ['one one', 'two'])
!   call listener_flush(bufnr())
    call append(2, 'two two')
    call setline(1, 'something')
!   call bufnr()->listener_flush()
    call assert_equal([{'lnum': 3, 'end': 3, 'col': 1, 'added': 1},
        \ {'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], s:list)
  
***************
*** 134,140 ****
    redraw
    call assert_equal([{'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], s:list3)
  
!   call listener_remove(id)
    bwipe!
  endfunc
  
--- 134,140 ----
    redraw
    call assert_equal([{'lnum': 1, 'end': 2, 'col': 1, 'added': 0}], s:list3)
  
!   eval id->listener_remove()
    bwipe!
  endfunc
  
***************
*** 214,220 ****
    call setline(1, ['one', 'two'])
    let bufnr = bufnr('')
    normal ww
!   let id = listener_add(function('s:StoreBufList'), bufnr)
    let s:list = []
    call setbufline(bufnr, 1, 'hello')
    redraw
--- 214,220 ----
    call setline(1, ['one', 'two'])
    let bufnr = bufnr('')
    normal ww
!   let id = bufnr->listener_add(function('s:StoreBufList'))
    let s:list = []
    call setbufline(bufnr, 1, 'hello')
    redraw
*** ../vim-8.1.1953/src/testdir/test_lua.vim    2019-06-15 17:57:43.972724036 
+0200
--- src/testdir/test_lua.vim    2019-08-31 22:14:15.910935271 +0200
***************
*** 36,42 ****
  
    " lua.eval with a string
    lua v = vim.eval('"abc"')
!   call assert_equal('string', luaeval('vim.type(v)'))
    call assert_equal('abc', luaeval('v'))
  
    " lua.eval with a list
--- 36,42 ----
  
    " lua.eval with a string
    lua v = vim.eval('"abc"')
!   call assert_equal('string', 'vim.type(v)'->luaeval())
    call assert_equal('abc', luaeval('v'))
  
    " lua.eval with a list
*** ../vim-8.1.1953/src/testdir/test_utf8.vim   2019-04-06 13:18:06.737335067 
+0200
--- src/testdir/test_utf8.vim   2019-08-31 22:06:28.073774927 +0200
***************
*** 77,83 ****
    let s = "\u304b\u3099\u3044"
    let l = [0x304b, 0x3099, 0x3044]
    call assert_equal(l, str2list(s, 1))
!   call assert_equal(s, list2str(l, 1))
    if &enc ==# 'utf-8'
      call assert_equal(str2list(s), str2list(s, 1))
      call assert_equal(list2str(l), list2str(l, 1))
--- 77,83 ----
    let s = "\u304b\u3099\u3044"
    let l = [0x304b, 0x3099, 0x3044]
    call assert_equal(l, str2list(s, 1))
!   call assert_equal(s, l->list2str(1))
    if &enc ==# 'utf-8'
      call assert_equal(str2list(s), str2list(s, 1))
      call assert_equal(list2str(l), list2str(l, 1))
*** ../vim-8.1.1953/src/version.c       2019-08-31 21:17:35.594131454 +0200
--- src/version.c       2019-08-31 22:15:09.378614441 +0200
***************
*** 763,764 ****
--- 763,766 ----
  {   /* Add new patch number below this line */
+ /**/
+     1954,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
154. You fondle your mouse.

 /// Bram Moolenaar -- b...@moolenaar.net -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/201908312017.x7VKHBGD012059%40masaka.moolenaar.net.

Raspunde prin e-mail lui