Skip to content

Commit

Permalink
feat: change defer linter to nakedefer
Browse files Browse the repository at this point in the history
  • Loading branch information
rawen17 committed Oct 24, 2022
1 parent 1682dfb commit 4330264
Show file tree
Hide file tree
Showing 10 changed files with 157 additions and 87 deletions.
8 changes: 8 additions & 0 deletions .golangci.reference.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1190,6 +1190,14 @@ linters-settings:
ignore-words:
- someword

nakedefer:
# List of regular expressions to exclude function names from check.
# Default: []
exclude:
- 'os\.(Create|WriteFile|Chmod)'
- 'fmt\.Print.*'
- "io\.Close"

nakedret:
# Make an issue if func has more lines of code than this setting, and it has naked returns.
# Default: 30
Expand Down
8 changes: 4 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ require (
github.com/Antonboom/nilnil v0.1.1
github.com/BurntSushi/toml v1.2.0
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24
github.com/GaijinEntertainment/go-defer v1.3.0
github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0
github.com/GaijinEntertainment/go-nakedefer v1.4.0
github.com/OpenPeeDeeP/depguard v1.1.1
github.com/alexkohler/prealloc v1.0.0
github.com/alingse/asasalint v0.0.11
Expand Down Expand Up @@ -108,7 +108,7 @@ require (
github.com/yagipy/maintidx v1.0.0
github.com/yeya24/promlinter v0.2.0
gitlab.com/bosi/decorder v0.2.3
golang.org/x/tools v0.1.12
golang.org/x/tools v0.2.0
gopkg.in/yaml.v3 v3.0.1
honnef.co/go/tools v0.3.3
mvdan.cc/gofumpt v0.4.0
Expand Down Expand Up @@ -178,9 +178,9 @@ require (
go.uber.org/zap v1.17.0 // indirect
golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect
golang.org/x/exp/typeparams v0.0.0-20220827204233-334a2380cb91 // indirect
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
golang.org/x/mod v0.6.0 // indirect
golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde // indirect
golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41 // indirect
golang.org/x/sys v0.1.0 // indirect
golang.org/x/text v0.3.7 // indirect
google.golang.org/protobuf v1.28.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
Expand Down
16 changes: 9 additions & 7 deletions go.sum

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions pkg/config/linters_settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ type LintersSettings struct {
Makezero MakezeroSettings
Maligned MalignedSettings
Misspell MisspellSettings
Nakedefer NakedeferSettings
Nakedret NakedretSettings
Nestif NestifSettings
NilNil NilNilSettings
Expand Down Expand Up @@ -530,6 +531,10 @@ type MisspellSettings struct {
IgnoreWords []string `mapstructure:"ignore-words"`
}

type NakedeferSettings struct {
Exclude []string `mapstructure:"exclude"`
}

type NakedretSettings struct {
MaxFuncLines int `mapstructure:"max-func-lines"`
}
Expand Down
22 changes: 0 additions & 22 deletions pkg/golinters/defer.go

This file was deleted.

29 changes: 29 additions & 0 deletions pkg/golinters/nakedefer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package golinters

import (
"github.com/GaijinEntertainment/go-nakedefer/pkg/analyzer"
"golang.org/x/tools/go/analysis"

"github.com/golangci/golangci-lint/pkg/config"
"github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
)

func NewNakedefer(settings *config.NakedeferSettings) *goanalysis.Linter {
var exclude []string

if settings != nil {
exclude = settings.Exclude
}

a, err := analyzer.NewAnalyzer(exclude)
if err != nil {
linterLogger.Fatalf("nakedefer configuration: %v", err)
}

return goanalysis.NewLinter(
a.Name,
a.Doc,
[]*analysis.Analyzer{a},
nil,
).WithLoadMode(goanalysis.LoadModeTypesInfo)
}
14 changes: 8 additions & 6 deletions pkg/lint/lintersdb/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
makezeroCfg *config.MakezeroSettings
malignedCfg *config.MalignedSettings
misspellCfg *config.MisspellSettings
nakedeferCfg *config.NakedeferSettings
nakedretCfg *config.NakedretSettings
nestifCfg *config.NestifSettings
nilNilCfg *config.NilNilSettings
Expand Down Expand Up @@ -222,6 +223,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
makezeroCfg = &m.cfg.LintersSettings.Makezero
malignedCfg = &m.cfg.LintersSettings.Maligned
misspellCfg = &m.cfg.LintersSettings.Misspell
nakedeferCfg = &m.cfg.LintersSettings.Nakedefer
nakedretCfg = &m.cfg.LintersSettings.Nakedret
nestifCfg = &m.cfg.LintersSettings.Nestif
nilNilCfg = &m.cfg.LintersSettings.NilNil
Expand Down Expand Up @@ -404,12 +406,6 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
WithLoadForGoAnalysis().
WithURL("https://github.com/GaijinEntertainment/go-exhaustruct"),

linter.NewConfig(golinters.NewDefer()).
WithSince("v1.51.0").
WithPresets(linter.PresetStyle).
WithLoadForGoAnalysis().
WithURL("https://github.com/GaijinEntertainment/go-defer"),

linter.NewConfig(golinters.NewExportLoopRef()).
WithSince("v1.28.0").
WithPresets(linter.PresetBugs).
Expand Down Expand Up @@ -630,6 +626,12 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
WithAutoFix().
WithURL("https://github.com/client9/misspell"),

linter.NewConfig(golinters.NewNakedefer(nakedeferCfg)).
WithSince("v1.51.0").
WithPresets(linter.PresetStyle).
WithLoadForGoAnalysis().
WithURL("https://github.com/GaijinEntertainment/go-nakedefer"),

linter.NewConfig(golinters.NewNakedret(nakedretCfg)).
WithSince("v1.19.0").
WithPresets(linter.PresetStyle).
Expand Down
3 changes: 3 additions & 0 deletions test/testdata/configs/nakedefer.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
linters-settings:
nakedefer:
exclude: ignoreFunc,os\.(Create|WriteFile|Chmod),fmt\.Print.*,io\.Close
48 changes: 0 additions & 48 deletions test/testdata/defer.go

This file was deleted.

91 changes: 91 additions & 0 deletions test/testdata/nakedefer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
// golangcitest:args -Enakedefer
// golangcitest:config_path: testdata/configs/nakedefer.yml
package testdata

import (
"bytes"
"errors"
"fmt"
"io"
"net/http"
"net/http/httptest"
"os"
)

func funcNotReturnAnyType() {
}

func funcReturnErr() error {
return errors.New("some error")
}

func funcReturnFuncAndErr() (func(), error) {
return func() {
}, nil
}

func ignoreFunc() error {
return errors.New("some error")
}

func testCaseValid1() {
defer funcNotReturnAnyType() // ignore

defer func() { //ignore
funcNotReturnAnyType()
}()

defer func() { //ignore
_ = funcReturnErr()
}()
}

func testCaseInvalid1() {
defer funcReturnErr() // want "deferred call should not return anything"

defer funcReturnFuncAndErr() // want "deferred call should not return anything"

defer func() error { // want "deferred call should not return anything"
return nil
}()

defer func() func() { // want "deferred call should not return anything"
return func() {}
}()
}

func testCase1() {
defer fmt.Errorf("some text") // want "deferred call should not return anything"

r := new(bytes.Buffer)
defer io.LimitReader(r, 1) // want "deferred call should not return anything"

srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
_, _ = w.Write([]byte("DONE"))
}))
defer srv.Close() // ignore
defer srv.CloseClientConnections() // ignore
defer srv.Certificate() // want "deferred call should not return anything"
}

func testCaseExclude1() {
// exclude ignoreFunc
defer ignoreFunc() // ignore
}

func testCaseExclude2() {
// exclude os\.(Create|WriteFile|Chmod)
defer os.Create("file_test1") // ignore
defer os.WriteFile("file_test2", []byte("data"), os.ModeAppend) // ignore
defer os.Chmod("file_test3", os.ModeAppend) // ignore
defer os.FindProcess(100500) // want "deferred call should not return anything"
}

func testCaseExclude3() {
// exclude fmt\.Print.*
defer fmt.Println("e1") // ignore
defer fmt.Print("e1") // ignore
defer fmt.Printf("e1") // ignore
defer fmt.Sprintf("some text") // want "deferred call should not return anything"
}

0 comments on commit 4330264

Please sign in to comment.