From ab5257c3442f5d5b5236905a4c77f4f09a24d8b5 Mon Sep 17 00:00:00 2001 From: Sander van Harmelen Date: Thu, 15 Feb 2018 12:23:36 +0100 Subject: [PATCH] This fixes issue #936 by linting the whole package --- ale_linters/go/staticcheck.vim | 24 ++++++++++- doc/ale-go.txt | 32 +++++++++++++++ doc/ale.txt | 1 + .../test_staticcheck_command_callback.vader | 41 +++++++++++++++++++ 4 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 test/command_callback/test_staticcheck_command_callback.vader diff --git a/ale_linters/go/staticcheck.vim b/ale_linters/go/staticcheck.vim index 255fd17..ce9e6e3 100644 --- a/ale_linters/go/staticcheck.vim +++ b/ale_linters/go/staticcheck.vim @@ -1,10 +1,32 @@ " Author: Ben Reedy " Description: staticcheck for Go files +call ale#Set('go_staticcheck_options', '') +call ale#Set('go_staticcheck_lint_package', 0) + +function! ale_linters#go#staticcheck#GetCommand(buffer) abort + let l:filename = expand('#' . a:buffer . ':t') + let l:options = ale#Var(a:buffer, 'go_staticcheck_options') + let l:lint_package = ale#Var(a:buffer, 'go_staticcheck_lint_package') + + " BufferCdString is used so that we can be sure the paths output from + " staticcheck can be calculated to absolute paths in the Handler + if l:lint_package + return ale#path#BufferCdString(a:buffer) + \ . 'staticcheck' + \ . (!empty(l:options) ? ' ' . l:options : '') . ' .' + endif + + return ale#path#BufferCdString(a:buffer) + \ . 'staticcheck' + \ . (!empty(l:options) ? ' ' . l:options : '') + \ . ' ' . ale#Escape(l:filename) +endfunction + call ale#linter#Define('go', { \ 'name': 'staticcheck', \ 'executable': 'staticcheck', -\ 'command': 'staticcheck %s', +\ 'command_callback': 'ale_linters#go#staticcheck#GetCommand', \ 'callback': 'ale#handlers#unix#HandleAsWarning', \ 'output_stream': 'both', \ 'lint_file': 1, diff --git a/doc/ale-go.txt b/doc/ale-go.txt index 502f237..b80bd45 100644 --- a/doc/ale-go.txt +++ b/doc/ale-go.txt @@ -20,6 +20,7 @@ the benefit of running a number of linters, more than ALE would by default, while ensuring it doesn't run any linters known to be slow or resource intensive. + =============================================================================== gobuild *ale-go-gobuild* @@ -42,6 +43,7 @@ g:ale_go_gofmt_options *g:ale_go_gofmt_options* This variable can be set to pass additional options to the gofmt fixer. + =============================================================================== gometalinter *ale-go-gometalinter* @@ -71,5 +73,35 @@ g:ale_go_gometalinter_options *g:ale_go_gometalinter_options* number of linters known to be slow or consume a lot of resources. +g:ale_go_gometalinter_package *g:ale_go_gometalinter_package* + *b:ale_go_gometalinter_package* + Type: |Number| + Default: `0` + + When set to `1`, the whole Go package will be checked instead of only the + current file. + + +=============================================================================== +staticcheck *ale-go-staticcheck* + +g:ale_go_staticcheck_options *g:ale_go_staticcheck_options* + *b:ale_go_staticcheck_options* + Type: |String| + Default: `''` + + This variable can be set to pass additional options to the staticcheck + linter. + + +g:ale_go_staticcheck_package *g:ale_go_staticcheck_package* + *b:ale_go_staticcheck_package* + Type: |Number| + Default: `0` + + When set to `1`, the whole Go package will be checked instead of only the + current file. + + =============================================================================== vim:tw=78:ts=2:sts=2:sw=2:ft=help:norl: diff --git a/doc/ale.txt b/doc/ale.txt index 6ace9d5..fa0e1c1 100644 --- a/doc/ale.txt +++ b/doc/ale.txt @@ -80,6 +80,7 @@ CONTENTS *ale-contents* gobuild.............................|ale-go-gobuild| gofmt...............................|ale-go-gofmt| gometalinter........................|ale-go-gometalinter| + staticcheck.........................|ale-go-staticcheck| graphql...............................|ale-graphql-options| eslint..............................|ale-graphql-eslint| gqlint..............................|ale-graphql-gqlint| diff --git a/test/command_callback/test_staticcheck_command_callback.vader b/test/command_callback/test_staticcheck_command_callback.vader new file mode 100644 index 0000000..e9628eb --- /dev/null +++ b/test/command_callback/test_staticcheck_command_callback.vader @@ -0,0 +1,41 @@ +Before: + Save b:ale_go_staticcheck_options + Save b:ale_go_staticcheck_lint_package + + let b:ale_go_staticcheck_options = '' + let b:ale_go_staticcheck_lint_package = 0 + + runtime ale_linters/go/staticcheck.vim + + call ale#test#SetDirectory('/testplugin/test/command_callback') + call ale#test#SetFilename('test.go') + +After: + Restore + + call ale#test#RestoreDirectory() + call ale#linter#Reset() + +Execute(The staticcheck callback should return the right defaults): + AssertEqual + \ 'cd ' . ale#Escape(expand('%:p:h')) . ' && ' + \ . 'staticcheck ' + \ . ale#Escape(expand('%' . ':t')), + \ ale_linters#go#staticcheck#GetCommand(bufnr('')) + +Execute(The staticcheck callback should use configured options): + let b:ale_go_staticcheck_options = '-test' + + AssertEqual + \ 'cd ' . ale#Escape(expand('%:p:h')) . ' && ' + \ . 'staticcheck ' + \ . '-test ' . ale#Escape(expand('%' . ':t')), + \ ale_linters#go#staticcheck#GetCommand(bufnr('')) + +Execute(The staticcheck `lint_package` option should use the correct command): + let b:ale_go_staticcheck_lint_package = 1 + + AssertEqual + \ 'cd ' . ale#Escape(expand('%:p:h')) . ' && ' + \ . 'staticcheck .', + \ ale_linters#go#staticcheck#GetCommand(bufnr(''))