Skip to content

Commit bd60511

Browse files
committed
feat: add zero linter
Implements golangci#3491.
1 parent abe878d commit bd60511

File tree

6 files changed

+64
-0
lines changed

6 files changed

+64
-0
lines changed

.golangci.reference.yml

+2
Original file line numberDiff line numberDiff line change
@@ -2096,6 +2096,7 @@ linters:
20962096
- whitespace
20972097
- wrapcheck
20982098
- wsl
2099+
- zero
20992100

21002101
# Enable all available linters.
21012102
# Default: false
@@ -2206,6 +2207,7 @@ linters:
22062207
- whitespace
22072208
- wrapcheck
22082209
- wsl
2210+
- zero
22092211

22102212
# Enable presets.
22112213
# https://golangci-lint.run/usage/linters

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ require (
4545
github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8
4646
github.com/gostaticanalysis/forcetypeassert v0.1.0
4747
github.com/gostaticanalysis/nilerr v0.1.1
48+
github.com/gostaticanalysis/zero v0.1.0
4849
github.com/hashicorp/go-multierror v1.1.1
4950
github.com/hashicorp/go-version v1.6.0
5051
github.com/hexops/gotextdiff v1.0.3

go.sum

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

pkg/golinters/zero.go

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package golinters
2+
3+
import (
4+
"github.com/gostaticanalysis/zero"
5+
"golang.org/x/tools/go/analysis"
6+
7+
"github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
8+
)
9+
10+
func NewZero() *goanalysis.Linter {
11+
a := zero.Analyzer
12+
13+
return goanalysis.NewLinter(
14+
a.Name,
15+
a.Doc,
16+
[]*analysis.Analyzer{a},
17+
nil,
18+
).WithLoadMode(goanalysis.LoadModeTypesInfo)
19+
}

pkg/lint/lintersdb/manager.go

+5
Original file line numberDiff line numberDiff line change
@@ -872,6 +872,11 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
872872
WithPresets(linter.PresetStyle).
873873
WithURL("https://github.com/bombsimon/wsl"),
874874

875+
linter.NewConfig(golinters.NewZero()).
876+
WithSince("v1.51.0").
877+
WithPresets(linter.PresetBugs).
878+
WithURL("https://github.com/gostaticanalysis/zero"),
879+
875880
// nolintlint must be last because it looks at the results of all the previous linters for unused nolint directives
876881
linter.NewConfig(golinters.NewNoLintLint(noLintLintCfg)).
877882
WithSince("v1.26.0").

test/testdata/zero.go

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//golangcitest:args -Ezero
2+
package testdata
3+
4+
var _ string = "" // want "shoud not assign zero value"
5+
6+
func _() {
7+
n := 0 // want "shoud not assign zero value"
8+
_ = n
9+
10+
var _ []int = nil // want "shoud not assign zero value"
11+
var _ []int = []int{} // OK
12+
m := int32(0) // OK
13+
_ = m
14+
var _ *int = nil // want "shoud not assign zero value"
15+
var _ struct{} = struct{}{} // want "shoud not assign zero value"
16+
var _, _ int // OK
17+
var _, _ int = 0, 1 // want "shoud not assign zero value"
18+
var _, _ int = 1, 2 // OK
19+
var _, _ int = 1 - 1, 2 - 2 // want "shoud not assign zero value"
20+
var _ bool = false // want "shoud not assign zero value"
21+
var _ bool = true // OK
22+
23+
type T struct{ N int }
24+
var _ T = T{} // want "shoud not assign zero value"
25+
26+
{
27+
n, _ := func() (int, int) { return 0, 0 }() // OK
28+
_ = n
29+
}
30+
31+
{
32+
var n, _ = func() (int, int) { return 0, 0 }() // OK
33+
_ = n
34+
}
35+
}

0 commit comments

Comments
 (0)