github.com/elek/golangci-lint@v1.42.2-0.20211208090441-c05b7fcb3a9a/pkg/golinters/govet.go (about) 1 package golinters 2 3 import ( 4 "golang.org/x/tools/go/analysis" 5 "golang.org/x/tools/go/analysis/passes/asmdecl" 6 "golang.org/x/tools/go/analysis/passes/assign" 7 "golang.org/x/tools/go/analysis/passes/atomic" 8 "golang.org/x/tools/go/analysis/passes/atomicalign" 9 "golang.org/x/tools/go/analysis/passes/bools" 10 _ "golang.org/x/tools/go/analysis/passes/buildssa" // unused, internal analyzer 11 "golang.org/x/tools/go/analysis/passes/buildtag" 12 "golang.org/x/tools/go/analysis/passes/cgocall" 13 "golang.org/x/tools/go/analysis/passes/composite" 14 "golang.org/x/tools/go/analysis/passes/copylock" 15 _ "golang.org/x/tools/go/analysis/passes/ctrlflow" // unused, internal analyzer 16 "golang.org/x/tools/go/analysis/passes/deepequalerrors" 17 "golang.org/x/tools/go/analysis/passes/errorsas" 18 "golang.org/x/tools/go/analysis/passes/fieldalignment" 19 "golang.org/x/tools/go/analysis/passes/findcall" 20 "golang.org/x/tools/go/analysis/passes/framepointer" 21 "golang.org/x/tools/go/analysis/passes/httpresponse" 22 "golang.org/x/tools/go/analysis/passes/ifaceassert" 23 _ "golang.org/x/tools/go/analysis/passes/inspect" // unused internal analyzer 24 "golang.org/x/tools/go/analysis/passes/loopclosure" 25 "golang.org/x/tools/go/analysis/passes/lostcancel" 26 "golang.org/x/tools/go/analysis/passes/nilfunc" 27 "golang.org/x/tools/go/analysis/passes/nilness" 28 _ "golang.org/x/tools/go/analysis/passes/pkgfact" // unused, internal analyzer 29 "golang.org/x/tools/go/analysis/passes/printf" 30 "golang.org/x/tools/go/analysis/passes/reflectvaluecompare" 31 "golang.org/x/tools/go/analysis/passes/shadow" 32 "golang.org/x/tools/go/analysis/passes/shift" 33 "golang.org/x/tools/go/analysis/passes/sigchanyzer" 34 "golang.org/x/tools/go/analysis/passes/sortslice" 35 "golang.org/x/tools/go/analysis/passes/stdmethods" 36 "golang.org/x/tools/go/analysis/passes/stringintconv" 37 "golang.org/x/tools/go/analysis/passes/structtag" 38 "golang.org/x/tools/go/analysis/passes/testinggoroutine" 39 "golang.org/x/tools/go/analysis/passes/tests" 40 "golang.org/x/tools/go/analysis/passes/unmarshal" 41 "golang.org/x/tools/go/analysis/passes/unreachable" 42 "golang.org/x/tools/go/analysis/passes/unsafeptr" 43 "golang.org/x/tools/go/analysis/passes/unusedresult" 44 "golang.org/x/tools/go/analysis/passes/unusedwrite" 45 46 "github.com/elek/golangci-lint/pkg/config" 47 "github.com/elek/golangci-lint/pkg/golinters/goanalysis" 48 ) 49 50 var ( 51 allAnalyzers = []*analysis.Analyzer{ 52 asmdecl.Analyzer, 53 assign.Analyzer, 54 atomic.Analyzer, 55 atomicalign.Analyzer, 56 bools.Analyzer, 57 buildtag.Analyzer, 58 cgocall.Analyzer, 59 composite.Analyzer, 60 copylock.Analyzer, 61 deepequalerrors.Analyzer, 62 errorsas.Analyzer, 63 fieldalignment.Analyzer, 64 findcall.Analyzer, 65 framepointer.Analyzer, 66 httpresponse.Analyzer, 67 ifaceassert.Analyzer, 68 loopclosure.Analyzer, 69 lostcancel.Analyzer, 70 nilfunc.Analyzer, 71 nilness.Analyzer, 72 printf.Analyzer, 73 reflectvaluecompare.Analyzer, 74 shadow.Analyzer, 75 shift.Analyzer, 76 sigchanyzer.Analyzer, 77 sortslice.Analyzer, 78 stdmethods.Analyzer, 79 stringintconv.Analyzer, 80 structtag.Analyzer, 81 testinggoroutine.Analyzer, 82 tests.Analyzer, 83 unmarshal.Analyzer, 84 unreachable.Analyzer, 85 unsafeptr.Analyzer, 86 unusedresult.Analyzer, 87 unusedwrite.Analyzer, 88 } 89 90 // https://github.com/golang/go/blob/879db69ce2de814bc3203c39b45617ba51cc5366/src/cmd/vet/main.go#L40-L68 91 defaultAnalyzers = []*analysis.Analyzer{ 92 asmdecl.Analyzer, 93 assign.Analyzer, 94 atomic.Analyzer, 95 bools.Analyzer, 96 buildtag.Analyzer, 97 cgocall.Analyzer, 98 composite.Analyzer, 99 copylock.Analyzer, 100 errorsas.Analyzer, 101 framepointer.Analyzer, 102 httpresponse.Analyzer, 103 ifaceassert.Analyzer, 104 loopclosure.Analyzer, 105 lostcancel.Analyzer, 106 nilfunc.Analyzer, 107 printf.Analyzer, 108 shift.Analyzer, 109 sigchanyzer.Analyzer, 110 stdmethods.Analyzer, 111 stringintconv.Analyzer, 112 structtag.Analyzer, 113 testinggoroutine.Analyzer, 114 tests.Analyzer, 115 unmarshal.Analyzer, 116 unreachable.Analyzer, 117 unsafeptr.Analyzer, 118 unusedresult.Analyzer, 119 } 120 ) 121 122 func isAnalyzerEnabled(name string, cfg *config.GovetSettings, defaultAnalyzers []*analysis.Analyzer) bool { 123 if cfg.EnableAll { 124 for _, n := range cfg.Disable { 125 if n == name { 126 return false 127 } 128 } 129 return true 130 } 131 // Raw for loops should be OK on small slice lengths. 132 for _, n := range cfg.Enable { 133 if n == name { 134 return true 135 } 136 } 137 for _, n := range cfg.Disable { 138 if n == name { 139 return false 140 } 141 } 142 if cfg.DisableAll { 143 return false 144 } 145 for _, a := range defaultAnalyzers { 146 if a.Name == name { 147 return true 148 } 149 } 150 return false 151 } 152 153 func analyzersFromConfig(cfg *config.GovetSettings) []*analysis.Analyzer { 154 if cfg == nil { 155 return defaultAnalyzers 156 } 157 158 if cfg.CheckShadowing { 159 // Keeping for backward compatibility. 160 cfg.Enable = append(cfg.Enable, shadow.Analyzer.Name) 161 } 162 163 var enabledAnalyzers []*analysis.Analyzer 164 for _, a := range allAnalyzers { 165 if isAnalyzerEnabled(a.Name, cfg, defaultAnalyzers) { 166 enabledAnalyzers = append(enabledAnalyzers, a) 167 } 168 } 169 170 return enabledAnalyzers 171 } 172 173 func NewGovet(cfg *config.GovetSettings) *goanalysis.Linter { 174 var settings map[string]map[string]interface{} 175 if cfg != nil { 176 settings = cfg.Settings 177 } 178 return goanalysis.NewLinter( 179 "govet", 180 "Vet examines Go source code and reports suspicious constructs, "+ 181 "such as Printf calls whose arguments do not align with the format string", 182 analyzersFromConfig(cfg), 183 settings, 184 ).WithLoadMode(goanalysis.LoadModeTypesInfo) 185 }