Skip to content

Commit 58809c3

Browse files
authored
feat: add reassign linter (#3064)
1 parent 77962e9 commit 58809c3

File tree

9 files changed

+88
-0
lines changed

9 files changed

+88
-0
lines changed

.golangci.reference.yml

+9
Original file line numberDiff line numberDiff line change
@@ -1225,6 +1225,13 @@ linters-settings:
12251225
- CamelCase
12261226
- UnitAbbreviations
12271227

1228+
reassign:
1229+
# Patterns for global variable names that are checked for reassignment.
1230+
# See https://github.com/curioswitch/go-reassign#usage
1231+
# Default: ["EOF", "Err.*"]
1232+
patterns:
1233+
- ".*"
1234+
12281235
revive:
12291236
# Maximum number of open files at the same time.
12301237
# See https://github.com/mgechev/revive#command-line-flags
@@ -1951,6 +1958,7 @@ linters:
19511958
- prealloc
19521959
- predeclared
19531960
- promlinter
1961+
- reassign
19541962
- revive
19551963
- rowserrcheck
19561964
- scopelint
@@ -2055,6 +2063,7 @@ linters:
20552063
- prealloc
20562064
- predeclared
20572065
- promlinter
2066+
- reassign
20582067
- revive
20592068
- rowserrcheck
20602069
- scopelint

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ require (
2121
github.com/breml/errchkjson v0.3.0
2222
github.com/butuzov/ireturn v0.1.1
2323
github.com/charithe/durationcheck v0.0.9
24+
github.com/curioswitch/go-reassign v0.1.2
2425
github.com/daixiang0/gci v0.6.3
2526
github.com/denis-tingaikin/go-header v0.4.3
2627
github.com/esimonov/ifshort v1.0.4

go.sum

+2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/config/linters_settings.go

+5
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ type LintersSettings struct {
168168
Prealloc PreallocSettings
169169
Predeclared PredeclaredSettings
170170
Promlinter PromlinterSettings
171+
Reassign ReassignSettings
171172
Revive ReviveSettings
172173
RowsErrCheck RowsErrCheckSettings
173174
Staticcheck StaticCheckSettings
@@ -532,6 +533,10 @@ type PromlinterSettings struct {
532533
DisabledLinters []string `mapstructure:"disabled-linters"`
533534
}
534535

536+
type ReassignSettings struct {
537+
Patterns []string `mapstructure:"patterns"`
538+
}
539+
535540
type ReviveSettings struct {
536541
MaxOpenFiles int `mapstructure:"max-open-files"`
537542
IgnoreGeneratedHeader bool `mapstructure:"ignore-generated-header"`

pkg/golinters/reassign.go

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package golinters
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
7+
"github.com/curioswitch/go-reassign"
8+
"golang.org/x/tools/go/analysis"
9+
10+
"github.com/golangci/golangci-lint/pkg/config"
11+
"github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
12+
)
13+
14+
func NewReassign(settings *config.ReassignSettings) *goanalysis.Linter {
15+
a := reassign.NewAnalyzer()
16+
17+
var cfg map[string]map[string]interface{}
18+
if settings != nil && len(settings.Patterns) > 0 {
19+
cfg = map[string]map[string]interface{}{
20+
a.Name: {
21+
reassign.FlagPattern: fmt.Sprintf("^(%s)$", strings.Join(settings.Patterns, "|")),
22+
},
23+
}
24+
}
25+
26+
return goanalysis.NewLinter(
27+
a.Name,
28+
a.Doc,
29+
[]*analysis.Analyzer{a},
30+
cfg,
31+
).WithLoadMode(goanalysis.LoadModeSyntax)
32+
}

pkg/lint/lintersdb/manager.go

+7
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
154154
preallocCfg *config.PreallocSettings
155155
predeclaredCfg *config.PredeclaredSettings
156156
promlinterCfg *config.PromlinterSettings
157+
reassignCfg *config.ReassignSettings
157158
reviveCfg *config.ReviveSettings
158159
rowserrcheckCfg *config.RowsErrCheckSettings
159160
staticcheckCfg *config.StaticCheckSettings
@@ -227,6 +228,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
227228
parallelTestCfg = &m.cfg.LintersSettings.ParallelTest
228229
predeclaredCfg = &m.cfg.LintersSettings.Predeclared
229230
promlinterCfg = &m.cfg.LintersSettings.Promlinter
231+
reassignCfg = &m.cfg.LintersSettings.Reassign
230232
reviveCfg = &m.cfg.LintersSettings.Revive
231233
rowserrcheckCfg = &m.cfg.LintersSettings.RowsErrCheck
232234
staticcheckCfg = &m.cfg.LintersSettings.Staticcheck
@@ -683,6 +685,11 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
683685
WithPresets(linter.PresetStyle).
684686
WithURL("https://github.com/yeya24/promlinter"),
685687

688+
linter.NewConfig(golinters.NewReassign(reassignCfg)).
689+
WithSince("1.49.0").
690+
WithPresets(linter.PresetBugs).
691+
WithURL("https://github.com/curioswitch/go-reassign"),
692+
686693
linter.NewConfig(golinters.NewRevive(reviveCfg)).
687694
WithSince("v1.37.0").
688695
WithPresets(linter.PresetStyle, linter.PresetMetaLinter).
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
linters-settings:
2+
reassign:
3+
patterns:
4+
- DefaultClient
5+
- DefaultTransport

test/testdata/reassign.go

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//golangcitest:args -Ereassign
2+
package testdata
3+
4+
import (
5+
"io"
6+
"net/http"
7+
)
8+
9+
func reassignTest() {
10+
http.DefaultClient = nil
11+
http.DefaultTransport = nil
12+
io.EOF = nil // want `reassigning variable EOF in other package io`
13+
}

test/testdata/reassign_patterns.go

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
//golangcitest:args -Ereassign
2+
//golangcitest:config_path testdata/configs/reassign_patterns.yml
3+
package testdata
4+
5+
import (
6+
"io"
7+
"net/http"
8+
)
9+
10+
func reassignTestPatterns() {
11+
http.DefaultClient = nil // want `reassigning variable DefaultClient in other package http`
12+
http.DefaultTransport = nil // want `reassigning variable DefaultTransport in other package http`
13+
io.EOF = nil
14+
}

0 commit comments

Comments
 (0)