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