feat: add reassign linter (#3064)

This commit is contained in:
Choko 2022-08-23 20:19:26 +09:00 committed by GitHub
parent 77962e9283
commit 58809c3bf5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 88 additions and 0 deletions

View File

@ -1225,6 +1225,13 @@ linters-settings:
- CamelCase
- UnitAbbreviations
reassign:
# Patterns for global variable names that are checked for reassignment.
# See https://github.com/curioswitch/go-reassign#usage
# Default: ["EOF", "Err.*"]
patterns:
- ".*"
revive:
# Maximum number of open files at the same time.
# See https://github.com/mgechev/revive#command-line-flags
@ -1951,6 +1958,7 @@ linters:
- prealloc
- predeclared
- promlinter
- reassign
- revive
- rowserrcheck
- scopelint
@ -2055,6 +2063,7 @@ linters:
- prealloc
- predeclared
- promlinter
- reassign
- revive
- rowserrcheck
- scopelint

1
go.mod
View File

@ -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.2
github.com/daixiang0/gci v0.6.3
github.com/denis-tingaikin/go-header v0.4.3
github.com/esimonov/ifshort v1.0.4

2
go.sum generated
View File

@ -103,6 +103,8 @@ github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnht
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/cristalhq/acmd v0.7.0/go.mod h1:LG5oa43pE/BbxtfMoImHCQN++0Su7dzipdgBjMCBVDQ=
github.com/curioswitch/go-reassign v0.1.2 h1:ekM07+z+VFT560Exz4mTv0/s1yU9gem6CJc/tlYpkmI=
github.com/curioswitch/go-reassign v0.1.2/go.mod h1:bFJIHgtTM3hRm2sKXSPkbwNjSFyGURQXyn4IXD2qwfQ=
github.com/daixiang0/gci v0.6.3 h1:wUAqXChk8HbwXn8AfxD9DYSCp9Bpz1L3e6Q4Roe+q9E=
github.com/daixiang0/gci v0.6.3/go.mod h1:EpVfrztufwVgQRXjnX4zuNinEpLj5OmMjtu/+MB0V0c=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=

View File

@ -168,6 +168,7 @@ type LintersSettings struct {
Prealloc PreallocSettings
Predeclared PredeclaredSettings
Promlinter PromlinterSettings
Reassign ReassignSettings
Revive ReviveSettings
RowsErrCheck RowsErrCheckSettings
Staticcheck StaticCheckSettings
@ -532,6 +533,10 @@ type PromlinterSettings struct {
DisabledLinters []string `mapstructure:"disabled-linters"`
}
type ReassignSettings struct {
Patterns []string `mapstructure:"patterns"`
}
type ReviveSettings struct {
MaxOpenFiles int `mapstructure:"max-open-files"`
IgnoreGeneratedHeader bool `mapstructure:"ignore-generated-header"`

32
pkg/golinters/reassign.go Normal file
View File

@ -0,0 +1,32 @@
package golinters
import (
"fmt"
"strings"
"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 && len(settings.Patterns) > 0 {
cfg = map[string]map[string]interface{}{
a.Name: {
reassign.FlagPattern: fmt.Sprintf("^(%s)$", strings.Join(settings.Patterns, "|")),
},
}
}
return goanalysis.NewLinter(
a.Name,
a.Doc,
[]*analysis.Analyzer{a},
cfg,
).WithLoadMode(goanalysis.LoadModeSyntax)
}

View File

@ -154,6 +154,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
@ -227,6 +228,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
@ -683,6 +685,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-reassign"),
linter.NewConfig(golinters.NewRevive(reviveCfg)).
WithSince("v1.37.0").
WithPresets(linter.PresetStyle, linter.PresetMetaLinter).

View File

@ -0,0 +1,5 @@
linters-settings:
reassign:
patterns:
- DefaultClient
- DefaultTransport

13
test/testdata/reassign.go vendored Normal file
View File

@ -0,0 +1,13 @@
//golangcitest:args -Ereassign
package testdata
import (
"io"
"net/http"
)
func reassignTest() {
http.DefaultClient = nil
http.DefaultTransport = nil
io.EOF = nil // want `reassigning variable EOF in other package io`
}

14
test/testdata/reassign_patterns.go vendored Normal file
View File

@ -0,0 +1,14 @@
//golangcitest:args -Ereassign
//golangcitest:config_path testdata/configs/reassign_patterns.yml
package testdata
import (
"io"
"net/http"
)
func reassignTestPatterns() {
http.DefaultClient = nil // want `reassigning variable DefaultClient in other package http`
http.DefaultTransport = nil // want `reassigning variable DefaultTransport in other package http`
io.EOF = nil
}