dev: refactor govet impl with slices.Contains (#4372)

Co-authored-by: Fernandez Ludovic <ldez@users.noreply.github.com>
This commit is contained in:
Oleksandr Redko 2024-02-09 21:34:50 +02:00 committed by GitHub
parent 6f2684035f
commit 7cf6cc9d9f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 17 additions and 27 deletions

View File

@ -1,6 +1,8 @@
package golinters package golinters
import ( import (
"slices"
"golang.org/x/tools/go/analysis" "golang.org/x/tools/go/analysis"
"golang.org/x/tools/go/analysis/passes/appends" "golang.org/x/tools/go/analysis/passes/appends"
"golang.org/x/tools/go/analysis/passes/asmdecl" "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 { 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) { if name == loopclosure.Analyzer.Name && config.IsGreaterThanOrEqualGo122(cfg.Go) {
return false return false
} }
if cfg.EnableAll { switch {
for _, n := range cfg.Disable { case cfg.EnableAll:
if n == name { return !slices.Contains(cfg.Disable, name)
return false
} case slices.Contains(cfg.Enable, name):
}
return true return true
}
// Raw for loops should be OK on small slice lengths. case slices.Contains(cfg.Disable, name):
for _, n := range cfg.Enable {
if n == name {
return true
}
}
for _, n := range cfg.Disable {
if n == name {
return false return false
}
}
if cfg.DisableAll { case cfg.DisableAll:
return false return false
}
for _, a := range defaultAnalyzers { default:
if a.Name == name { return slices.ContainsFunc(defaultAnalyzers, func(a *analysis.Analyzer) bool { return a.Name == name })
return true
} }
}
return false
} }

View File

@ -72,6 +72,7 @@ func TestGovetAnalyzerIsEnabled(t *testing.T) {
Disable []string Disable []string
EnableAll bool EnableAll bool
DisableAll bool DisableAll bool
Go string
Name string Name string
Enabled bool Enabled bool
@ -83,12 +84,14 @@ func TestGovetAnalyzerIsEnabled(t *testing.T) {
{Name: "unsafeptr", Enabled: true, Enable: []string{"unsafeptr"}}, {Name: "unsafeptr", Enabled: true, Enable: []string{"unsafeptr"}},
{Name: "shift", Enabled: true, EnableAll: true}, {Name: "shift", Enabled: true, EnableAll: true},
{Name: "shadow", EnableAll: true, Disable: []string{"shadow"}, Enabled: false}, {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{ cfg := &config.GovetSettings{
Enable: tc.Enable, Enable: tc.Enable,
Disable: tc.Disable, Disable: tc.Disable,
EnableAll: tc.EnableAll, EnableAll: tc.EnableAll,
DisableAll: tc.DisableAll, DisableAll: tc.DisableAll,
Go: tc.Go,
} }
if enabled := isAnalyzerEnabled(tc.Name, cfg, defaultAnalyzers); enabled != tc.Enabled { if enabled := isAnalyzerEnabled(tc.Name, cfg, defaultAnalyzers); enabled != tc.Enabled {
t.Errorf("%+v", tc) t.Errorf("%+v", tc)