Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 3 additions & 12 deletions .golangci.reference.yml
Original file line number Diff line number Diff line change
Expand Up @@ -626,9 +626,6 @@ linters-settings:
replacement: 'a[b:]'

gofumpt:
# Deprecated: use the global `run.go` instead.
lang-version: "1.17"

# Module path which contains the source code being formatted.
# Default: ""
module-path: github.com/org/project
Expand Down Expand Up @@ -769,9 +766,7 @@ linters-settings:
local_replace_directives: false

gosimple:
# Deprecated: use the global `run.go` instead.
go: "1.15"
# Sxxxx checks in https://staticcheck.io/docs/configuration/options/#checks
# Sxxxx checks in https://staticcheck.io/docs/checks/#S
# Default: ["*"]
checks: [ "all" ]

Expand Down Expand Up @@ -1685,16 +1680,12 @@ linters-settings:
- github.com/jmoiron/sqlx

staticcheck:
# Deprecated: use the global `run.go` instead.
go: "1.15"
# SAxxxx checks in https://staticcheck.io/docs/configuration/options/#checks
# SAxxxx checks in https://staticcheck.io/docs/checks/#SA
# Default: ["*"]
checks: [ "all" ]

stylecheck:
# Deprecated: use the global `run.go` instead.
go: "1.15"
# STxxxx checks in https://staticcheck.io/docs/configuration/options/#checks
# STxxxx checks in https://staticcheck.io/docs/checks/#ST
# Default: ["*"]
checks: [ "all", "-ST1000", "-ST1003", "-ST1016", "-ST1020", "-ST1021", "-ST1022" ]
# https://staticcheck.io/docs/configuration/options/#dot_import_whitelist
Expand Down
46 changes: 30 additions & 16 deletions pkg/config/linters_settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ type LintersSettings struct {
GoModDirectives GoModDirectivesSettings
Gomodguard GoModGuardSettings
Gosec GoSecSettings
Gosimple StaticCheckSettings
Gosimple StaticCheckGoSimpleSettings
Govet GovetSettings
Grouper GrouperSettings
Ifshort IfshortSettings
Expand Down Expand Up @@ -195,13 +195,12 @@ type LintersSettings struct {
RowsErrCheck RowsErrCheckSettings
Staticcheck StaticCheckSettings
Structcheck StructCheckSettings
Stylecheck StaticCheckSettings
Stylecheck StaticCheckStyleCheckSettings
Tagliatelle TagliatelleSettings
Tenv TenvSettings
Testpackage TestpackageSettings
Thelper ThelperSettings
Unparam UnparamSettings
Unused StaticCheckSettings
UseStdlibVars UseStdlibVarsSettings
Varcheck VarCheckSettings
Varnamelen VarnamelenSettings
Expand Down Expand Up @@ -386,11 +385,9 @@ type GoFmtRewriteRule struct {
}

type GofumptSettings struct {
ModulePath string `mapstructure:"module-path"`
ExtraRules bool `mapstructure:"extra-rules"`

// Deprecated: use the global `run.go` instead.
LangVersion string `mapstructure:"lang-version"`
LangVersion string `mapstructure:"-"`
ModulePath string `mapstructure:"module-path"`
ExtraRules bool `mapstructure:"extra-rules"`
}

type GoHeaderSettings struct {
Expand Down Expand Up @@ -625,17 +622,34 @@ type RowsErrCheckSettings struct {
}

type StaticCheckSettings struct {
// Deprecated: use the global `run.go` instead.
GoVersion string `mapstructure:"go"`
Go string `mapstructure:"-"`
Checks []string `mapstructure:"checks"`
}

func (s StaticCheckSettings) GoVersion() string {
return s.Go
}

func (s StaticCheckSettings) ChecksList() []string {
result := make([]string, len(s.Checks))
copy(result, s.Checks)
return result
}

type StaticCheckGoSimpleSettings struct {
StaticCheckSettings
}

Checks []string `mapstructure:"checks"`
Initialisms []string `mapstructure:"initialisms"` // only for stylecheck
DotImportWhitelist []string `mapstructure:"dot-import-whitelist"` // only for stylecheck
HTTPStatusCodeWhitelist []string `mapstructure:"http-status-code-whitelist"` // only for stylecheck
type StaticCheckStyleCheckSettings struct {
StaticCheckSettings
Initialisms []string `mapstructure:"initialisms"`
DotImportWhitelist []string `mapstructure:"dot-import-whitelist"`
HTTPStatusCodeWhitelist []string `mapstructure:"http-status-code-whitelist"`
}

func (s *StaticCheckSettings) HasConfiguration() bool {
return len(s.Initialisms) > 0 || len(s.HTTPStatusCodeWhitelist) > 0 || len(s.DotImportWhitelist) > 0 || len(s.Checks) > 0
type StaticCheckUnusedSettings struct {
StaticCheckSettings
Checks []string `mapstructure:"-"`
}

type StructCheckSettings struct {
Expand Down
3 changes: 1 addition & 2 deletions pkg/golinters/gosimple.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@ import (
"github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
)

func NewGosimple(settings *config.StaticCheckSettings) *goanalysis.Linter {
func NewGosimple(settings config.StaticCheckGoSimpleSettings) *goanalysis.Linter {
cfg := staticCheckConfig(settings)

analyzers := setupStaticCheckAnalyzers(simple.Analyzers, getGoVersion(settings), cfg.Checks)

return goanalysis.NewLinter(
Expand Down
2 changes: 1 addition & 1 deletion pkg/golinters/staticcheck.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
"github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
)

func NewStaticcheck(settings *config.StaticCheckSettings) *goanalysis.Linter {
func NewStaticcheck(settings config.StaticCheckSettings) *goanalysis.Linter {
cfg := staticCheckConfig(settings)
analyzers := setupStaticCheckAnalyzers(staticcheck.Analyzers, getGoVersion(settings), cfg.Checks)

Expand Down
32 changes: 9 additions & 23 deletions pkg/golinters/staticcheck_common.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,10 @@ import (

var debugf = logutils.Debug(logutils.DebugKeyMegacheck)

func getGoVersion(settings *config.StaticCheckSettings) string {
var goVersion string
if settings != nil {
goVersion = settings.GoVersion
}

if goVersion != "" {
func getGoVersion(versionable interface{ GoVersion() string }) string {
if goVersion := versionable.GoVersion(); goVersion != "" {
return goVersion
}

return "1.17"
}

Expand Down Expand Up @@ -54,23 +48,15 @@ func setAnalyzerGoVersion(a *analysis.Analyzer, goVersion string) {
}
}

func staticCheckConfig(settings *config.StaticCheckSettings) *scconfig.Config {
var cfg *scconfig.Config

if settings == nil || !settings.HasConfiguration() {
return &scconfig.Config{
Checks: []string{"*"}, // override for compatibility reason. Must drop in the next major version.
Initialisms: scconfig.DefaultConfig.Initialisms,
DotImportWhitelist: scconfig.DefaultConfig.DotImportWhitelist,
HTTPStatusCodeWhitelist: scconfig.DefaultConfig.HTTPStatusCodeWhitelist,
}
func staticCheckConfig(settings interface{ ChecksList() []string }) *scconfig.Config {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also I tried use generics, but the solution turned out to be less elegant

cfg := &scconfig.Config{
Checks: settings.ChecksList(),
}

cfg = &scconfig.Config{
Checks: settings.Checks,
Initialisms: settings.Initialisms,
DotImportWhitelist: settings.DotImportWhitelist,
HTTPStatusCodeWhitelist: settings.HTTPStatusCodeWhitelist,
if v, ok := settings.(config.StaticCheckStyleCheckSettings); ok {
cfg.Initialisms = v.Initialisms
cfg.DotImportWhitelist = v.DotImportWhitelist
cfg.HTTPStatusCodeWhitelist = v.HTTPStatusCodeWhitelist
}

if len(cfg.Checks) == 0 {
Expand Down
2 changes: 1 addition & 1 deletion pkg/golinters/stylecheck.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
"github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
)

func NewStylecheck(settings *config.StaticCheckSettings) *goanalysis.Linter {
func NewStylecheck(settings config.StaticCheckStyleCheckSettings) *goanalysis.Linter { //nolint:gocritic // hugeParam
cfg := staticCheckConfig(settings)

// `scconfig.Analyzer` is a singleton, then it's not possible to have more than one instance for all staticcheck "sub-linters".
Expand Down
2 changes: 1 addition & 1 deletion pkg/golinters/unused.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ type UnusedSettings struct {
GoVersion string
}

func NewUnused(settings *config.StaticCheckSettings) *goanalysis.Linter {
func NewUnused(settings config.StaticCheckUnusedSettings) *goanalysis.Linter {
var mu sync.Mutex
var resIssues []goanalysis.Issue

Expand Down
34 changes: 13 additions & 21 deletions pkg/lint/lintersdb/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
goModDirectivesCfg *config.GoModDirectivesSettings
gomodguardCfg *config.GoModGuardSettings
gosecCfg *config.GoSecSettings
gosimpleCfg *config.StaticCheckSettings
gosimpleCfg config.StaticCheckGoSimpleSettings
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it doesn't make sense to use pointers here (for other settings too).
Not big memory win, but code is complicated a lot

govetCfg *config.GovetSettings
grouperCfg *config.GrouperSettings
ifshortCfg *config.IfshortSettings
Expand All @@ -161,15 +161,15 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
reassignCfg *config.ReassignSettings
reviveCfg *config.ReviveSettings
rowserrcheckCfg *config.RowsErrCheckSettings
staticcheckCfg *config.StaticCheckSettings
staticcheckCfg config.StaticCheckSettings
structcheckCfg *config.StructCheckSettings
stylecheckCfg *config.StaticCheckSettings
stylecheckCfg config.StaticCheckStyleCheckSettings
tagliatelleCfg *config.TagliatelleSettings
tenvCfg *config.TenvSettings
testpackageCfg *config.TestpackageSettings
thelperCfg *config.ThelperSettings
unparamCfg *config.UnparamSettings
unusedCfg *config.StaticCheckSettings
unusedCfg config.StaticCheckUnusedSettings
usestdlibvars *config.UseStdlibVarsSettings
varcheckCfg *config.VarCheckSettings
varnamelenCfg *config.VarnamelenSettings
Expand Down Expand Up @@ -212,7 +212,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
goModDirectivesCfg = &m.cfg.LintersSettings.GoModDirectives
gomodguardCfg = &m.cfg.LintersSettings.Gomodguard
gosecCfg = &m.cfg.LintersSettings.Gosec
gosimpleCfg = &m.cfg.LintersSettings.Gosimple
gosimpleCfg = m.cfg.LintersSettings.Gosimple
govetCfg = &m.cfg.LintersSettings.Govet
grouperCfg = &m.cfg.LintersSettings.Grouper
ifshortCfg = &m.cfg.LintersSettings.Ifshort
Expand All @@ -239,15 +239,15 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
reassignCfg = &m.cfg.LintersSettings.Reassign
reviveCfg = &m.cfg.LintersSettings.Revive
rowserrcheckCfg = &m.cfg.LintersSettings.RowsErrCheck
staticcheckCfg = &m.cfg.LintersSettings.Staticcheck
staticcheckCfg = m.cfg.LintersSettings.Staticcheck
structcheckCfg = &m.cfg.LintersSettings.Structcheck
stylecheckCfg = &m.cfg.LintersSettings.Stylecheck
stylecheckCfg = m.cfg.LintersSettings.Stylecheck
tagliatelleCfg = &m.cfg.LintersSettings.Tagliatelle
tenvCfg = &m.cfg.LintersSettings.Tenv
testpackageCfg = &m.cfg.LintersSettings.Testpackage
thelperCfg = &m.cfg.LintersSettings.Thelper
unparamCfg = &m.cfg.LintersSettings.Unparam
unusedCfg = &m.cfg.LintersSettings.Unused
unusedCfg = config.StaticCheckUnusedSettings{}
varcheckCfg = &m.cfg.LintersSettings.Varcheck
varnamelenCfg = &m.cfg.LintersSettings.Varnamelen
whitespaceCfg = &m.cfg.LintersSettings.Whitespace
Expand All @@ -258,22 +258,14 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
govetCfg.Go = m.cfg.Run.Go
}

if gofumptCfg != nil && gofumptCfg.LangVersion == "" {
if gofumptCfg != nil {
gofumptCfg.LangVersion = m.cfg.Run.Go
}

if staticcheckCfg != nil && staticcheckCfg.GoVersion == "" {
staticcheckCfg.GoVersion = m.cfg.Run.Go
}
if gosimpleCfg != nil && gosimpleCfg.GoVersion == "" {
gosimpleCfg.GoVersion = m.cfg.Run.Go
}
if stylecheckCfg != nil && stylecheckCfg.GoVersion != "" {
stylecheckCfg.GoVersion = m.cfg.Run.Go
}
if unusedCfg != nil && unusedCfg.GoVersion == "" {
unusedCfg.GoVersion = m.cfg.Run.Go
}
gosimpleCfg.Go = m.cfg.Run.Go
staticcheckCfg.Go = m.cfg.Run.Go
stylecheckCfg.Go = m.cfg.Run.Go
unusedCfg.Go = m.cfg.Run.Go
}

const megacheckName = "megacheck"
Expand Down