Skip to content

Commit 5098dfd

Browse files
authored
Fix golangci-lint fixer with version 2 (dense-analysis#4960)
1 parent 7cdaaa6 commit 5098dfd

File tree

3 files changed

+115
-43
lines changed

3 files changed

+115
-43
lines changed
Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,48 @@
11
" Author: Ian Stapleton Cordasco <graffatcolmingov@gmail.com>
22
" Description: Run golangci-lint with the --fix flag to autofix some issues
33

4-
call ale#Set('go_golangci_lint_options', '')
5-
call ale#Set('go_golangci_lint_executable', 'golangci-lint')
6-
call ale#Set('go_golangci_lint_package', 1)
4+
call ale#Set('go_golangci_formatter_options', '')
5+
call ale#Set('go_golangci_formatter_executable', 'golangci-lint')
76

8-
function! ale#fixers#golangci_lint#GetCommand(buffer) abort
7+
function! ale#fixers#golangci_lint#GetExecutable(buffer) abort
8+
let l:executable = ale#Var(a:buffer, 'go_golangci_formatter_executable')
9+
10+
return l:executable
11+
endfunction
12+
13+
function! ale#fixers#golangci_lint#GetCommand(buffer, version) abort
914
let l:filename = expand('#' . a:buffer . ':t')
10-
let l:executable = ale#Var(a:buffer, 'go_golangci_lint_executable')
11-
let l:options = ale#Var(a:buffer, 'go_golangci_lint_options') . ' --fix'
12-
let l:package_mode = ale#Var(a:buffer, 'go_golangci_lint_package')
15+
let l:executable = ale#fixers#golangci_lint#GetExecutable(a:buffer)
16+
let l:options = ale#Var(a:buffer, 'go_golangci_formatter_options')
1317
let l:env = ale#go#EnvString(a:buffer)
1418

15-
16-
if l:package_mode
19+
if ale#semver#GTE(a:version, [2, 0, 0])
20+
return l:env . ale#Escape(l:executable)
21+
\ . ' fmt --stdin '
22+
\ . l:options
23+
else
1724
return l:env . ale#Escape(l:executable)
18-
\ . ' run '
19-
\ . l:options
25+
\ . ' run --fix '
26+
\ . l:options
27+
\ . ' '
28+
\ . ale#Escape(l:filename)
2029
endif
21-
22-
return l:env . ale#Escape(l:executable)
23-
\ . ' run '
24-
\ . l:options
25-
\ . ' ' . ale#Escape(l:filename)
2630
endfunction
2731

28-
function! ale#fixers#golangci_lint#Fix(buffer) abort
32+
function! ale#fixers#golangci_lint#GetCommandForVersion(buffer, version) abort
2933
return {
30-
\ 'command': ale#fixers#golangci_lint#GetCommand(a:buffer),
34+
\ 'command': ale#fixers#golangci_lint#GetCommand(a:buffer, a:version)
3135
\}
3236
endfunction
37+
38+
function! ale#fixers#golangci_lint#Fix(buffer) abort
39+
let l:executable = ale#fixers#golangci_lint#GetExecutable(a:buffer)
40+
let l:command = ale#fixers#golangci_lint#GetExecutable(a:buffer) . ale#Pad('--version')
41+
42+
return ale#semver#RunWithVersionCheck(
43+
\ a:buffer,
44+
\ l:executable,
45+
\ l:command,
46+
\ function('ale#fixers#golangci_lint#GetCommandForVersion'),
47+
\)
48+
endfunction

doc/ale-go.txt

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ g:ale_go_golangci_lint_options
144144
Default: `''`
145145

146146
This variable can be changed to alter the command-line arguments to the
147-
golangci-lint invocation.
147+
golangci-lint run invocation.
148148

149149
*ale-options.go_golangci_lint_package*
150150
*g:ale_go_golangci_lint_package*
@@ -157,6 +157,30 @@ g:ale_go_golangci_lint_package
157157
When set to `1`, the whole Go package will be checked instead of only the
158158
current file.
159159

160+
golangci_lint can also be user as a fixer to format go source files. In this
161+
case the following configuration variables can be used to configure the
162+
formatters:
163+
164+
*ale-options.go_golangci_formatter_executable*
165+
*g:ale_go_golangci_formatter_executable*
166+
*b:ale_go_golangci_formatter_executable*
167+
go_golangci_formatter_executable
168+
g:ale_go_golangci_formatter_executable
169+
Type: |String|
170+
Default: `'golangci-lint'`
171+
172+
The executable that will be run for golangci-lint.
173+
174+
*ale-options.go_golangci_formatter_options*
175+
*g:ale_go_golangci_formatter_options*
176+
*b:ale_go_golangci_formatter_options*
177+
go_golangci_formatter_options
178+
g:ale_go_golangci_formatter_options
179+
Type: |String|
180+
Default: `''`
181+
182+
This variable can be changed to alter the command-line arguments to the
183+
golangci-lint fmt invocation.
160184

161185
===============================================================================
162186
golangserver *ale-go-golangserver*

test/fixers/test_golangci_lint_fixer_callback.vader

Lines changed: 56 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,80 @@
11
Before:
2+
call ale#assert#SetUpFixerTest('go', 'golangci_lint')
23
Save g:ale_go_go111module
3-
Save g:ale_go_golangci_lint_executable
4-
Save g:ale_go_golangci_lint_options
5-
Save g:ale_go_golangci_lint_package
4+
Save g:ale_go_golangci_formatter_executable
5+
Save g:ale_go_golangci_formatter_options
66

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

118
call ale#test#SetDirectory('/testplugin/test/fixers')
129
call ale#test#SetFilename('../test-files/go/testfile.go')
10+
1311
After:
14-
Restore
12+
call ale#test#RestoreDirectory()
13+
call ale#assert#TearDownFixerTest()
1514

1615
unlet! b:ale_go_go111module
1716

18-
call ale#test#RestoreDirectory()
17+
Execute(The golangci-lint callback should return the correct default values with v1):
1918

20-
Execute(The golangci-lint callback should return the correct default values):
19+
GivenCommandOutput ['golangci-lint has version 1.64.8 built with go1.23.0']
2120

22-
AssertEqual
21+
AssertFixer
2322
\ {
24-
\ 'command': ale#Escape('xxxinvalid') . ' run --fix',
23+
\ 'command': ale#Escape('golangci-lint') . ' run --fix ' . ale#Escape('testfile.go'),
24+
\ }
25+
26+
Execute(The golangci-lint callback should include custom golangci-lint options with v1):
27+
let g:ale_go_golangci_formatter_options = "--new --config /dev/null"
28+
29+
GivenCommandOutput ['golangci-lint has version 1.64.8 built with go1.23.0']
30+
31+
AssertFixer
32+
\ {
33+
\ 'command': ale#Escape('golangci-lint')
34+
\ . ' run --fix ' . g:ale_go_golangci_formatter_options . ' ' . ale#Escape('testfile.go'),
2535
\ },
26-
\ ale#fixers#golangci_lint#Fix(bufnr(''))
2736

28-
Execute(The golangci-lint callback should include custom golangci-lint options):
29-
let g:ale_go_golangci_lint_options = "--new --config /dev/null"
37+
Execute(The golangci-lint callback should override executable with v1):
38+
let g:ale_go_golangci_formatter_executable = 'xxxinvalid'
3039

31-
AssertEqual
40+
GivenCommandOutput ['golangci-lint has version 1.64.8 built with go1.23.0']
41+
42+
AssertFixer
3243
\ {
3344
\ 'command': ale#Escape('xxxinvalid')
34-
\ . ' run ' . g:ale_go_golangci_lint_options . ' --fix',
45+
\ . ' run --fix '
46+
\ . g:ale_go_golangci_formatter_options
47+
\ . ' ' . ale#Escape('testfile.go'),
48+
\ },
49+
50+
Execute(The golangci-lint callback should return the correct default values with v2):
51+
52+
GivenCommandOutput ['golangci-lint has version 2.1.5 built with go1.23.0']
53+
54+
AssertFixer
55+
\ {
56+
\ 'command': ale#Escape('golangci-lint') . ' fmt --stdin ',
57+
\ }
58+
59+
Execute(The golangci-lint callback should include custom golangci-lint options with v2):
60+
let g:ale_go_golangci_formatter_options = "--new --config /dev/null"
61+
62+
GivenCommandOutput ['golangci-lint has version 2.1.5 built with go1.23.0']
63+
64+
AssertFixer
65+
\ {
66+
\ 'command': ale#Escape('golangci-lint')
67+
\ . ' fmt --stdin ' . g:ale_go_golangci_formatter_options,
3568
\ },
36-
\ ale#fixers#golangci_lint#Fix(bufnr(''))
3769

38-
Execute(The golangci-lint callback should support per-file mode):
39-
let g:ale_go_golangci_lint_package = 0
70+
Execute(The golangci-lint callback should override executable with v2):
71+
let g:ale_go_golangci_formatter_executable = 'xxxinvalid'
72+
73+
GivenCommandOutput ['golangci-lint has version 2.1.5 built with go1.23.0']
4074

41-
AssertEqual
75+
AssertFixer
4276
\ {
4377
\ 'command': ale#Escape('xxxinvalid')
44-
\ . ' run '
45-
\ . g:ale_go_golangci_lint_options
46-
\ . ' --fix ' . ale#Escape('testfile.go'),
78+
\ . ' fmt --stdin '
79+
\ . g:ale_go_golangci_formatter_options
4780
\ },
48-
\ ale#fixers#golangci_lint#Fix(bufnr(''))

0 commit comments

Comments
 (0)