Skip to content

Commit 4330264

Browse files
committed
feat: change defer linter to nakedefer
1 parent 1682dfb commit 4330264

File tree

10 files changed

+157
-87
lines changed

10 files changed

+157
-87
lines changed

Diff for: .golangci.reference.yml

+8
Original file line numberDiff line numberDiff line change
@@ -1190,6 +1190,14 @@ linters-settings:
11901190
ignore-words:
11911191
- someword
11921192

1193+
nakedefer:
1194+
# List of regular expressions to exclude function names from check.
1195+
# Default: []
1196+
exclude:
1197+
- 'os\.(Create|WriteFile|Chmod)'
1198+
- 'fmt\.Print.*'
1199+
- "io\.Close"
1200+
11931201
nakedret:
11941202
# Make an issue if func has more lines of code than this setting, and it has naked returns.
11951203
# Default: 30

Diff for: go.mod

+4-4
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ require (
99
github.com/Antonboom/nilnil v0.1.1
1010
github.com/BurntSushi/toml v1.2.0
1111
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24
12-
github.com/GaijinEntertainment/go-defer v1.3.0
1312
github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0
13+
github.com/GaijinEntertainment/go-nakedefer v1.4.0
1414
github.com/OpenPeeDeeP/depguard v1.1.1
1515
github.com/alexkohler/prealloc v1.0.0
1616
github.com/alingse/asasalint v0.0.11
@@ -108,7 +108,7 @@ require (
108108
github.com/yagipy/maintidx v1.0.0
109109
github.com/yeya24/promlinter v0.2.0
110110
gitlab.com/bosi/decorder v0.2.3
111-
golang.org/x/tools v0.1.12
111+
golang.org/x/tools v0.2.0
112112
gopkg.in/yaml.v3 v3.0.1
113113
honnef.co/go/tools v0.3.3
114114
mvdan.cc/gofumpt v0.4.0
@@ -178,9 +178,9 @@ require (
178178
go.uber.org/zap v1.17.0 // indirect
179179
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect
180180
golang.org/x/exp/typeparams v0.0.0-20220827204233-334a2380cb91 // indirect
181-
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
181+
golang.org/x/mod v0.6.0 // indirect
182182
golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde // indirect
183-
golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41 // indirect
183+
golang.org/x/sys v0.1.0 // indirect
184184
golang.org/x/text v0.3.7 // indirect
185185
google.golang.org/protobuf v1.28.0 // indirect
186186
gopkg.in/ini.v1 v1.67.0 // indirect

Diff for: go.sum

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

Diff for: pkg/config/linters_settings.go

+5
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ type LintersSettings struct {
178178
Makezero MakezeroSettings
179179
Maligned MalignedSettings
180180
Misspell MisspellSettings
181+
Nakedefer NakedeferSettings
181182
Nakedret NakedretSettings
182183
Nestif NestifSettings
183184
NilNil NilNilSettings
@@ -530,6 +531,10 @@ type MisspellSettings struct {
530531
IgnoreWords []string `mapstructure:"ignore-words"`
531532
}
532533

534+
type NakedeferSettings struct {
535+
Exclude []string `mapstructure:"exclude"`
536+
}
537+
533538
type NakedretSettings struct {
534539
MaxFuncLines int `mapstructure:"max-func-lines"`
535540
}

Diff for: pkg/golinters/defer.go

-22
This file was deleted.

Diff for: pkg/golinters/nakedefer.go

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package golinters
2+
3+
import (
4+
"github.com/GaijinEntertainment/go-nakedefer/pkg/analyzer"
5+
"golang.org/x/tools/go/analysis"
6+
7+
"github.com/golangci/golangci-lint/pkg/config"
8+
"github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
9+
)
10+
11+
func NewNakedefer(settings *config.NakedeferSettings) *goanalysis.Linter {
12+
var exclude []string
13+
14+
if settings != nil {
15+
exclude = settings.Exclude
16+
}
17+
18+
a, err := analyzer.NewAnalyzer(exclude)
19+
if err != nil {
20+
linterLogger.Fatalf("nakedefer configuration: %v", err)
21+
}
22+
23+
return goanalysis.NewLinter(
24+
a.Name,
25+
a.Doc,
26+
[]*analysis.Analyzer{a},
27+
nil,
28+
).WithLoadMode(goanalysis.LoadModeTypesInfo)
29+
}

Diff for: pkg/lint/lintersdb/manager.go

+8-6
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
146146
makezeroCfg *config.MakezeroSettings
147147
malignedCfg *config.MalignedSettings
148148
misspellCfg *config.MisspellSettings
149+
nakedeferCfg *config.NakedeferSettings
149150
nakedretCfg *config.NakedretSettings
150151
nestifCfg *config.NestifSettings
151152
nilNilCfg *config.NilNilSettings
@@ -222,6 +223,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
222223
makezeroCfg = &m.cfg.LintersSettings.Makezero
223224
malignedCfg = &m.cfg.LintersSettings.Maligned
224225
misspellCfg = &m.cfg.LintersSettings.Misspell
226+
nakedeferCfg = &m.cfg.LintersSettings.Nakedefer
225227
nakedretCfg = &m.cfg.LintersSettings.Nakedret
226228
nestifCfg = &m.cfg.LintersSettings.Nestif
227229
nilNilCfg = &m.cfg.LintersSettings.NilNil
@@ -404,12 +406,6 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
404406
WithLoadForGoAnalysis().
405407
WithURL("https://github.com/GaijinEntertainment/go-exhaustruct"),
406408

407-
linter.NewConfig(golinters.NewDefer()).
408-
WithSince("v1.51.0").
409-
WithPresets(linter.PresetStyle).
410-
WithLoadForGoAnalysis().
411-
WithURL("https://github.com/GaijinEntertainment/go-defer"),
412-
413409
linter.NewConfig(golinters.NewExportLoopRef()).
414410
WithSince("v1.28.0").
415411
WithPresets(linter.PresetBugs).
@@ -630,6 +626,12 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
630626
WithAutoFix().
631627
WithURL("https://github.com/client9/misspell"),
632628

629+
linter.NewConfig(golinters.NewNakedefer(nakedeferCfg)).
630+
WithSince("v1.51.0").
631+
WithPresets(linter.PresetStyle).
632+
WithLoadForGoAnalysis().
633+
WithURL("https://github.com/GaijinEntertainment/go-nakedefer"),
634+
633635
linter.NewConfig(golinters.NewNakedret(nakedretCfg)).
634636
WithSince("v1.19.0").
635637
WithPresets(linter.PresetStyle).

Diff for: test/testdata/configs/nakedefer.yml

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
linters-settings:
2+
nakedefer:
3+
exclude: ignoreFunc,os\.(Create|WriteFile|Chmod),fmt\.Print.*,io\.Close

Diff for: test/testdata/defer.go

-48
This file was deleted.

Diff for: test/testdata/nakedefer.go

+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
// golangcitest:args -Enakedefer
2+
// golangcitest:config_path: testdata/configs/nakedefer.yml
3+
package testdata
4+
5+
import (
6+
"bytes"
7+
"errors"
8+
"fmt"
9+
"io"
10+
"net/http"
11+
"net/http/httptest"
12+
"os"
13+
)
14+
15+
func funcNotReturnAnyType() {
16+
}
17+
18+
func funcReturnErr() error {
19+
return errors.New("some error")
20+
}
21+
22+
func funcReturnFuncAndErr() (func(), error) {
23+
return func() {
24+
}, nil
25+
}
26+
27+
func ignoreFunc() error {
28+
return errors.New("some error")
29+
}
30+
31+
func testCaseValid1() {
32+
defer funcNotReturnAnyType() // ignore
33+
34+
defer func() { //ignore
35+
funcNotReturnAnyType()
36+
}()
37+
38+
defer func() { //ignore
39+
_ = funcReturnErr()
40+
}()
41+
}
42+
43+
func testCaseInvalid1() {
44+
defer funcReturnErr() // want "deferred call should not return anything"
45+
46+
defer funcReturnFuncAndErr() // want "deferred call should not return anything"
47+
48+
defer func() error { // want "deferred call should not return anything"
49+
return nil
50+
}()
51+
52+
defer func() func() { // want "deferred call should not return anything"
53+
return func() {}
54+
}()
55+
}
56+
57+
func testCase1() {
58+
defer fmt.Errorf("some text") // want "deferred call should not return anything"
59+
60+
r := new(bytes.Buffer)
61+
defer io.LimitReader(r, 1) // want "deferred call should not return anything"
62+
63+
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
64+
w.WriteHeader(http.StatusOK)
65+
_, _ = w.Write([]byte("DONE"))
66+
}))
67+
defer srv.Close() // ignore
68+
defer srv.CloseClientConnections() // ignore
69+
defer srv.Certificate() // want "deferred call should not return anything"
70+
}
71+
72+
func testCaseExclude1() {
73+
// exclude ignoreFunc
74+
defer ignoreFunc() // ignore
75+
}
76+
77+
func testCaseExclude2() {
78+
// exclude os\.(Create|WriteFile|Chmod)
79+
defer os.Create("file_test1") // ignore
80+
defer os.WriteFile("file_test2", []byte("data"), os.ModeAppend) // ignore
81+
defer os.Chmod("file_test3", os.ModeAppend) // ignore
82+
defer os.FindProcess(100500) // want "deferred call should not return anything"
83+
}
84+
85+
func testCaseExclude3() {
86+
// exclude fmt\.Print.*
87+
defer fmt.Println("e1") // ignore
88+
defer fmt.Print("e1") // ignore
89+
defer fmt.Printf("e1") // ignore
90+
defer fmt.Sprintf("some text") // want "deferred call should not return anything"
91+
}

0 commit comments

Comments
 (0)