mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 03:18:16 +00:00
Merge pull request #20823 from zeertzjq/vim-8.2.2100
vim-patch:8.2.{2100,2726,2727}
This commit is contained in:
@@ -48,6 +48,8 @@ static char *e_funcexts = N_("E122: Function %s already exists, add ! to replace
|
|||||||
static char *e_funcdict = N_("E717: Dictionary entry already exists");
|
static char *e_funcdict = N_("E717: Dictionary entry already exists");
|
||||||
static char *e_funcref = N_("E718: Funcref required");
|
static char *e_funcref = N_("E718: Funcref required");
|
||||||
static char *e_nofunc = N_("E130: Unknown function: %s");
|
static char *e_nofunc = N_("E130: Unknown function: %s");
|
||||||
|
static char e_no_white_space_allowed_before_str_str[]
|
||||||
|
= N_("E1068: No white space allowed before '%s': %s");
|
||||||
|
|
||||||
void func_init(void)
|
void func_init(void)
|
||||||
{
|
{
|
||||||
@@ -149,6 +151,15 @@ static int get_function_args(char **argp, char_u endchar, garray_T *newargs, int
|
|||||||
emsg(_("E989: Non-default argument follows default argument"));
|
emsg(_("E989: Non-default argument follows default argument"));
|
||||||
mustend = true;
|
mustend = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ascii_iswhite(*p) && *skipwhite(p) == ',') {
|
||||||
|
// Be tolerant when skipping
|
||||||
|
if (!skip) {
|
||||||
|
semsg(_(e_no_white_space_allowed_before_str_str), ",", p);
|
||||||
|
goto err_ret;
|
||||||
|
}
|
||||||
|
p = skipwhite(p);
|
||||||
|
}
|
||||||
if (*p == ',') {
|
if (*p == ',') {
|
||||||
p++;
|
p++;
|
||||||
} else {
|
} else {
|
||||||
|
@@ -1865,6 +1865,7 @@ func Test_call()
|
|||||||
let mydict = {'data': [0, 1, 2, 3], 'len': function("Mylen")}
|
let mydict = {'data': [0, 1, 2, 3], 'len': function("Mylen")}
|
||||||
eval mydict.len->call([], mydict)->assert_equal(4)
|
eval mydict.len->call([], mydict)->assert_equal(4)
|
||||||
call assert_fails("call call('Mylen', [], 0)", 'E715:')
|
call assert_fails("call call('Mylen', [], 0)", 'E715:')
|
||||||
|
call assert_fails('call foo', 'E107:')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_char2nr()
|
func Test_char2nr()
|
||||||
|
@@ -126,7 +126,7 @@ func Test_lambda_closure_counter()
|
|||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
let l:F = s:foo()
|
let l:F = s:foo()
|
||||||
call garbagecollect()
|
call test_garbagecollect_now()
|
||||||
call assert_equal(1, l:F())
|
call assert_equal(1, l:F())
|
||||||
call assert_equal(2, l:F())
|
call assert_equal(2, l:F())
|
||||||
call assert_equal(3, l:F())
|
call assert_equal(3, l:F())
|
||||||
@@ -209,9 +209,9 @@ func Test_lambda_circular_reference()
|
|||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
call s:Foo()
|
call s:Foo()
|
||||||
call garbagecollect()
|
call test_garbagecollect_now()
|
||||||
let i = 0 | while i < 10000 | call s:Foo() | let i+= 1 | endwhile
|
let i = 0 | while i < 10000 | call s:Foo() | let i+= 1 | endwhile
|
||||||
call garbagecollect()
|
call test_garbagecollect_now()
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_lambda_combination()
|
func Test_lambda_combination()
|
||||||
@@ -240,11 +240,16 @@ func Test_closure_counter()
|
|||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
let l:F = s:foo()
|
let l:F = s:foo()
|
||||||
call garbagecollect()
|
call test_garbagecollect_now()
|
||||||
call assert_equal(1, l:F())
|
call assert_equal(1, l:F())
|
||||||
call assert_equal(2, l:F())
|
call assert_equal(2, l:F())
|
||||||
call assert_equal(3, l:F())
|
call assert_equal(3, l:F())
|
||||||
call assert_equal(4, l:F())
|
call assert_equal(4, l:F())
|
||||||
|
|
||||||
|
call assert_match("^\n function <SNR>\\d\\+_bar() closure"
|
||||||
|
\ .. "\n1 let x += 1"
|
||||||
|
\ .. "\n2 return x"
|
||||||
|
\ .. "\n endfunction$", execute('func s:bar'))
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_closure_unlet()
|
func Test_closure_unlet()
|
||||||
@@ -258,7 +263,7 @@ func Test_closure_unlet()
|
|||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
call assert_false(has_key(s:foo(), 'x'))
|
call assert_false(has_key(s:foo(), 'x'))
|
||||||
call garbagecollect()
|
call test_garbagecollect_now()
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func LambdaFoo()
|
func LambdaFoo()
|
||||||
@@ -295,7 +300,7 @@ func Test_named_function_closure()
|
|||||||
endfunc
|
endfunc
|
||||||
call Afoo()
|
call Afoo()
|
||||||
call assert_equal(14, s:Abar())
|
call assert_equal(14, s:Abar())
|
||||||
call garbagecollect()
|
call test_garbagecollect_now()
|
||||||
call assert_equal(14, s:Abar())
|
call assert_equal(14, s:Abar())
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
@@ -129,8 +129,7 @@ func Test_deadly_signal_TERM()
|
|||||||
call assert_equal(['foo'], getline(1, '$'))
|
call assert_equal(['foo'], getline(1, '$'))
|
||||||
|
|
||||||
let result = readfile('XautoOut')
|
let result = readfile('XautoOut')
|
||||||
call assert_match('VimLeavePre triggered', result[0])
|
call assert_equal(["VimLeavePre triggered", "VimLeave triggered"], result)
|
||||||
call assert_match('VimLeave triggered', result[1])
|
|
||||||
|
|
||||||
%bwipe!
|
%bwipe!
|
||||||
call delete('.Xsig_TERM.swp')
|
call delete('.Xsig_TERM.swp')
|
||||||
|
@@ -149,8 +149,8 @@ func Test_default_arg()
|
|||||||
call assert_equal(res.optional, 2)
|
call assert_equal(res.optional, 2)
|
||||||
call assert_equal(res['0'], 1)
|
call assert_equal(res['0'], 1)
|
||||||
|
|
||||||
call assert_fails("call MakeBadFunc()", 'E989')
|
call assert_fails("call MakeBadFunc()", 'E989:')
|
||||||
call assert_fails("fu F(a=1 ,) | endf", 'E475')
|
call assert_fails("fu F(a=1 ,) | endf", 'E1068:')
|
||||||
|
|
||||||
" Since neovim does not have v:none, the ability to use the default
|
" Since neovim does not have v:none, the ability to use the default
|
||||||
" argument with the intermediate argument set to v:none has been omitted.
|
" argument with the intermediate argument set to v:none has been omitted.
|
||||||
@@ -445,4 +445,36 @@ func Test_func_arg_error()
|
|||||||
delfunc Xfunc
|
delfunc Xfunc
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_func_dict()
|
||||||
|
let mydict = {'a': 'b'}
|
||||||
|
function mydict.somefunc() dict
|
||||||
|
return len(self)
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
call assert_equal("{'a': 'b', 'somefunc': function('2')}", string(mydict))
|
||||||
|
call assert_equal(2, mydict.somefunc())
|
||||||
|
call assert_match("^\n function \\d\\\+() dict"
|
||||||
|
\ .. "\n1 return len(self)"
|
||||||
|
\ .. "\n endfunction$", execute('func mydict.somefunc'))
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func Test_func_range()
|
||||||
|
new
|
||||||
|
call setline(1, range(1, 8))
|
||||||
|
func FuncRange() range
|
||||||
|
echo a:firstline
|
||||||
|
echo a:lastline
|
||||||
|
endfunc
|
||||||
|
3
|
||||||
|
call assert_equal("\n3\n3", execute('call FuncRange()'))
|
||||||
|
call assert_equal("\n4\n6", execute('4,6 call FuncRange()'))
|
||||||
|
call assert_equal("\n function FuncRange() range"
|
||||||
|
\ .. "\n1 echo a:firstline"
|
||||||
|
\ .. "\n2 echo a:lastline"
|
||||||
|
\ .. "\n endfunction",
|
||||||
|
\ execute('function FuncRange'))
|
||||||
|
|
||||||
|
bwipe!
|
||||||
|
endfunc
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
Reference in New Issue
Block a user