diff --git a/pkg/golinters/govet.go b/pkg/golinters/govet.go index 4b1ea6255f08..a0d33835dfad 100644 --- a/pkg/golinters/govet.go +++ b/pkg/golinters/govet.go @@ -1,6 +1,8 @@ package golinters import ( + "slices" + "golang.org/x/tools/go/analysis" "golang.org/x/tools/go/analysis/passes/appends" "golang.org/x/tools/go/analysis/passes/asmdecl" @@ -170,40 +172,25 @@ func analyzersFromConfig(settings *config.GovetSettings) []*analysis.Analyzer { } func isAnalyzerEnabled(name string, cfg *config.GovetSettings, defaultAnalyzers []*analysis.Analyzer) bool { + // TODO(ldez) remove loopclosure when go1.23 if name == loopclosure.Analyzer.Name && config.IsGreaterThanOrEqualGo122(cfg.Go) { return false } - if cfg.EnableAll { - for _, n := range cfg.Disable { - if n == name { - return false - } - } - return true - } + switch { + case cfg.EnableAll: + return !slices.Contains(cfg.Disable, name) - // Raw for loops should be OK on small slice lengths. - for _, n := range cfg.Enable { - if n == name { - return true - } - } + case slices.Contains(cfg.Enable, name): + return true - for _, n := range cfg.Disable { - if n == name { - return false - } - } + case slices.Contains(cfg.Disable, name): + return false - if cfg.DisableAll { + case cfg.DisableAll: return false - } - for _, a := range defaultAnalyzers { - if a.Name == name { - return true - } + default: + return slices.ContainsFunc(defaultAnalyzers, func(a *analysis.Analyzer) bool { return a.Name == name }) } - return false } diff --git a/pkg/golinters/govet_test.go b/pkg/golinters/govet_test.go index 20ddf1fd4c49..91b5179243ae 100644 --- a/pkg/golinters/govet_test.go +++ b/pkg/golinters/govet_test.go @@ -72,6 +72,7 @@ func TestGovetAnalyzerIsEnabled(t *testing.T) { Disable []string EnableAll bool DisableAll bool + Go string Name string Enabled bool @@ -83,12 +84,14 @@ func TestGovetAnalyzerIsEnabled(t *testing.T) { {Name: "unsafeptr", Enabled: true, Enable: []string{"unsafeptr"}}, {Name: "shift", Enabled: true, EnableAll: true}, {Name: "shadow", EnableAll: true, Disable: []string{"shadow"}, Enabled: false}, + {Name: "loopclosure", EnableAll: true, Enabled: false, Go: "1.22"}, // TODO(ldez) remove loopclosure when go1.23 } { cfg := &config.GovetSettings{ Enable: tc.Enable, Disable: tc.Disable, EnableAll: tc.EnableAll, DisableAll: tc.DisableAll, + Go: tc.Go, } if enabled := isAnalyzerEnabled(tc.Name, cfg, defaultAnalyzers); enabled != tc.Enabled { t.Errorf("%+v", tc)