diff --git a/ale_linters/systemd/systemd_analyze.vim b/ale_linters/systemd/systemd_analyze.vim index 7e8bba2f..64eef8cf 100644 --- a/ale_linters/systemd/systemd_analyze.vim +++ b/ale_linters/systemd/systemd_analyze.vim @@ -1,17 +1,10 @@ function! ale_linters#systemd#systemd_analyze#Handle(buffer, lines) abort - let l:re = '\v(.+):([0-9]+): (.+)' - let l:output = [] - - for l:match in ale#util#GetMatches(a:lines, l:re) - call add(l:output, { - \ 'lnum': str2nr(l:match[2]), - \ 'col': 1, - \ 'type': 'W', - \ 'text': l:match[3], - \}) - endfor - - return l:output + return ale#util#MapMatches(a:lines, '\v(.+):([0-9]+): (.+)', {match -> { + \ 'lnum': str2nr(match[2]), + \ 'col': 1, + \ 'type': 'W', + \ 'text': match[3], + \}}) endfunction call ale#linter#Define('systemd', { diff --git a/autoload/ale/util.vim b/autoload/ale/util.vim index 5c41ab83..5b2bfcd7 100644 --- a/autoload/ale/util.vim +++ b/autoload/ale/util.vim @@ -340,6 +340,16 @@ function! ale#util#GetMatches(lines, patterns) abort return l:matches endfunction +" Given a single line, or a List of lines, and a single pattern, or a List of +" patterns, and a callback function for mapping the items matches, return the +" result of mapping all of the matches for the lines from the given patterns, +" using matchlist() +" +" Only the first pattern which matches a line will be returned. +function! ale#util#MapMatches(lines, patterns, Callback) abort + return map(ale#util#GetMatches(a:lines, a:patterns), 'a:Callback(v:val)') +endfunction + function! s:LoadArgCount(function) abort try let l:output = execute('function a:function') diff --git a/test/test_getmatches.vader b/test/test_getmatches.vader index e728b571..edf84f6e 100644 --- a/test/test_getmatches.vader +++ b/test/test_getmatches.vader @@ -72,6 +72,21 @@ Execute (ale#util#GetMatches should accept a string for a single pattern): \ '^.*:\(\d\+\):\(\d\+\): \(.\+\) \[\(.\+\)\]$' \ ) +Execute (ale#util#MapMatches should map matches): + AssertEqual + \ [ + \ '/path/to/some-filename.js:47:14: Missing trailing comma. [Warning/comma-dangle]', + \ '/path/to/some-filename.js:56:41: Missing semicolon. [Error/semi]', + \ ], + \ ale#util#MapMatches( + \ [ + \ '/path/to/some-filename.js:47:14: Missing trailing comma. [Warning/comma-dangle]', + \ '/path/to/some-filename.js:56:41: Missing semicolon. [Error/semi]', + \ ], + \ '^.*:\(\d\+\):\(\d\+\): \(.\+\) \[\(.\+\)\]$', + \ {match -> match[0]} + \ ) + Execute (ale#util#GetMatches should accept a single line as a string): AssertEqual \ [