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