From 653bb1be874cb43892e629d2363d905b1ec77ea2 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Sat, 24 Feb 2018 18:19:25 +0100 Subject: [PATCH] statusline: improve error handling/reporting (#1873) --- autoload/neomake/statusline.vim | 13 ++++++++++--- tests/statusline.vader | 8 +++++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/autoload/neomake/statusline.vim b/autoload/neomake/statusline.vim index 91cb52c0c0..09e9bba23a 100644 --- a/autoload/neomake/statusline.vim +++ b/autoload/neomake/statusline.vim @@ -151,8 +151,7 @@ function! s:formatter._substitute(m) abort return self.args[a:m] endif if !has_key(self, a:m) - call neomake#utils#ErrorMessage(printf( - \ 'Unknown statusline format: {{%s}}.', a:m)) + let self.errors += [printf('Unknown statusline format: {{%s}}.', a:m)] return '{{'.a:m.'}}' endif try @@ -168,7 +167,15 @@ function! s:formatter.format(f, args) abort return a:f endif let self.args = a:args - return substitute(a:f, '{{\(.\{-}\)}}', '\=self._substitute(submatch(1))', 'g') + let self.errors = [] + let r = substitute(a:f, '{{\(.\{-}\)}}', '\=self._substitute(submatch(1))', 'g') + if !empty(self.errors) + call neomake#utils#ErrorMessage(printf( + \ 'Error%s when formatting %s: %s', + \ len(self.errors) > 1 ? 's' : '', + \ string(a:f), join(self.errors, ', '))) + endif + return r endfunction diff --git a/tests/statusline.vader b/tests/statusline.vader index 5975ce997e..73cbf779b0 100644 --- a/tests/statusline.vader +++ b/tests/statusline.vader @@ -66,7 +66,7 @@ Execute (neomake#statusline#get_status): AssertEqual neomake#statusline#get_status(bufnr, {'format_loclist_unknown': '{{running_job_names}}'}), '' " {{running_jobs}} is only available with 'format_running' (internally). AssertEqual neomake#statusline#get_status(bufnr, {'format_loclist_unknown': '{{running_jobs}}'}), '{{running_jobs}}' - AssertNeomakeMessage 'Unknown statusline format: {{running_jobs}}.', 0 + AssertNeomakeMessage "Error when formatting '{{running_jobs}}': Unknown statusline format: {{running_jobs}}.", 0 call neomake#Make({'enabled_makers': [g:sleep_maker]}) if neomake#has_async_support() @@ -80,7 +80,7 @@ Execute (neomake#statusline#get_status): Assert neomake#statusline#get_status(bufnr, {'format_running': '{{running_jobs}}'}) =~# '\m^{''', '{{running_jobs}} is replaced in format_running' call neomake#statusline#get_status(bufnr(''), {'format_running': 'Neomake: {{does_not_exist}}'}) - AssertNeomakeMessage 'Unknown statusline format: {{does_not_exist}}.', 0 + AssertNeomakeMessage "Error when formatting 'Neomake: {{does_not_exist}}': Unknown statusline format: {{does_not_exist}}.", 0 NeomakeTestsWaitForFinishedJobs else AssertEqual neomake#statusline#get_status(bufnr, {'format_running': '...'}), '%#NeomakeStatusGood#✓' @@ -89,7 +89,9 @@ Execute (neomake#statusline#get_status): endif call neomake#statusline#get_status(bufnr(''), {'format_loclist_ok': 'Neomake: {{does_not_exist}}'}) - AssertNeomakeMessage 'Unknown statusline format: {{does_not_exist}}.', 0 + AssertNeomakeMessage "Error when formatting 'Neomake: {{does_not_exist}}': Unknown statusline format: {{does_not_exist}}.", 0 + call neomake#statusline#get_status(bufnr(''), {'format_loclist_ok': '{{foo}} {{bar}}'}) + AssertNeomakeMessage "Errors when formatting '{{foo}} {{bar}}': Unknown statusline format: {{foo}}., Unknown statusline format: {{bar}}.", 0 AssertEqual neomake#statusline#get_status(bufnr, {}), '%#NeomakeStatusGood#✓' AssertEqual neomake#statusline#get(bufnr, {}), '%#NeomakeStatusGood#✓'