diff options
Diffstat (limited to 'autoload/dart.vim')
-rw-r--r-- | autoload/dart.vim | 52 |
1 files changed, 33 insertions, 19 deletions
diff --git a/autoload/dart.vim b/autoload/dart.vim index f524e09d..82859463 100644 --- a/autoload/dart.vim +++ b/autoload/dart.vim @@ -9,22 +9,35 @@ function! s:error(text) abort echohl None endfunction -function! s:cexpr(errorformat, joined_lines) abort - let temp_errorfomat = &errorformat - try - let &errorformat = a:errorformat - cexpr a:joined_lines - copen - finally - let &errorformat = temp_errorfomat - endtry +function! s:cexpr(errorformat, lines, reason) abort + call setqflist([], ' ', { + \ 'lines': a:lines, + \ 'efm': a:errorformat, + \ 'context': {'reason': a:reason}, + \}) + copen +endfunction + +" If the quickfix list has a context matching [reason], clear and close it. +function! s:clearQfList(reason) abort + let context = get(getqflist({'context': 1}), 'context', {}) + if type(context) == v:t_dict && + \ has_key(context, 'reason') && + \ context.reason == a:reason + call setqflist([], 'r') + cclose + endif endfunction function! dart#fmt(q_args) abort if executable('dartfmt') let buffer_content = join(getline(1, '$'), "\n") - let joined_lines = system(printf('dartfmt %s', a:q_args), buffer_content) - if buffer_content ==# joined_lines[:-2] | return | endif + let args = '--stdin-name '.expand('%').' '.a:q_args + let joined_lines = system(printf('dartfmt %s', args), buffer_content) + if buffer_content ==# joined_lines[:-2] + call s:clearQfList('dartfmt') + return + endif if 0 == v:shell_error let win_view = winsaveview() let lines = split(joined_lines, "\n") @@ -33,12 +46,11 @@ function! dart#fmt(q_args) abort silent keepjumps execute string(len(lines)+1).',$ delete' endif call winrestview(win_view) + call s:clearQfList('dartfmt') else let errors = split(joined_lines, "\n")[2:] - let file_path = expand('%') - call map(errors, 'file_path.":".v:val') - let error_format = '%A%f:line %l\, column %c of stdin: %m,%C%.%#' - call s:cexpr(error_format, join(errors, "\n")) + let error_format = '%Aline %l\, column %c of %f: %m,%C%.%#' + call s:cexpr(error_format, errors, 'dartfmt') endif else call s:error('cannot execute binary file: dartfmt') @@ -49,8 +61,9 @@ function! dart#analyzer(q_args) abort if executable('dartanalyzer') let path = expand('%:p:gs:\:/:') if filereadable(path) - let joined_lines = system(printf('dartanalyzer %s %s', a:q_args, shellescape(path))) - call s:cexpr('%m (%f\, line %l\, col %c)', joined_lines) + let command = printf('dartanalyzer %s %s', a:q_args, shellescape(path)) + let lines = systemlist(command) + call s:cexpr('%m (%f\, line %l\, col %c)', lines, 'dartanalyzer') else call s:error(printf('cannot read a file: "%s"', path)) endif @@ -63,8 +76,9 @@ function! dart#tojs(q_args) abort if executable('dart2js') let path = expand('%:p:gs:\:/:') if filereadable(path) - let joined_lines = system(printf('dart2js %s %s', a:q_args, shellescape(path))) - call s:cexpr('%m (%f\, line %l\, col %c)', joined_lines) + let command = printf('dart2js %s %s', a:q_args, shellescape(path)) + let lines = systemlist(command) + call s:cexpr('%m (%f\, line %l\, col %c)', lines, 'dart2js') else call s:error(printf('cannot read a file: "%s"', path)) endif |