Skip to content

Commit

Permalink
Add golangci-lint fixer (#4853)
Browse files Browse the repository at this point in the history
Closes #4616
  • Loading branch information
sigmavirus24 authored Nov 27, 2024
1 parent 0ef2c45 commit 65b49c1
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 0 deletions.
5 changes: 5 additions & 0 deletions autoload/ale/fix/registry.vim
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,11 @@ let s:default_registry = {
\ 'suggested_filetypes': ['go'],
\ 'description': 'Fix Go files imports with goimports.',
\ },
\ 'golangci_lint': {
\ 'function': 'ale#fixers#golangci_lint#Fix',
\ 'suggested_filetypes': ['go'],
\ 'description': 'Fix Go files with golangci-lint.',
\ },
\ 'golines': {
\ 'function': 'ale#fixers#golines#Fix',
\ 'suggested_filetypes': ['go'],
Expand Down
32 changes: 32 additions & 0 deletions autoload/ale/fixers/golangci_lint.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
" Author: Ian Stapleton Cordasco <graffatcolmingov@gmail.com>
" Description: Run golangci-lint with the --fix flag to autofix some issues

call ale#Set('go_golangci_lint_options', '')
call ale#Set('go_golangci_lint_executable', 'golangci-lint')
call ale#Set('go_golangci_lint_package', 1)

function! ale#fixers#golangci_lint#GetCommand(buffer) abort
let l:filename = expand('#' . a:buffer . ':t')
let l:executable = ale#Var(a:buffer, 'go_golangci_lint_executable')
let l:options = ale#Var(a:buffer, 'go_golangci_lint_options') . ' --fix'
let l:package_mode = ale#Var(a:buffer, 'go_golangci_lint_package')
let l:env = ale#go#EnvString(a:buffer)


if l:package_mode
return l:env . ale#Escape(l:executable)
\ . ' run '
\ . l:options
endif

return l:env . ale#Escape(l:executable)
\ . ' run '
\ . l:options
\ . ' ' . ale#Escape(l:filename)
endfunction

function! ale#fixers#golangci_lint#Fix(buffer) abort
return {
\ 'command': ale#fixers#golangci_lint#GetCommand(a:buffer),
\}
endfunction
48 changes: 48 additions & 0 deletions test/fixers/test_golangci_lint_fixer_callback.vader
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
Before:
Save g:ale_go_go111module
Save g:ale_go_golangci_lint_executable
Save g:ale_go_golangci_lint_options
Save g:ale_go_golangci_lint_package

" Use an invalid global executable, so we don't match it.
let g:ale_go_golangci_lint_executable = 'xxxinvalid'
let g:ale_go_golangci_lint_options = ''

call ale#test#SetDirectory('/testplugin/test/fixers')
call ale#test#SetFilename('../test-files/go/testfile.go')
After:
Restore

unlet! b:ale_go_go111module

call ale#test#RestoreDirectory()

Execute(The golangci-lint callback should return the correct default values):

AssertEqual
\ {
\ 'command': ale#Escape('xxxinvalid') . ' run --fix',
\ },
\ ale#fixers#golangci_lint#Fix(bufnr(''))

Execute(The golangci-lint callback should include custom golangci-lint options):
let g:ale_go_golangci_lint_options = "--new --config /dev/null"

AssertEqual
\ {
\ 'command': ale#Escape('xxxinvalid')
\ . ' run ' . g:ale_go_golangci_lint_options . ' --fix',
\ },
\ ale#fixers#golangci_lint#Fix(bufnr(''))

Execute(The golangci-lint callback should support per-file mode):
let g:ale_go_golangci_lint_package = 0

AssertEqual
\ {
\ 'command': ale#Escape('xxxinvalid')
\ . ' run '
\ . g:ale_go_golangci_lint_options
\ . ' --fix ' . ale#Escape('testfile.go'),
\ },
\ ale#fixers#golangci_lint#Fix(bufnr(''))

0 comments on commit 65b49c1

Please sign in to comment.