2017-08-23 03:03:13 -04:00
" Author: evnu - https://github.com/evnu
" Author: colbydehart - https://github.com/colbydehart
2018-06-02 13:03:56 -04:00
" Description: Mix compile checking for Elixir files
2017-08-23 03:03:13 -04:00
function ! ale_linters #elixir #mix #Handle ( buffer , lines ) abort
" Matches patterns like the following:
"
" Error format
" ** (CompileError) apps/sim/lib/sim/server.ex:87: undefined function update_in/4
"
" TODO: Warning format
" warning: variable "foobar" does not exist and is being expanded to "foobar()", please use parentheses to remove the ambiguity or change the variable name
let l :pattern = '\v\(([^\)]+Error)\) ([^:]+):([^:]+): (.+)$'
let l :output = []
for l :match in ale #util #GetMatches ( a :lines , l :pattern )
let l :type = 'E'
let l :text = l :match [4 ]
call add ( l :output , {
\ 'bufnr' : a :buffer ,
\ 'lnum' : l :match [3 ] + 0 ,
\ 'col' : 0 ,
\ 'type' : l :type ,
\ 'text' : l :text ,
\})
endfor
return l :output
endfunction
2018-06-06 23:58:32 -04:00
function ! ale_linters #elixir #mix #FindProjectRoot ( buffer ) abort
2018-06-07 12:47:57 -04:00
let l :mix_file = ale #path #FindNearestFile ( a :buffer , 'mix.exs' )
if ! empty ( l :mix_file )
return fnamemodify ( l :mix_file , ':p:h' )
2018-06-06 23:58:32 -04:00
endif
2018-06-07 12:47:57 -04:00
return '.'
2018-06-06 23:58:32 -04:00
endfunction
2018-06-02 13:03:56 -04:00
function ! ale_linters #elixir #mix #GetCommand ( buffer ) abort
2018-06-06 23:58:32 -04:00
let l :project_root = ale_linters #elixir #mix #FindProjectRoot ( a :buffer )
2018-06-02 13:03:56 -04:00
let l :temp_dir = ale #engine #CreateDirectory ( a :buffer )
let l :mix_build_path = has ( 'win32' )
\ ? 'set MIX_BUILD_PATH=' . ale #Escape ( l :temp_dir ) . ' && '
\ : 'MIX_BUILD_PATH=' . ale #Escape ( l :temp_dir ) . ' '
2018-06-07 12:47:57 -04:00
return ale #path #CdString ( l :project_root )
2018-06-02 13:03:56 -04:00
\ . l :mix_build_path
\ . ' mix compile %s'
2017-08-23 03:03:13 -04:00
endfunction
call ale #linter #Define ( 'elixir' , {
\ 'name' : 'mix' ,
\ 'executable' : 'mix' ,
2018-06-02 13:03:56 -04:00
\ 'command_callback' : 'ale_linters#elixir#mix#GetCommand' ,
2017-08-23 03:03:13 -04:00
\ 'callback' : 'ale_linters#elixir#mix#Handle' ,
2018-06-06 23:58:32 -04:00
\ 'lint_file' : 1 ,
2017-08-23 03:03:13 -04:00
\})