2017-04-12 09:53:33 +00:00
" Author: Joshua Rubin <joshua@rubixconsulting.com>, Ben Reedy <https://github.com/breed808>
2016-12-22 12:10:21 +00:00
" Description: go build for Go files
2017-02-07 20:36:04 +00:00
" inspired by work from dzhou121 <dzhou121@gmail.com>
function ! ale_linters #go #gobuild #GoEnv ( buffer ) abort
if exists ( 's:go_env' )
return ''
endif
return 'go env GOPATH GOROOT'
endfunction
2017-04-12 09:53:33 +00:00
function ! ale_linters #go #gobuild #GetCommand ( buffer , goenv_output ) abort
if ! exists ( 's:go_env' )
2017-02-07 20:36:04 +00:00
let s :go_env = {
\ 'GOPATH' : a :goenv_output [0 ],
\ 'GOROOT' : a :goenv_output [1 ],
\}
endif
2017-04-13 08:58:55 +00:00
" Run go test in local directory with relative path
return 'GOPATH=' . s :go_env .GOPATH . ' cd ' . fnamemodify ( bufname ( a :buffer ) , ':.:h' ) . ' && go test -c -o /dev/null ./'
2017-02-07 20:36:04 +00:00
endfunction
function ! ale_linters #go #gobuild #Handler ( buffer , lines ) abort
2017-04-12 09:53:33 +00:00
return ale_linters #go #gobuild #HandleGoBuildErrors ( a :buffer , bufname ( a :buffer ) , a :lines )
endfunction
2017-02-07 20:36:04 +00:00
2017-04-12 09:53:33 +00:00
function ! ale_linters #go #gobuild #HandleGoBuildErrors ( buffer , full_filename , lines ) abort
" Matches patterns line the following:
"
" file.go:27: missing argument for Printf("%s"): format reads arg 2, have only 1 args
" file.go:53:10: if block ends with a return statement, so drop this else and outdent its block (move short variable declaration to its own line if necessary)
" file.go:5:2: expected declaration, found 'STRING' "log"
" go test returns relative paths so use tail of filename as part of pattern matcher
let l :filename = fnamemodify ( a :full_filename , ':t' )
let l :path_pattern = '[a-zA-Z]\?\\\?:\?[[:alnum:]/\.\-_]\+'
let l :pattern = '^' . l :path_pattern . ':\(\d\+\):\?\(\d\+\)\?:\? \(.\+\)$'
let l :output = []
for l :line in a :lines
let l :match = matchlist ( l :line , l :pattern )
" Omit errors from imported go packages
if len ( l :match ) = = 0 | | l :line ! ~ l :filename
continue
endif
" vcol is Needed to indicate that the column is a character.
call add ( l :output , {
\ 'bufnr' : a :buffer ,
\ 'lnum' : l :match [1 ] + 0 ,
\ 'vcol' : 0 ,
\ 'col' : l :match [2 ] + 0 ,
\ 'text' : l :match [3 ],
\ 'type' : 'E' ,
\ 'nr' : -1 ,
\})
endfor
return l :output
2017-02-07 20:36:04 +00:00
endfunction
2016-12-22 12:10:21 +00:00
call ale #linter #Define ( 'go' , {
\ 'name' : 'go build' ,
\ 'executable' : 'go' ,
2017-02-07 20:36:04 +00:00
\ 'command_chain' : [
\ {'callback' : 'ale_linters#go#gobuild#GoEnv' , 'output_stream' : 'stdout' },
\ {'callback' : 'ale_linters#go#gobuild#GetCommand' , 'output_stream' : 'stderr' },
\ ],
\ 'callback' : 'ale_linters#go#gobuild#Handler' ,
2017-04-12 09:53:33 +00:00
\ 'lint_file' : 1 ,
2016-12-22 12:10:21 +00:00
\})