2017-11-20 14:50:14 +00:00
" Author: Joshua Rubin <joshua@rubixconsulting.com>, Ben Reedy <https://github.com/breed808>,
" Jeff Willette <jrwillette88@gmail.com>
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>
2018-09-19 18:33:23 +00:00
call ale #Set ( 'go_go_executable' , 'go' )
2018-02-04 13:55:09 +00:00
call ale #Set ( 'go_gobuild_options' , '' )
2018-08-22 23:08:33 +00:00
function ! ale_linters #go #gobuild #GetCommand ( buffer ) abort
2018-02-04 13:55:09 +00:00
let l :options = ale #Var ( a :buffer , 'go_gobuild_options' )
2017-04-15 11:52:08 +00:00
" Run go test in local directory with relative path
2018-08-22 23:08:33 +00:00
return ale #path #BufferCdString ( a :buffer )
2018-09-19 18:33:23 +00:00
\ . ale #Var ( a :buffer , 'go_go_executable' ) . ' test'
2018-02-04 13:55:09 +00:00
\ . ( ! empty ( l :options ) ? ' ' . l :options : '' )
\ . ' -c -o /dev/null ./'
2017-02-07 20:36:04 +00:00
endfunction
2017-04-29 16:33:18 +00:00
function ! ale_linters #go #gobuild #GetMatches ( lines ) abort
" Matches patterns like the following:
2017-04-12 09:53:33 +00:00
"
" 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
2017-04-29 16:33:18 +00:00
let l :pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):?(\d+)?:? (.+)$'
2017-04-12 09:53:33 +00:00
2017-04-29 16:33:18 +00:00
return ale #util #GetMatches ( a :lines , l :pattern )
endfunction
function ! ale_linters #go #gobuild #Handler ( buffer , lines ) abort
2017-11-20 14:50:14 +00:00
let l :dir = expand ( '#' . a :buffer . ':p:h' )
2017-04-29 16:33:18 +00:00
let l :output = []
2017-04-12 09:53:33 +00:00
2017-04-29 16:33:18 +00:00
for l :match in ale_linters #go #gobuild #GetMatches ( a :lines )
2017-04-12 09:53:33 +00:00
call add ( l :output , {
2017-11-20 14:50:14 +00:00
\ 'filename' : ale #path #GetAbsPath ( l :dir , l :match [1 ]) ,
2017-04-29 16:33:18 +00:00
\ 'lnum' : l :match [2 ] + 0 ,
\ 'col' : l :match [3 ] + 0 ,
\ 'text' : l :match [4 ],
2017-04-12 09:53:33 +00:00
\ 'type' : 'E' ,
\})
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' , {
2018-07-24 09:05:44 +00:00
\ 'name' : 'gobuild' ,
\ 'aliases' : ['go build' ],
2018-09-19 18:33:23 +00:00
\ 'executable_callback' : ale #VarFunc ( 'go_go_executable' ) ,
2018-08-22 23:08:33 +00:00
\ 'command_callback' : 'ale_linters#go#gobuild#GetCommand' ,
\ 'output_stream' : 'stderr' ,
2017-02-07 20:36:04 +00:00
\ '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
\})