mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2024-12-12 11:36:29 +00:00
186 lines
5.3 KiB
Go
186 lines
5.3 KiB
Go
|
package golinters
|
||
|
|
||
|
import (
|
||
|
"golang.org/x/tools/go/analysis"
|
||
|
"golang.org/x/tools/go/analysis/passes/asmdecl"
|
||
|
"golang.org/x/tools/go/analysis/passes/assign"
|
||
|
"golang.org/x/tools/go/analysis/passes/atomic"
|
||
|
"golang.org/x/tools/go/analysis/passes/atomicalign"
|
||
|
"golang.org/x/tools/go/analysis/passes/bools"
|
||
|
_ "golang.org/x/tools/go/analysis/passes/buildssa" // unused, internal analyzer
|
||
|
"golang.org/x/tools/go/analysis/passes/buildtag"
|
||
|
"golang.org/x/tools/go/analysis/passes/cgocall"
|
||
|
"golang.org/x/tools/go/analysis/passes/composite"
|
||
|
"golang.org/x/tools/go/analysis/passes/copylock"
|
||
|
_ "golang.org/x/tools/go/analysis/passes/ctrlflow" // unused, internal analyzer
|
||
|
"golang.org/x/tools/go/analysis/passes/deepequalerrors"
|
||
|
"golang.org/x/tools/go/analysis/passes/errorsas"
|
||
|
"golang.org/x/tools/go/analysis/passes/fieldalignment"
|
||
|
"golang.org/x/tools/go/analysis/passes/findcall"
|
||
|
"golang.org/x/tools/go/analysis/passes/framepointer"
|
||
|
"golang.org/x/tools/go/analysis/passes/httpresponse"
|
||
|
"golang.org/x/tools/go/analysis/passes/ifaceassert"
|
||
|
_ "golang.org/x/tools/go/analysis/passes/inspect" // unused internal analyzer
|
||
|
"golang.org/x/tools/go/analysis/passes/loopclosure"
|
||
|
"golang.org/x/tools/go/analysis/passes/lostcancel"
|
||
|
"golang.org/x/tools/go/analysis/passes/nilfunc"
|
||
|
"golang.org/x/tools/go/analysis/passes/nilness"
|
||
|
_ "golang.org/x/tools/go/analysis/passes/pkgfact" // unused, internal analyzer
|
||
|
"golang.org/x/tools/go/analysis/passes/printf"
|
||
|
"golang.org/x/tools/go/analysis/passes/reflectvaluecompare"
|
||
|
"golang.org/x/tools/go/analysis/passes/shadow"
|
||
|
"golang.org/x/tools/go/analysis/passes/shift"
|
||
|
"golang.org/x/tools/go/analysis/passes/sigchanyzer"
|
||
|
"golang.org/x/tools/go/analysis/passes/sortslice"
|
||
|
"golang.org/x/tools/go/analysis/passes/stdmethods"
|
||
|
"golang.org/x/tools/go/analysis/passes/stringintconv"
|
||
|
"golang.org/x/tools/go/analysis/passes/structtag"
|
||
|
"golang.org/x/tools/go/analysis/passes/testinggoroutine"
|
||
|
"golang.org/x/tools/go/analysis/passes/tests"
|
||
|
"golang.org/x/tools/go/analysis/passes/unmarshal"
|
||
|
"golang.org/x/tools/go/analysis/passes/unreachable"
|
||
|
"golang.org/x/tools/go/analysis/passes/unsafeptr"
|
||
|
"golang.org/x/tools/go/analysis/passes/unusedresult"
|
||
|
"golang.org/x/tools/go/analysis/passes/unusedwrite"
|
||
|
|
||
|
"github.com/golangci/golangci-lint/pkg/config"
|
||
|
"github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
allAnalyzers = []*analysis.Analyzer{
|
||
|
asmdecl.Analyzer,
|
||
|
assign.Analyzer,
|
||
|
atomic.Analyzer,
|
||
|
atomicalign.Analyzer,
|
||
|
bools.Analyzer,
|
||
|
buildtag.Analyzer,
|
||
|
cgocall.Analyzer,
|
||
|
composite.Analyzer,
|
||
|
copylock.Analyzer,
|
||
|
deepequalerrors.Analyzer,
|
||
|
errorsas.Analyzer,
|
||
|
fieldalignment.Analyzer,
|
||
|
findcall.Analyzer,
|
||
|
framepointer.Analyzer,
|
||
|
httpresponse.Analyzer,
|
||
|
ifaceassert.Analyzer,
|
||
|
loopclosure.Analyzer,
|
||
|
lostcancel.Analyzer,
|
||
|
nilfunc.Analyzer,
|
||
|
nilness.Analyzer,
|
||
|
printf.Analyzer,
|
||
|
reflectvaluecompare.Analyzer,
|
||
|
shadow.Analyzer,
|
||
|
shift.Analyzer,
|
||
|
sigchanyzer.Analyzer,
|
||
|
sortslice.Analyzer,
|
||
|
stdmethods.Analyzer,
|
||
|
stringintconv.Analyzer,
|
||
|
structtag.Analyzer,
|
||
|
testinggoroutine.Analyzer,
|
||
|
tests.Analyzer,
|
||
|
unmarshal.Analyzer,
|
||
|
unreachable.Analyzer,
|
||
|
unsafeptr.Analyzer,
|
||
|
unusedresult.Analyzer,
|
||
|
unusedwrite.Analyzer,
|
||
|
}
|
||
|
|
||
|
// https://github.com/golang/go/blob/879db69ce2de814bc3203c39b45617ba51cc5366/src/cmd/vet/main.go#L40-L68
|
||
|
defaultAnalyzers = []*analysis.Analyzer{
|
||
|
asmdecl.Analyzer,
|
||
|
assign.Analyzer,
|
||
|
atomic.Analyzer,
|
||
|
bools.Analyzer,
|
||
|
buildtag.Analyzer,
|
||
|
cgocall.Analyzer,
|
||
|
composite.Analyzer,
|
||
|
copylock.Analyzer,
|
||
|
errorsas.Analyzer,
|
||
|
framepointer.Analyzer,
|
||
|
httpresponse.Analyzer,
|
||
|
ifaceassert.Analyzer,
|
||
|
loopclosure.Analyzer,
|
||
|
lostcancel.Analyzer,
|
||
|
nilfunc.Analyzer,
|
||
|
printf.Analyzer,
|
||
|
shift.Analyzer,
|
||
|
sigchanyzer.Analyzer,
|
||
|
stdmethods.Analyzer,
|
||
|
stringintconv.Analyzer,
|
||
|
structtag.Analyzer,
|
||
|
testinggoroutine.Analyzer,
|
||
|
tests.Analyzer,
|
||
|
unmarshal.Analyzer,
|
||
|
unreachable.Analyzer,
|
||
|
unsafeptr.Analyzer,
|
||
|
unusedresult.Analyzer,
|
||
|
}
|
||
|
)
|
||
|
|
||
|
func isAnalyzerEnabled(name string, cfg *config.GovetSettings, defaultAnalyzers []*analysis.Analyzer) bool {
|
||
|
if cfg.EnableAll {
|
||
|
for _, n := range cfg.Disable {
|
||
|
if n == name {
|
||
|
return false
|
||
|
}
|
||
|
}
|
||
|
return true
|
||
|
}
|
||
|
// Raw for loops should be OK on small slice lengths.
|
||
|
for _, n := range cfg.Enable {
|
||
|
if n == name {
|
||
|
return true
|
||
|
}
|
||
|
}
|
||
|
for _, n := range cfg.Disable {
|
||
|
if n == name {
|
||
|
return false
|
||
|
}
|
||
|
}
|
||
|
if cfg.DisableAll {
|
||
|
return false
|
||
|
}
|
||
|
for _, a := range defaultAnalyzers {
|
||
|
if a.Name == name {
|
||
|
return true
|
||
|
}
|
||
|
}
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
func analyzersFromConfig(cfg *config.GovetSettings) []*analysis.Analyzer {
|
||
|
if cfg == nil {
|
||
|
return defaultAnalyzers
|
||
|
}
|
||
|
|
||
|
if cfg.CheckShadowing {
|
||
|
// Keeping for backward compatibility.
|
||
|
cfg.Enable = append(cfg.Enable, shadow.Analyzer.Name)
|
||
|
}
|
||
|
|
||
|
var enabledAnalyzers []*analysis.Analyzer
|
||
|
for _, a := range allAnalyzers {
|
||
|
if isAnalyzerEnabled(a.Name, cfg, defaultAnalyzers) {
|
||
|
enabledAnalyzers = append(enabledAnalyzers, a)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return enabledAnalyzers
|
||
|
}
|
||
|
|
||
|
func NewGovet(cfg *config.GovetSettings) *goanalysis.Linter {
|
||
|
var settings map[string]map[string]interface{}
|
||
|
if cfg != nil {
|
||
|
settings = cfg.Settings
|
||
|
}
|
||
|
return goanalysis.NewLinter(
|
||
|
"govet",
|
||
|
"Vet examines Go source code and reports suspicious constructs, "+
|
||
|
"such as Printf calls whose arguments do not align with the format string",
|
||
|
analyzersFromConfig(cfg),
|
||
|
settings,
|
||
|
).WithLoadMode(goanalysis.LoadModeTypesInfo)
|
||
|
}
|