 d44cd49a20
			
		
	
	
		d44cd49a20
		
			
		
	
	
	
	
		
			
			* fix: restore some linters - govet(nilness,unusedwrite) - bodyclose - contextcheck - nilerr - noctx - tparallel * fix: remove structcheck from the default linters.
		
			
				
	
	
		
			191 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			191 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 NewGovet(settings *config.GovetSettings) *goanalysis.Linter {
 | |
| 	var conf map[string]map[string]interface{}
 | |
| 	if settings != nil {
 | |
| 		conf = settings.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(settings),
 | |
| 		conf,
 | |
| 	).WithLoadMode(goanalysis.LoadModeTypesInfo)
 | |
| }
 | |
| 
 | |
| func analyzersFromConfig(settings *config.GovetSettings) []*analysis.Analyzer {
 | |
| 	if settings == nil {
 | |
| 		return defaultAnalyzers
 | |
| 	}
 | |
| 
 | |
| 	if settings.CheckShadowing {
 | |
| 		// Keeping for backward compatibility.
 | |
| 		settings.Enable = append(settings.Enable, shadow.Analyzer.Name)
 | |
| 	}
 | |
| 
 | |
| 	var enabledAnalyzers []*analysis.Analyzer
 | |
| 	for _, a := range allAnalyzers {
 | |
| 		if isAnalyzerEnabled(a.Name, settings, defaultAnalyzers) {
 | |
| 			enabledAnalyzers = append(enabledAnalyzers, a)
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return enabledAnalyzers
 | |
| }
 | |
| 
 | |
| 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
 | |
| }
 |