Add a function for computing the number of arguments for a function

This commit is contained in:
w0rp 2017-06-06 22:27:20 +01:00
parent eeea72e167
commit e4d886d4a7
2 changed files with 56 additions and 0 deletions

View File

@ -123,3 +123,18 @@ function! ale#util#GetMatches(lines, patterns) abort
return l:matches return l:matches
endfunction endfunction
" Given the name of a function, a Funcref, or a lambda, return the number
" of named arguments for a function.
function! ale#util#FunctionArgCount(function) abort
let l:Function = ale#util#GetFunction(a:function)
redir => l:output
silent function Function
redir END
let l:match = matchstr(split(l:output, "\n")[0], '\v\([^)]+\)')[1:-2]
let l:arg_list = filter(split(l:match, ', '), 'v:val !=# ''...''')
return len(l:arg_list)
endfunction

View File

@ -0,0 +1,41 @@
Before:
function! Func0()
endfunction
function! Func1(x)
endfunction
function! Func2(x,y)
endfunction
function! Func3(x,y,z)
endfunction
function! Func3a(x,y,z,...)
endfunction
After:
delfunction Func0
delfunction Func1
delfunction Func2
delfunction Func3
delfunction Func3a
Execute(We should be able to compute the argument count for function names):
AssertEqual 0, ale#util#FunctionArgCount('Func0')
AssertEqual 1, ale#util#FunctionArgCount('Func1')
AssertEqual 2, ale#util#FunctionArgCount('Func2')
AssertEqual 3, ale#util#FunctionArgCount('Func3')
AssertEqual 3, ale#util#FunctionArgCount('Func3a')
Execute(We should be able to compute the argument count for Funcrefs):
AssertEqual 0, ale#util#FunctionArgCount(function('Func0'))
AssertEqual 1, ale#util#FunctionArgCount(function('Func1'))
AssertEqual 2, ale#util#FunctionArgCount(function('Func2'))
AssertEqual 3, ale#util#FunctionArgCount(function('Func3'))
AssertEqual 3, ale#util#FunctionArgCount(function('Func3a'))
Execute(We should be able to compute the argument count for lambdas):
if has('lambda')
AssertEqual 0, ale#util#FunctionArgCount({->1})
AssertEqual 1, ale#util#FunctionArgCount({x->1})
AssertEqual 2, ale#util#FunctionArgCount({x,y->1})
AssertEqual 3, ale#util#FunctionArgCount({x,y,z->1})
AssertEqual 3, ale#util#FunctionArgCount({x,y,z,...->1})
endif