forked from aniani/vim
Problem: Skipping over an expression when not evaluating it does not work
properly for dict members.
Solution: Skip over unrecognized expression. (ZyX)
88 lines
1.8 KiB
Plaintext
88 lines
1.8 KiB
Plaintext
Test for user functions.
|
||
Also test an <expr> mapping calling a function.
|
||
Also test that a builtin function cannot be replaced.
|
||
Also test for regression when calling arbitrary expression.
|
||
|
||
STARTTEST
|
||
:so small.vim
|
||
:function Table(title, ...)
|
||
: let ret = a:title
|
||
: let idx = 1
|
||
: while idx <= a:0
|
||
: exe "let ret = ret . a:" . idx
|
||
: let idx = idx + 1
|
||
: endwhile
|
||
: return ret
|
||
:endfunction
|
||
:function Compute(n1, n2, divname)
|
||
: if a:n2 == 0
|
||
: return "fail"
|
||
: endif
|
||
: exe "let g:" . a:divname . " = ". a:n1 / a:n2
|
||
: return "ok"
|
||
:endfunction
|
||
:func Expr1()
|
||
: normal! v
|
||
: return "111"
|
||
:endfunc
|
||
:func Expr2()
|
||
: call search('XX', 'b')
|
||
: return "222"
|
||
:endfunc
|
||
:func ListItem()
|
||
: let g:counter += 1
|
||
: return g:counter . '. '
|
||
:endfunc
|
||
:func ListReset()
|
||
: let g:counter = 0
|
||
: return ''
|
||
:endfunc
|
||
:func FuncWithRef(a)
|
||
: unlet g:FuncRef
|
||
: return a:a
|
||
:endfunc
|
||
:let g:FuncRef=function("FuncWithRef")
|
||
:let counter = 0
|
||
:inoremap <expr> ( ListItem()
|
||
:inoremap <expr> [ ListReset()
|
||
:imap <expr> + Expr1()
|
||
:imap <expr> * Expr2()
|
||
:let retval = "nop"
|
||
/^here
|
||
C=Table("xxx", 4, "asdf")
|
||
=Compute(45, 0, "retval")
|
||
=retval
|
||
=Compute(45, 5, "retval")
|
||
=retval
|
||
=g:FuncRef(333)
|
||
|
||
XX+-XX
|
||
---*---
|
||
(one
|
||
(two
|
||
[(one again:call append(line('$'), max([1, 2, 3]))
|
||
:call extend(g:, {'max': function('min')})
|
||
:call append(line('$'), max([1, 2, 3]))
|
||
:try
|
||
: " Regression: the first line below used to throw ?E110: Missing ')'?
|
||
: " Second is here just to prove that this line is correct when not skipping
|
||
: " rhs of &&.
|
||
: $put =(0&&(function('tr'))(1, 2, 3))
|
||
: $put =(1&&(function('tr'))(1, 2, 3))
|
||
:catch
|
||
: $put ='!!! Unexpected exception:'
|
||
: $put =v:exception
|
||
:endtry
|
||
:$-9,$w! test.out
|
||
:delfunc Table
|
||
:delfunc Compute
|
||
:delfunc Expr1
|
||
:delfunc Expr2
|
||
:delfunc ListItem
|
||
:delfunc ListReset
|
||
:unlet retval counter
|
||
:q!
|
||
ENDTEST
|
||
|
||
here
|