diff --git a/ale_linters/go/golangci_lint.vim b/ale_linters/go/golangci_lint.vim index faa8068b..d65f8e91 100644 --- a/ale_linters/go/golangci_lint.vim +++ b/ale_linters/go/golangci_lint.vim @@ -5,26 +5,38 @@ 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_linters#go#golangci_lint#GetCommand(buffer) abort +function! ale_linters#go#golangci_lint#GetExecutable(buffer) abort + let l:executable = ale#Var(a:buffer, 'go_golangci_lint_executable') + + return l:executable +endfunction + +function! ale_linters#go#golangci_lint#GetCommand(buffer, version) abort let l:filename = expand('#' . a:buffer . ':t') let l:options = ale#Var(a:buffer, 'go_golangci_lint_options') let l:lint_package = ale#Var(a:buffer, 'go_golangci_lint_package') + if ale#semver#GTE(a:version, [2, 0, 0]) + let l:options = l:options + \ . ' --output.json.path stdout' + \ . ' --output.text.path stderr' + \ . ' --show-stats=0' + else + let l:options = l:options + \ . ' --out-format=json' + \ . ' --show-stats=0' + endif if l:lint_package return ale#go#EnvString(a:buffer) \ . '%e run ' \ . l:options - \ . ' --out-format=json' - \ . ' --show-stats=0' endif return ale#go#EnvString(a:buffer) \ . '%e run ' \ . ale#Escape(l:filename) \ . ' ' . l:options - \ . ' --out-format=json' - \ . ' --show-stats=0' endfunction function! ale_linters#go#golangci_lint#Handler(buffer, lines) abort @@ -58,9 +70,14 @@ endfunction call ale#linter#Define('go', { \ 'name': 'golangci-lint', -\ 'executable': {b -> ale#Var(b, 'go_golangci_lint_executable')}, +\ 'executable': function('ale_linters#go#golangci_lint#GetExecutable'), \ 'cwd': '%s:h', -\ 'command': function('ale_linters#go#golangci_lint#GetCommand'), +\ 'command': {buffer -> ale#semver#RunWithVersionCheck( +\ buffer, +\ ale_linters#go#golangci_lint#GetExecutable(buffer), +\ '%e --version', +\ function('ale_linters#go#golangci_lint#GetCommand'), +\ )}, \ 'callback': 'ale_linters#go#golangci_lint#Handler', \ 'lint_file': 1, \}) diff --git a/test/linter/test_golangci_lint.vader b/test/linter/test_golangci_lint.vader index 7d9881f4..1c5a730d 100644 --- a/test/linter/test_golangci_lint.vader +++ b/test/linter/test_golangci_lint.vader @@ -4,6 +4,9 @@ Before: call ale#assert#SetUpLinterTest('go', 'golangci_lint') call ale#test#SetFilename('test.go') + " Test with version 1.64.8 by default + GivenCommandOutput ['golangci-lint has version 1.64.8 built with go1.23.0'] + After: Restore @@ -16,6 +19,18 @@ Execute(The golangci-lint defaults should be correct): AssertLinter 'golangci-lint', \ ale#Escape('golangci-lint') . ' run --out-format=json --show-stats=0' +Execute(The golangci-lint defaults should be correct with no version info): + GivenCommandOutput [] + AssertLinterCwd '%s:h', + AssertLinter 'golangci-lint', + \ ale#Escape('golangci-lint') . ' run --out-format=json --show-stats=0' + +Execute(The golangci-lint defaults should be correct with version 2): + GivenCommandOutput ['golangci-lint has version 2.0.2 built with go1.24.0'] + AssertLinterCwd '%s:h', + AssertLinter 'golangci-lint', + \ ale#Escape('golangci-lint') . ' run --output.json.path stdout --output.text.path stderr --show-stats=0' + Execute(The golangci-lint callback should use a configured executable): let b:ale_go_golangci_lint_executable = 'something else' @@ -23,6 +38,14 @@ Execute(The golangci-lint callback should use a configured executable): \ ale#Escape('something else') \ . ' run --out-format=json --show-stats=0' +Execute(The golangci-lint callback should use a configured version 2 executable): + GivenCommandOutput ['golangci-lint has version 2.0.0 built with go1.22.0'] + let b:ale_go_golangci_lint_executable = 'something else' + + AssertLinter 'something else', + \ ale#Escape('something else') + \ . ' run --output.json.path stdout --output.text.path stderr --show-stats=0' + Execute(The golangci-lint callback should use configured options): let b:ale_go_golangci_lint_options = '--foobar'