Skip to content

Commit

Permalink
feat: disable unsupported go1.18 govet analyzers
Browse files Browse the repository at this point in the history
  • Loading branch information
ldez committed Mar 21, 2022
1 parent 1c92353 commit 25a2d2f
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 58 deletions.
20 changes: 20 additions & 0 deletions pkg/config/config.go
@@ -1,5 +1,11 @@
package config

import (
"strings"

hcversion "github.com/hashicorp/go-version"
)

// Config encapsulates the config data specified in the golangci yaml config file.
type Config struct {
cfgDir string // The directory containing the golangci config file.
Expand Down Expand Up @@ -31,3 +37,17 @@ func NewDefault() *Config {
type Version struct {
Format string `mapstructure:"format"`
}

func IsGreaterThanOrEqualGo118(v string) bool {
v1, err := hcversion.NewVersion(strings.TrimPrefix(v, "go"))
if err != nil {
return false
}

limit, err := hcversion.NewVersion("1.18")
if err != nil {
return false
}

return v1.GreaterThanOrEqual(limit)
}
5 changes: 3 additions & 2 deletions pkg/config/linters_settings.go
Expand Up @@ -374,7 +374,8 @@ type GoSecSettings struct {
}

type GovetSettings struct {
CheckShadowing bool `mapstructure:"check-shadowing"`
Go string `mapstructure:"-"`
CheckShadowing bool `mapstructure:"check-shadowing"`
Settings map[string]map[string]interface{}

Enable []string
Expand All @@ -383,7 +384,7 @@ type GovetSettings struct {
DisableAll bool `mapstructure:"disable-all"`
}

func (cfg GovetSettings) Validate() error {
func (cfg *GovetSettings) Validate() error {
if cfg.EnableAll && cfg.DisableAll {
return errors.New("enable-all and disable-all can't be combined")
}
Expand Down
77 changes: 43 additions & 34 deletions pkg/golinters/govet.go
Expand Up @@ -119,7 +119,46 @@ var (
}
)

func NewGovet(cfg *config.GovetSettings) *goanalysis.Linter {
var settings map[string]map[string]interface{}
if cfg != nil {
settings = cfg.Settings
}
return goanalysis.NewLinter(
"govet",
"Vet examines Go source code and reports suspicious constructs, "+
"such as Printf calls whose arguments do not align with the format string",
analyzersFromConfig(cfg),
settings,
).WithLoadMode(goanalysis.LoadModeTypesInfo)
}

func analyzersFromConfig(cfg *config.GovetSettings) []*analysis.Analyzer {
if cfg == nil {
return defaultAnalyzers
}

if cfg.CheckShadowing {
// Keeping for backward compatibility.
cfg.Enable = append(cfg.Enable, shadow.Analyzer.Name)
}

var enabledAnalyzers []*analysis.Analyzer
for _, a := range allAnalyzers {
if isAnalyzerEnabled(a.Name, cfg, defaultAnalyzers) {
enabledAnalyzers = append(enabledAnalyzers, a)
}
}

return enabledAnalyzers
}

func isAnalyzerEnabled(name string, cfg *config.GovetSettings, defaultAnalyzers []*analysis.Analyzer) bool {
if (name == nilness.Analyzer.Name || name == unusedwrite.Analyzer.Name) &&
config.IsGreaterThanOrEqualGo118(cfg.Go) {
return false
}

if cfg.EnableAll {
for _, n := range cfg.Disable {
if n == name {
Expand All @@ -128,58 +167,28 @@ func isAnalyzerEnabled(name string, cfg *config.GovetSettings, defaultAnalyzers
}
return true
}

// Raw for loops should be OK on small slice lengths.
for _, n := range cfg.Enable {
if n == name {
return true
}
}

for _, n := range cfg.Disable {
if n == name {
return false
}
}

if cfg.DisableAll {
return false
}

for _, a := range defaultAnalyzers {
if a.Name == name {
return true
}
}
return false
}

func analyzersFromConfig(cfg *config.GovetSettings) []*analysis.Analyzer {
if cfg == nil {
return defaultAnalyzers
}

if cfg.CheckShadowing {
// Keeping for backward compatibility.
cfg.Enable = append(cfg.Enable, shadow.Analyzer.Name)
}

var enabledAnalyzers []*analysis.Analyzer
for _, a := range allAnalyzers {
if isAnalyzerEnabled(a.Name, cfg, defaultAnalyzers) {
enabledAnalyzers = append(enabledAnalyzers, a)
}
}

return enabledAnalyzers
}

func NewGovet(cfg *config.GovetSettings) *goanalysis.Linter {
var settings map[string]map[string]interface{}
if cfg != nil {
settings = cfg.Settings
}
return goanalysis.NewLinter(
"govet",
"Vet examines Go source code and reports suspicious constructs, "+
"such as Printf calls whose arguments do not align with the format string",
analyzersFromConfig(cfg),
settings,
).WithLoadMode(goanalysis.LoadModeTypesInfo)
}
23 changes: 1 addition & 22 deletions pkg/lint/linter/config.go
@@ -1,9 +1,6 @@
package linter

import (
"strings"

hcversion "github.com/hashicorp/go-version"
"golang.org/x/tools/go/analysis"
"golang.org/x/tools/go/packages"

Expand Down Expand Up @@ -126,7 +123,7 @@ func (lc *Config) Name() string {
}

func (lc *Config) WithNoopFallback(cfg *config.Config) *Config {
if isGreaterThanOrEqualGo118(cfg) {
if cfg != nil && config.IsGreaterThanOrEqualGo118(cfg.Run.Go) {
lc.Linter = &Noop{
name: lc.Linter.Name(),
desc: lc.Linter.Desc(),
Expand All @@ -145,21 +142,3 @@ func NewConfig(linter Linter) *Config {
}
return lc.WithLoadFiles()
}

func isGreaterThanOrEqualGo118(cfg *config.Config) bool {
if cfg == nil {
return false
}

v1, err := hcversion.NewVersion(strings.TrimPrefix(cfg.Run.Go, "go"))
if err != nil {
return false
}

limit, err := hcversion.NewVersion("1.18")
if err != nil {
return false
}

return v1.GreaterThanOrEqual(limit)
}
4 changes: 4 additions & 0 deletions pkg/lint/lintersdb/manager.go
Expand Up @@ -178,6 +178,10 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
m.cfg.Run.Go = "1.17"
}
}

if govetCfg != nil {
govetCfg.Go = m.cfg.Run.Go
}
}

const megacheckName = "megacheck"
Expand Down

0 comments on commit 25a2d2f

Please sign in to comment.