From b0a752ff213042b112da225602de4d23be143d8a Mon Sep 17 00:00:00 2001 From: Choko Date: Fri, 5 Aug 2022 14:24:04 +0900 Subject: [PATCH] feat: add reassign linter --- .golangci.reference.yml | 7 +++++++ go.mod | 1 + go.sum | 2 ++ pkg/config/linters_settings.go | 5 +++++ pkg/golinters/reassign.go | 29 +++++++++++++++++++++++++++++ pkg/lint/lintersdb/manager.go | 7 +++++++ test/testdata/reassign.go | 8 ++++++++ 7 files changed, 59 insertions(+) create mode 100644 pkg/golinters/reassign.go create mode 100644 test/testdata/reassign.go diff --git a/.golangci.reference.yml b/.golangci.reference.yml index ab044ff71188..2060b05cb791 100644 --- a/.golangci.reference.yml +++ b/.golangci.reference.yml @@ -1221,6 +1221,12 @@ linters-settings: - CamelCase - UnitAbbreviations + reassign: + # Pattern for variables that are checked for reassignment. + # See https://github.com/curioswitch/go-reassign#usage + # Defaults to "^(EOF|Err.*)$" + pattern: ".*" + revive: # Maximum number of open files at the same time. # See https://github.com/mgechev/revive#command-line-flags @@ -1941,6 +1947,7 @@ linters: - prealloc - predeclared - promlinter + - reassign - revive - rowserrcheck - scopelint diff --git a/go.mod b/go.mod index 0e4ffe3e2eed..fac541c213cf 100644 --- a/go.mod +++ b/go.mod @@ -21,6 +21,7 @@ require ( github.com/breml/errchkjson v0.3.0 github.com/butuzov/ireturn v0.1.1 github.com/charithe/durationcheck v0.0.9 + github.com/curioswitch/go-reassign v0.1.0 github.com/daixiang0/gci v0.6.2 github.com/denis-tingaikin/go-header v0.4.3 github.com/esimonov/ifshort v1.0.4 diff --git a/go.sum b/go.sum index bb8620a1d8f4..b0489f873de5 100644 --- a/go.sum +++ b/go.sum @@ -132,6 +132,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsr github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/curioswitch/go-reassign v0.1.0 h1:QqQPBacVyFcBS/JNgHH2uGEeYMaYjNL4VEU8Nf6wX8k= +github.com/curioswitch/go-reassign v0.1.0/go.mod h1:e1Q0bnQMllWps7BLwuApSjKpJ+p7Xxa01rwgJBTRKF0= github.com/daixiang0/gci v0.6.2 h1:TXCP5RqjE/UupXO+p33MEhqdv7QxjKGw5MVkt9ATiMs= github.com/daixiang0/gci v0.6.2/go.mod h1:EpVfrztufwVgQRXjnX4zuNinEpLj5OmMjtu/+MB0V0c= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/pkg/config/linters_settings.go b/pkg/config/linters_settings.go index 3c356b40eff5..d70598329dd5 100644 --- a/pkg/config/linters_settings.go +++ b/pkg/config/linters_settings.go @@ -167,6 +167,7 @@ type LintersSettings struct { Prealloc PreallocSettings Predeclared PredeclaredSettings Promlinter PromlinterSettings + Reassign ReassignSettings Revive ReviveSettings RowsErrCheck RowsErrCheckSettings Staticcheck StaticCheckSettings @@ -517,6 +518,10 @@ type PromlinterSettings struct { DisabledLinters []string `mapstructure:"disabled-linters"` } +type ReassignSettings struct { + Pattern string `mapstructure:"pattern"` +} + type ReviveSettings struct { MaxOpenFiles int `mapstructure:"max-open-files"` IgnoreGeneratedHeader bool `mapstructure:"ignore-generated-header"` diff --git a/pkg/golinters/reassign.go b/pkg/golinters/reassign.go new file mode 100644 index 000000000000..b8a4c1c60cf8 --- /dev/null +++ b/pkg/golinters/reassign.go @@ -0,0 +1,29 @@ +package golinters + +import ( + "github.com/curioswitch/go-reassign" + "golang.org/x/tools/go/analysis" + + "github.com/golangci/golangci-lint/pkg/config" + "github.com/golangci/golangci-lint/pkg/golinters/goanalysis" +) + +func NewReassign(settings *config.ReassignSettings) *goanalysis.Linter { + a := reassign.NewAnalyzer() + + var cfg map[string]map[string]interface{} + if settings != nil { + cfg = map[string]map[string]interface{}{ + a.Name: { + reassign.FlagPattern: settings.Pattern, + }, + } + } + + return goanalysis.NewLinter( + a.Name, + a.Doc, + []*analysis.Analyzer{a}, + cfg, + ).WithLoadMode(goanalysis.LoadModeSyntax) +} diff --git a/pkg/lint/lintersdb/manager.go b/pkg/lint/lintersdb/manager.go index 755dfdebe149..c5f0d3055741 100644 --- a/pkg/lint/lintersdb/manager.go +++ b/pkg/lint/lintersdb/manager.go @@ -153,6 +153,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config { preallocCfg *config.PreallocSettings predeclaredCfg *config.PredeclaredSettings promlinterCfg *config.PromlinterSettings + reassignCfg *config.ReassignSettings reviveCfg *config.ReviveSettings rowserrcheckCfg *config.RowsErrCheckSettings staticcheckCfg *config.StaticCheckSettings @@ -225,6 +226,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config { parallelTestCfg = &m.cfg.LintersSettings.ParallelTest predeclaredCfg = &m.cfg.LintersSettings.Predeclared promlinterCfg = &m.cfg.LintersSettings.Promlinter + reassignCfg = &m.cfg.LintersSettings.Reassign reviveCfg = &m.cfg.LintersSettings.Revive rowserrcheckCfg = &m.cfg.LintersSettings.RowsErrCheck staticcheckCfg = &m.cfg.LintersSettings.Staticcheck @@ -668,6 +670,11 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config { WithPresets(linter.PresetStyle). WithURL("https://github.com/yeya24/promlinter"), + linter.NewConfig(golinters.NewReassign(reassignCfg)). + WithSince("1.49.0"). + WithPresets(linter.PresetBugs). + WithURL("https://github.com/curioswitch/go-noreassign"), + linter.NewConfig(golinters.NewRevive(reviveCfg)). WithSince("v1.37.0"). WithPresets(linter.PresetStyle, linter.PresetMetaLinter). diff --git a/test/testdata/reassign.go b/test/testdata/reassign.go new file mode 100644 index 000000000000..cdb4550a93ac --- /dev/null +++ b/test/testdata/reassign.go @@ -0,0 +1,8 @@ +//golangcitest:args -Ereassign +package testdata + +import "io" + +func breakIO() { + io.EOF = nil // ERROR `reassigning variable EOF in other package io` +}