summaryrefslogtreecommitdiff
path: root/ale_linters/elm
diff options
context:
space:
mode:
authorEric Lehner <ericj@buffalo.edu>2016-12-13 04:06:04 -0500
committerw0rp <w0rp@users.noreply.github.com>2016-12-13 09:06:04 +0000
commit70e379cc46868916126156558486a8d8971cc5fa (patch)
treed8bd38e172f02e4b4e2bbb508d9b30f4bb19e8b1 /ale_linters/elm
parent25f6445c50270f46ba83dfff417f0bb0360397f7 (diff)
downloadale-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')
-rw-r--r--ale_linters/elm/make.vim51
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'
+\})
+