Skip to content

Commit 8674597

Browse files
ykadowakldez
andauthored
add linter zerologlint (#3726)
Co-authored-by: Fernandez Ludovic <[email protected]>
1 parent 5195575 commit 8674597

File tree

9 files changed

+141
-0
lines changed

9 files changed

+141
-0
lines changed

.golangci.reference.yml

+2
Original file line numberDiff line numberDiff line change
@@ -2173,6 +2173,7 @@ linters:
21732173
- whitespace
21742174
- wrapcheck
21752175
- wsl
2176+
- zerologlint
21762177

21772178
# Enable all available linters.
21782179
# Default: false
@@ -2285,6 +2286,7 @@ linters:
22852286
- whitespace
22862287
- wrapcheck
22872288
- wsl
2289+
- zerologlint
22882290

22892291
# Enable presets.
22902292
# https://golangci-lint.run/usage/linters

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ require (
111111
github.com/xen0n/gosmopolitan v1.2.1
112112
github.com/yagipy/maintidx v1.0.0
113113
github.com/yeya24/promlinter v0.2.0
114+
github.com/ykadowak/zerologlint v0.1.1
114115
gitlab.com/bosi/decorder v0.2.3
115116
golang.org/x/tools v0.8.0
116117
gopkg.in/yaml.v3 v3.0.1

go.sum

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

pkg/golinters/zerologlint.go

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package golinters
2+
3+
import (
4+
"github.com/ykadowak/zerologlint"
5+
"golang.org/x/tools/go/analysis"
6+
7+
"github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
8+
)
9+
10+
func NewZerologLint() *goanalysis.Linter {
11+
return goanalysis.NewLinter(
12+
"zerologlint",
13+
"Detects the wrong usage of `zerolog` that a user forgets to dispatch with `Send` or `Msg`.",
14+
[]*analysis.Analyzer{zerologlint.Analyzer},
15+
nil,
16+
).WithLoadMode(goanalysis.LoadModeTypesInfo)
17+
}

pkg/lint/lintersdb/manager.go

+6
Original file line numberDiff line numberDiff line change
@@ -890,6 +890,12 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
890890
WithSince("v1.26.0").
891891
WithPresets(linter.PresetStyle).
892892
WithURL("https://github.com/golangci/golangci-lint/blob/master/pkg/golinters/nolintlint/README.md"),
893+
894+
linter.NewConfig(golinters.NewZerologLint()).
895+
WithSince("v1.53.0").
896+
WithPresets(linter.PresetBugs).
897+
WithLoadForGoAnalysis().
898+
WithURL("https://github.com/ykadowak/zerologlint"),
893899
}
894900

895901
enabledByDefault := map[string]bool{

test/linters_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ func TestSourcesFromTestdataSubDir(t *testing.T) {
3131
subDirs := []string{
3232
"loggercheck",
3333
"ginkgolinter",
34+
"zerologlint",
3435
}
3536

3637
for _, dir := range subDirs {

test/testdata/zerologlint/go.mod

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module zerologlint
2+
3+
go 1.19
4+
5+
require (
6+
github.com/rs/zerolog v1.29.1
7+
golang.org/x/exp v0.0.0-20230321023759-10a507213a29
8+
)
9+
10+
require (
11+
github.com/mattn/go-colorable v0.1.13 // indirect
12+
github.com/mattn/go-isatty v0.0.18 // indirect
13+
golang.org/x/sys v0.7.0 // indirect
14+
)

test/testdata/zerologlint/go.sum

+21
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
//golangcitest:args -Ezerologlint
2+
package zerologlint
3+
4+
import (
5+
"fmt"
6+
7+
"github.com/rs/zerolog"
8+
"github.com/rs/zerolog/log"
9+
"golang.org/x/exp/slices"
10+
)
11+
12+
func expectWarnings() {
13+
log.Error() // want "must be dispatched by Msg or Send method"
14+
log.Info() // want "must be dispatched by Msg or Send method"
15+
log.Fatal() // want "must be dispatched by Msg or Send method"
16+
log.Debug() // want "must be dispatched by Msg or Send method"
17+
log.Warn() // want "must be dispatched by Msg or Send method"
18+
19+
err := fmt.Errorf("foobarerror")
20+
log.Error().Err(err) // want "must be dispatched by Msg or Send method"
21+
log.Error().Err(err).Str("foo", "bar").Int("foo", 1) // want "must be dispatched by Msg or Send method"
22+
23+
logger := log.Error() // want "must be dispatched by Msg or Send method"
24+
logger.Err(err).Str("foo", "bar").Int("foo", 1)
25+
26+
// include zerolog.Dict()
27+
log.Info(). // want "must be dispatched by Msg or Send method"
28+
Str("foo", "bar").
29+
Dict("dict", zerolog.Dict().
30+
Str("bar", "baz").
31+
Int("n", 1),
32+
)
33+
34+
// conditional
35+
logger2 := log.Info() // want "must be dispatched by Msg or Send method"
36+
if err != nil {
37+
logger2 = log.Error() // want "must be dispatched by Msg or Send method"
38+
}
39+
logger2.Str("foo", "bar")
40+
}
41+
42+
func expectNoWarnings() {
43+
log.Fatal().Send()
44+
log.Panic().Msg("")
45+
log.Debug().Send()
46+
log.Info().Msg("")
47+
log.Warn().Send()
48+
log.Error().Msg("")
49+
50+
log.Error().Str("foo", "bar").Send()
51+
err := fmt.Errorf("foobarerror")
52+
log.Error().Err(err).Str("foo", "bar").Int("foo", 1).Msg("")
53+
54+
logger := log.Error()
55+
logger.Send()
56+
57+
// include zerolog.Dict()
58+
log.Info().
59+
Str("foo", "bar").
60+
Dict("dict", zerolog.Dict().
61+
Str("bar", "baz").
62+
Int("n", 1),
63+
).Send()
64+
65+
// conditional
66+
logger2 := log.Info()
67+
if err != nil {
68+
logger2 = log.Error()
69+
}
70+
logger2.Send()
71+
}
72+
73+
// https://github.com/ykadowak/zerologlint/pull/2
74+
func packageNil() {
75+
s := []int{1, 2, 3}
76+
slices.Sort(s)
77+
}

0 commit comments

Comments
 (0)