github.com/nozzle/golangci-lint@v1.49.0-nz3/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/golangci/golangci-lint/pkg/config" 47 "github.com/golangci/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 NewGovet(settings *config.GovetSettings) *goanalysis.Linter { 123 var conf map[string]map[string]interface{} 124 if settings != nil { 125 conf = settings.Settings 126 } 127 128 return goanalysis.NewLinter( 129 "govet", 130 "Vet examines Go source code and reports suspicious constructs, "+ 131 "such as Printf calls whose arguments do not align with the format string", 132 analyzersFromConfig(settings), 133 conf, 134 ).WithLoadMode(goanalysis.LoadModeTypesInfo) 135 } 136 137 func analyzersFromConfig(settings *config.GovetSettings) []*analysis.Analyzer { 138 if settings == nil { 139 return defaultAnalyzers 140 } 141 142 if settings.CheckShadowing { 143 // Keeping for backward compatibility. 144 settings.Enable = append(settings.Enable, shadow.Analyzer.Name) 145 } 146 147 var enabledAnalyzers []*analysis.Analyzer 148 for _, a := range allAnalyzers { 149 if isAnalyzerEnabled(a.Name, settings, defaultAnalyzers) { 150 enabledAnalyzers = append(enabledAnalyzers, a) 151 } 152 } 153 154 return enabledAnalyzers 155 } 156 157 func isAnalyzerEnabled(name string, cfg *config.GovetSettings, defaultAnalyzers []*analysis.Analyzer) bool { 158 if cfg.EnableAll { 159 for _, n := range cfg.Disable { 160 if n == name { 161 return false 162 } 163 } 164 return true 165 } 166 167 // Raw for loops should be OK on small slice lengths. 168 for _, n := range cfg.Enable { 169 if n == name { 170 return true 171 } 172 } 173 174 for _, n := range cfg.Disable { 175 if n == name { 176 return false 177 } 178 } 179 180 if cfg.DisableAll { 181 return false 182 } 183 184 for _, a := range defaultAnalyzers { 185 if a.Name == name { 186 return true 187 } 188 } 189 return false 190 }