diff options
author | Eric Lehner <ericj@buffalo.edu> | 2016-12-13 04:06:04 -0500 |
---|---|---|
committer | w0rp <w0rp@users.noreply.github.com> | 2016-12-13 09:06:04 +0000 |
commit | 70e379cc46868916126156558486a8d8971cc5fa (patch) | |
tree | d8bd38e172f02e4b4e2bbb508d9b30f4bb19e8b1 /ale_linters/elm/make.vim | |
parent | 25f6445c50270f46ba83dfff417f0bb0360397f7 (diff) | |
download | ale-70e379cc46868916126156558486a8d8971cc5fa.zip |
Add Elm linting via elm-make (#213)
* Add support for Elm linting
* Adding documentation for Elm
* Adjusting spacing
* Addressing concerns listed in pull request
Removed the s:FindRootDirectory function as it does not make much sense
in this context. Adjusted the rest of the code to handle the removal of
that function, including using the ale#util function to find the nearest
file.
Ensured that when an empty filepath is found, the code does not attempt
to change directories.
Ensured that the linter would take from stdin using the wrapper.
Diffstat (limited to 'ale_linters/elm/make.vim')
-rw-r--r-- | ale_linters/elm/make.vim | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/ale_linters/elm/make.vim b/ale_linters/elm/make.vim new file mode 100644 index 00000000..77277b60 --- /dev/null +++ b/ale_linters/elm/make.vim @@ -0,0 +1,51 @@ +" Author: buffalocoder - https://github.com/buffalocoder +" Description: Elm linting in Ale. Closely follows the Syntastic checker in https://github.com/ElmCast/elm-vim. + +function! ale_linters#elm#make#Handle(buffer, lines) + let l:output = [] + for l:line in a:lines + if l:line[0] ==# '[' + let l:errors = json_decode(l:line) + + for l:error in l:errors + call add(l:output, { + \ 'bufnr': a:buffer, + \ 'lnum': l:error.region.start.line, + \ 'vcol': 0, + \ 'col': l:error.region.start.column, + \ 'type': (l:error.type ==? 'error') ? 'E' : 'W', + \ 'text': l:error.overview, + \ 'nr': -1, + \}) + endfor + endif + endfor + + return l:output +endfunction + +" Return the command to execute the linter in the projects directory. +" If it doesn't, then this will fail when imports are needed. +function! ale_linters#elm#make#GetCommand(buffer) abort + let l:elm_package = ale#util#FindNearestFile(a:buffer, 'elm-package.json') + if empty(l:elm_package) + let l:dir_set_cmd = '' + else + let l:root_dir = fnamemodify(l:elm_package, ':p:h') + let l:dir_set_cmd = 'cd ' . fnameescape(l:root_dir) . '; ' + endif + + let l:elm_cmd = 'elm-make --report=json --output='.shellescape(g:ale#util#nul_file) + let l:stdin_wrapper = g:ale#util#stdin_wrapper . ' .elm' + + return l:dir_set_cmd . ' ' . l:stdin_wrapper . ' ' . l:elm_cmd +endfunction + +call ale#linter#Define('elm', { +\ 'name': 'make', +\ 'executable': 'elm-make', +\ 'output_stream': 'both', +\ 'command_callback': 'ale_linters#elm#make#GetCommand', +\ 'callback': 'ale_linters#elm#make#Handle' +\}) + |