Skip to content

Commit 9fb5b34

Browse files
committed
Repaint project output/errors on UpdateState
1 parent a12b55a commit 9fb5b34

File tree

1 file changed

+75
-47
lines changed

1 file changed

+75
-47
lines changed

autoload/OmniSharp/testrunner.vim

Lines changed: 75 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,10 @@ endfunction
211211

212212

213213
let s:buffer = {}
214+
function! s:buffer.delimiter() abort
215+
return get(g:, 'OmniSharp_testrunner_banner_delimeter', '')
216+
endfunction
217+
214218
function! s:buffer.focus() abort
215219
if !has_key(s:runner, 'bufnr') | return | endif
216220
if getbufvar(s:runner.bufnr, '&ft') !=# 'omnisharptest' | return | endif
@@ -231,28 +235,7 @@ function! s:buffer.paint() abort
231235
let lines = []
232236
endif
233237
for key in sort(keys(s:tests))
234-
let [assembly, sln] = split(key, ';')
235-
if !s:tests[key].visible | continue | endif
236-
call add(lines, key . (len(s:tests[key].errors) ? ' ERROR' : ''))
237-
for errorline in s:tests[key].errors
238-
call add(lines, '< ' . trim(errorline, ' ', 2))
239-
endfor
240-
let loglevel = get(g:, 'OmniSharp_testrunner_loglevel', 'error')
241-
if loglevel ==? 'all' || (loglevel ==? 'error' && len(s:tests[key].errors))
242-
" The diagnostic logs (build output) are only displayed when a single file
243-
" is tested, otherwise multiple build outputs are intermingled
244-
if s:current.singlebuffer != -1
245-
let [ssln, sass, _] = s:utils.getProject(s:current.singlebuffer)
246-
if ssln ==# sln && sass ==# assembly
247-
if len(s:tests[key].errors) > 0 && len(s:current.log) > 1
248-
call add(lines, '< ' . repeat(delimiter, 10))
249-
endif
250-
for log in s:current.log
251-
call add(lines, '< ' . trim(log, ' ', 2))
252-
endfor
253-
endif
254-
endif
255-
endif
238+
call extend(lines, self.paintproject(key))
256239
for testfile in sort(keys(s:tests[key].files))
257240
if !s:tests[key].files[testfile].visible | continue | endif
258241
let tests = s:tests[key].files[testfile].tests
@@ -280,18 +263,61 @@ endfunction
280263

281264
function! s:buffer.paintbanner() abort
282265
let lines = []
283-
let delimiter = get(g:, 'OmniSharp_testrunner_banner_delimeter', '')
284-
call add(lines, '`' . repeat(delimiter, 80))
266+
call add(lines, '`' . repeat(self.delimiter(), 80))
285267
call add(lines, '` OmniSharp Test Runner')
286-
call add(lines, '` ' . repeat(delimiter, 76))
268+
call add(lines, '` ' . repeat(self.delimiter(), 76))
287269
call add(lines, '` <F1> Toggle this menu (:help omnisharp-test-runner for more)')
288270
call add(lines, '` <F5> Run test or tests in file under cursor')
289271
call add(lines, '` <F6> Debug test under cursor')
290272
call add(lines, '` <CR> Navigate to test or stack trace')
291-
call add(lines, '`' . repeat(delimiter, 80))
273+
call add(lines, '`' . repeat(self.delimiter(), 80))
274+
return lines
275+
endfunction
276+
277+
function! s:buffer.paintproject(key) abort
278+
let [assembly, sln] = split(a:key, ';')
279+
if !s:tests[a:key].visible
280+
return []
281+
endif
282+
let lines = []
283+
call add(lines, a:key . (len(s:tests[a:key].errors) ? ' ERROR' : ''))
284+
for errorline in s:tests[a:key].errors
285+
call add(lines, '< ' . trim(errorline, ' ', 2))
286+
endfor
287+
let loglevel = get(g:, 'OmniSharp_testrunner_loglevel', 'error')
288+
if loglevel ==? 'all' || (loglevel ==? 'error' && len(s:tests[a:key].errors))
289+
" The diagnostic logs (build output) are only displayed when a single file
290+
" is tested, otherwise multiple build outputs are intermingled
291+
if s:current.singlebuffer != -1
292+
let [ssln, sass, _] = s:utils.getProject(s:current.singlebuffer)
293+
if ssln ==# sln && sass ==# assembly
294+
if len(s:tests[a:key].errors) > 0 && len(s:current.log) > 1
295+
call add(lines, '< ' . repeat(self.delimiter(), 10))
296+
endif
297+
for log in s:current.log
298+
call add(lines, '< ' . trim(log, ' ', 2))
299+
endfor
300+
endif
301+
endif
302+
endif
292303
return lines
293304
endfunction
294305

306+
function! s:buffer.repaintproject(key) abort
307+
if !has_key(s:runner, 'bufnr') | return | endif
308+
let projectlines = s:buffer.paintproject(a:key)
309+
call setbufvar(s:runner.bufnr, '&modifiable', 1)
310+
let lines = getbufline(s:runner.bufnr, 1, '$')
311+
let pattern = '^' . substitute(a:key, '/', '\\/', 'g')
312+
let projectline = match(lines, pattern) + 1
313+
let pattern = '^ '
314+
let endline = match(lines, '^ ', projectline)
315+
call deletebufline(s:runner.bufnr, projectline, endline)
316+
call appendbufline(s:runner.bufnr, projectline - 1, projectlines)
317+
call setbufvar(s:runner.bufnr, '&modifiable', 0)
318+
call setbufvar(s:runner.bufnr, '&modified', 0)
319+
endfunction
320+
295321
function! s:buffer.painttest(test, lnum) abort
296322
if a:test.state ==# 'hidden'
297323
return []
@@ -332,6 +358,27 @@ function! s:buffer.painttest(test, lnum) abort
332358
return lines
333359
endfunction
334360

361+
function! s:buffer.repainttest(filename, testname, test) abort
362+
if !has_key(s:runner, 'bufnr') | return | endif
363+
call setbufvar(s:runner.bufnr, '&modifiable', 1)
364+
let lines = getbufline(s:runner.bufnr, 1, '$')
365+
let pattern = '^ ' . substitute(a:filename, '/', '\\/', 'g')
366+
let fileline = match(lines, pattern) + 1
367+
let pattern = '^[-|*!] \%(|| .\{-} || \)\?' . a:testname
368+
let testline = match(lines, pattern, fileline) + 1
369+
let endline = min(
370+
\ filter(
371+
\ map(
372+
\ ['^[-|*!] \S', '^__$', '^$'],
373+
\ {_,pattern -> match(lines, pattern, testline)}),
374+
\ {_,matchline -> matchline >= testline}))
375+
let testlines = s:buffer.painttest(a:test, testline)
376+
call deletebufline(s:runner.bufnr, testline, endline)
377+
call appendbufline(s:runner.bufnr, testline - 1, testlines)
378+
call setbufvar(s:runner.bufnr, '&modifiable', 0)
379+
call setbufvar(s:runner.bufnr, '&modified', 0)
380+
endfunction
381+
335382

336383
function! OmniSharp#testrunner#SetBreakpoints() abort
337384
if !OmniSharp#util#HasVimspector()
@@ -439,27 +486,8 @@ function! s:UpdateState(bufnr, state, ...) abort
439486
let test.message = get(opts, 'message', [])
440487
let test.stacktrace = stacktrace
441488
let test.output = get(opts, 'output', [])
442-
443-
if !has_key(s:runner, 'bufnr') | continue | endif
444-
call setbufvar(s:runner.bufnr, '&modifiable', 1)
445-
let lines = getbufline(s:runner.bufnr, 1, '$')
446-
let pattern = '^ ' . substitute(filename, '/', '\\/', 'g')
447-
let fileline = match(lines, pattern) + 1
448-
let pattern = '^[-|*!] \%(|| .\{-} || \)\?' . testname
449-
let testline = match(lines, pattern, fileline) + 1
450-
451-
let patterns = ['^[-|*!] \S', '^__$', '^$']
452-
let endline = min(
453-
\ filter(
454-
\ map(
455-
\ patterns,
456-
\ {_,pattern -> match(lines, pattern, testline)}),
457-
\ {_,matchline -> matchline >= testline}))
458-
let testlines = s:buffer.painttest(test, testline)
459-
call deletebufline(s:runner.bufnr, testline, endline)
460-
call appendbufline(s:runner.bufnr, testline - 1, testlines)
461-
call setbufvar(s:runner.bufnr, '&modifiable', 0)
462-
call setbufvar(s:runner.bufnr, '&modified', 0)
489+
call s:buffer.repaintproject(key)
490+
call s:buffer.repainttest(filename, testname, test)
463491
endif
464492
endfor
465493
if !get(g:, 'OmniSharp_testrunner', 1) | return | endif

0 commit comments

Comments
 (0)