Skip to content

Commit 4d291dc

Browse files
committed
vital: detect function attrs
1 parent 07cbe5f commit 4d291dc

File tree

2 files changed

+33
-22
lines changed

2 files changed

+33
-22
lines changed

autoload/vital/vital.vim

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -170,29 +170,40 @@ function! s:_format_throwpoint(throwpoint) abort
170170
let stack = matchstr(a:throwpoint, '^function \zs.*, .\{-} \d\+$')
171171
for line in split(stack, '\.\.')
172172
let m = matchlist(line, '^\(.\+\)\%(\[\(\d\+\)\]\|, .\{-} \(\d\+\)\)$')
173-
if empty(m)
174-
call add(funcs, line)
175-
continue
176-
endif
177-
let [name, lnum, lnum2] = m[1:3]
178-
if empty(lnum)
179-
let lnum = lnum2
173+
if !empty(m)
174+
let [name, lnum, lnum2] = m[1:3]
175+
if empty(lnum)
176+
let lnum = lnum2
177+
endif
178+
let info = s:_get_func_info(name)
179+
if !empty(info)
180+
call add(funcs, printf('function %s(...) %s Line:%d (%s)',
181+
\ info.funcname, join(info.attrs, ' '), lnum, info.filename))
182+
continue
183+
endif
180184
endif
181-
let attr = ''
182-
let file = s:_get_file_by_func_name(name)
183-
call add(funcs, printf('function %s(...)%s Line:%d (%s)', name, attr, lnum, file))
185+
" fallback when function information cannot be detected
186+
call add(funcs, line)
184187
endfor
185188
return join(funcs, "\n")
186189
endfunction
187190

188-
function! s:_get_file_by_func_name(name) abort
191+
function! s:_get_func_info(name) abort
189192
" If name is digits, it is anonymous-function
190193
let name = (a:name =~# '^\d\+$') ? printf('{%s}', a:name) : a:name
194+
if !exists('*' . name)
195+
return {}
196+
endif
191197
let body = execute(printf('verbose function %s', name))
192198
let lines = split(body, "\n")
193199
let signature = matchstr(lines[0], '^\s*\zs.*')
194200
let file = matchstr(lines[1], '^\t\%(Last set from\|.\{-}:\)\s*\zs.*$')
195-
return substitute(file, '[/\\]\+', '/', 'g')
201+
return {
202+
\ 'filename': substitute(file, '[/\\]\+', '/', 'g'),
203+
\ 'funcname': a:name,
204+
\ 'arguments': split(matchstr(signature, '(\zs.*\ze)'), '\s*,\s*'),
205+
\ 'attrs': filter(['dict', 'abort', 'range', 'closure'], 'signature =~# (").*" . v:val)'),
206+
\ }
196207
endfunction
197208

198209
" s:_get_module() returns module object wihch has all script local functions.

test/vital.vimspec

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -221,11 +221,11 @@ Describe vital
221221
End
222222

223223
It can handle error stack in s:_vital_loaded(V)
224-
Throws /^vital: fail to call \._vital_loaded(): FOO from:\_.*\n
225-
\function \S*_vital_loaded(\.\.\.) Line:1 (.*\/ErrorSelfmodule\.vim .* 1)\n
226-
\function \d\+(\.\.\.) Line:1 (.*\/ErrorSelfmodule\.vim .* 6)\n
227-
\function \S*_throwFOO(\.\.\.) Line:1 (.*\/ErrorSelfmodule\.vim .* 10)/
228-
\ :call V.import('ErrorSelfmodule')
224+
let errorpat = '/^vital: fail to call \._vital_loaded(): FOO from:\_.*\n'
225+
\ . 'function \S*_vital_loaded(\.\.\.) abort Line:1 (.*\/ErrorSelfmodule\.vim.*)\n'
226+
\ . 'function \d\+(\.\.\.) dict abort Line:1 (.*\/ErrorSelfmodule\.vim.*)\n'
227+
\ . 'function \S*_throwFOO(\.\.\.) abort Line:1 (.*\/ErrorSelfmodule\.vim.*)$/'
228+
execute 'Throws' errorpat ':call V.import("ErrorSelfmodule")'
229229
End
230230

231231
It supports s:_vital_created(V)
@@ -307,11 +307,11 @@ Describe vital
307307

308308
It can handle error stack in s:_vital_loaded(V)
309309
let V = vital#{g:testplugin_name}#new()
310-
Throws /^vital: fail to call \._vital_loaded(): FOO from:\_.*\n
311-
\function \S*_vital_loaded(\.\.\.) Line:1 (.*\/ErrorSelfmodule\.vim .* 1)\n
312-
\function \d\+(\.\.\.) Line:1 (.*\/ErrorSelfmodule\.vim .* 6)\n
313-
\function \S*_throwFOO(\.\.\.) Line:1 (.*\/ErrorSelfmodule\.vim .* 10)/
314-
\ :call V.load('ErrorSelfmodule')
310+
let errorpat = '/^vital: fail to call \._vital_loaded(): FOO from:\_.*\n'
311+
\ . 'function \S*_vital_loaded(\.\.\.) abort Line:1 (.*\/ErrorSelfmodule\.vim.*)\n'
312+
\ . 'function \d\+(\.\.\.) dict abort Line:1 (.*\/ErrorSelfmodule\.vim.*)\n'
313+
\ . 'function \S*_throwFOO(\.\.\.) abort Line:1 (.*\/ErrorSelfmodule\.vim.*)$/'
314+
execute 'Throws' errorpat ':call V.load("ErrorSelfmodule")'
315315
End
316316

317317
It supports s:_vital_created(V)

0 commit comments

Comments
 (0)