From 16ac437afa16720ae91c48f2d473aded8d6d89e6 Mon Sep 17 00:00:00 2001 From: karamaru-alpha Date: Sun, 5 Nov 2023 03:35:47 +0900 Subject: [PATCH 1/3] feat: add loopvar Signed-off-by: karamaru-alpha --- .golangci.reference.yml | 2 ++ go.mod | 1 + go.sum | 2 ++ pkg/golinters/loopvar.go | 19 ++++++++++++++++++ pkg/lint/lintersdb/manager.go | 6 ++++++ test/testdata/loopvar.go | 38 +++++++++++++++++++++++++++++++++++ 6 files changed, 68 insertions(+) create mode 100644 pkg/golinters/loopvar.go create mode 100644 test/testdata/loopvar.go diff --git a/.golangci.reference.yml b/.golangci.reference.yml index 8e8823758879..63b2774b216e 100644 --- a/.golangci.reference.yml +++ b/.golangci.reference.yml @@ -2297,6 +2297,7 @@ linters: - ireturn - lll - loggercheck + - loopvar - maintidx - makezero - maligned @@ -2417,6 +2418,7 @@ linters: - ireturn - lll - loggercheck + - loopvar - maintidx - makezero - maligned diff --git a/go.mod b/go.mod index a75ebc7346ba..b70d2e1a1d54 100644 --- a/go.mod +++ b/go.mod @@ -59,6 +59,7 @@ require ( github.com/jingyugao/rowserrcheck v1.1.1 github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af github.com/julz/importas v0.1.0 + github.com/karamaru-alpha/loopvar v1.0.2 github.com/kisielk/errcheck v1.6.3 github.com/kkHAIKE/contextcheck v1.1.4 github.com/kulti/thelper v0.6.3 diff --git a/go.sum b/go.sum index 5d70f209aad2..0e544a221ddc 100644 --- a/go.sum +++ b/go.sum @@ -325,6 +325,8 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= +github.com/karamaru-alpha/loopvar v1.0.2 h1:ZfkOWLbOOUpVlQM7g0eWzZ7+VoV0GHvM3V5IerVnXkE= +github.com/karamaru-alpha/loopvar v1.0.2/go.mod h1:ayH86Bsn4k+Ou6dOqSkFssgZMPVoNciBbFs1ZlkblFw= github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8= github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= diff --git a/pkg/golinters/loopvar.go b/pkg/golinters/loopvar.go new file mode 100644 index 000000000000..e9cb103e0e5c --- /dev/null +++ b/pkg/golinters/loopvar.go @@ -0,0 +1,19 @@ +package golinters + +import ( + "github.com/karamaru-alpha/loopvar" + "golang.org/x/tools/go/analysis" + + "github.com/golangci/golangci-lint/pkg/golinters/goanalysis" +) + +func NewLoopVar() *goanalysis.Linter { + a := loopvar.Analyzer + + return goanalysis.NewLinter( + a.Name, + a.Doc, + []*analysis.Analyzer{a}, + nil, + ).WithLoadMode(goanalysis.LoadModeTypesInfo) +} diff --git a/pkg/lint/lintersdb/manager.go b/pkg/lint/lintersdb/manager.go index fd329ce57fcf..104b9c740776 100644 --- a/pkg/lint/lintersdb/manager.go +++ b/pkg/lint/lintersdb/manager.go @@ -620,6 +620,12 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config { WithAlternativeNames("logrlint"). WithURL("https://github.com/timonwong/loggercheck"), + linter.NewConfig(golinters.NewLoopVar()). + WithSince("v1.56.0"). + WithLoadForGoAnalysis(). + WithPresets(linter.PresetStyle). + WithURL("https://github.com/karamaru-alpha/loopvar"), + linter.NewConfig(golinters.NewMaintIdx(maintIdxCfg)). WithSince("v1.44.0"). WithPresets(linter.PresetComplexity). diff --git a/test/testdata/loopvar.go b/test/testdata/loopvar.go new file mode 100644 index 000000000000..08a02e028d64 --- /dev/null +++ b/test/testdata/loopvar.go @@ -0,0 +1,38 @@ +//golangcitest:args -Eloopvar +package testdata + +import ( + "fmt" +) + +func foo() { + slice := []int{1, 2, 3} + fns := make([]func(), 0, len(slice)*2) + for i, v := range slice { + i := i // want `The loop variable "i" should not be copied \(GO_VERSION >= 1.22 or GOEXPERIMENT=loopvar\)` + fns = append(fns, func() { + fmt.Print(i) + }) + _v := v // want `The loop variable "v" should not be copied \(GO_VERSION >= 1.22 or GOEXPERIMENT=loopvar\)` + fns = append(fns, func() { + fmt.Print(_v) + }) + } + for _, fn := range fns { + fn() + } +} + +func bar() { + loopCount := 3 + fns := make([]func(), 0, loopCount) + for i := 1; i <= loopCount; i++ { + i := i // want `The loop variable "i" should not be copied \(GO_VERSION >= 1.22 or GOEXPERIMENT=loopvar\)` + fns = append(fns, func() { + fmt.Print(i) + }) + } + for _, fn := range fns { + fn() + } +} From 0025c5a610c1c798c642c46547ad5c1254b2ba69 Mon Sep 17 00:00:00 2001 From: karamaru-alpha Date: Sun, 5 Nov 2023 04:08:05 +0900 Subject: [PATCH 2/3] chore: loopvar v1.0.2 to v1.0.3 Signed-off-by: karamaru-alpha --- go.mod | 2 +- go.sum | 4 ++-- test/testdata/loopvar.go | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index b70d2e1a1d54..d2b87bfc98ae 100644 --- a/go.mod +++ b/go.mod @@ -59,7 +59,7 @@ require ( github.com/jingyugao/rowserrcheck v1.1.1 github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af github.com/julz/importas v0.1.0 - github.com/karamaru-alpha/loopvar v1.0.2 + github.com/karamaru-alpha/loopvar v1.0.3 github.com/kisielk/errcheck v1.6.3 github.com/kkHAIKE/contextcheck v1.1.4 github.com/kulti/thelper v0.6.3 diff --git a/go.sum b/go.sum index 0e544a221ddc..7d19ef67da20 100644 --- a/go.sum +++ b/go.sum @@ -325,8 +325,8 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/karamaru-alpha/loopvar v1.0.2 h1:ZfkOWLbOOUpVlQM7g0eWzZ7+VoV0GHvM3V5IerVnXkE= -github.com/karamaru-alpha/loopvar v1.0.2/go.mod h1:ayH86Bsn4k+Ou6dOqSkFssgZMPVoNciBbFs1ZlkblFw= +github.com/karamaru-alpha/loopvar v1.0.3 h1:AOhkUFZ4hfHvmEtb8j+sXb/9vq25UUUCHH1t1eCC4ec= +github.com/karamaru-alpha/loopvar v1.0.3/go.mod h1:ayH86Bsn4k+Ou6dOqSkFssgZMPVoNciBbFs1ZlkblFw= github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8= github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= diff --git a/test/testdata/loopvar.go b/test/testdata/loopvar.go index 08a02e028d64..2de0fc1bb09b 100644 --- a/test/testdata/loopvar.go +++ b/test/testdata/loopvar.go @@ -9,11 +9,11 @@ func foo() { slice := []int{1, 2, 3} fns := make([]func(), 0, len(slice)*2) for i, v := range slice { - i := i // want `The loop variable "i" should not be copied \(GO_VERSION >= 1.22 or GOEXPERIMENT=loopvar\)` + i := i // want `The loop variable "i" should not be copied \(Go 1.22~ or Go 1.21 GOEXPERIMENT=loopvar\)` fns = append(fns, func() { fmt.Print(i) }) - _v := v // want `The loop variable "v" should not be copied \(GO_VERSION >= 1.22 or GOEXPERIMENT=loopvar\)` + _v := v // want `The loop variable "v" should not be copied \(Go 1.22~ or Go 1.21 GOEXPERIMENT=loopvar\)` fns = append(fns, func() { fmt.Print(_v) }) @@ -27,7 +27,7 @@ func bar() { loopCount := 3 fns := make([]func(), 0, loopCount) for i := 1; i <= loopCount; i++ { - i := i // want `The loop variable "i" should not be copied \(GO_VERSION >= 1.22 or GOEXPERIMENT=loopvar\)` + i := i // want `The loop variable "i" should not be copied \(Go 1.22~ or Go 1.21 GOEXPERIMENT=loopvar\)` fns = append(fns, func() { fmt.Print(i) }) From f1963412db1b7ebce923550206945e000432606f Mon Sep 17 00:00:00 2001 From: karamaru-alpha Date: Sun, 5 Nov 2023 15:38:29 +0900 Subject: [PATCH 3/3] chore: loopvar v1.0.3 to v1.0.4 Signed-off-by: karamaru-alpha --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d2b87bfc98ae..3cf2a62cf3ec 100644 --- a/go.mod +++ b/go.mod @@ -59,7 +59,7 @@ require ( github.com/jingyugao/rowserrcheck v1.1.1 github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af github.com/julz/importas v0.1.0 - github.com/karamaru-alpha/loopvar v1.0.3 + github.com/karamaru-alpha/loopvar v1.0.4 github.com/kisielk/errcheck v1.6.3 github.com/kkHAIKE/contextcheck v1.1.4 github.com/kulti/thelper v0.6.3 diff --git a/go.sum b/go.sum index 7d19ef67da20..1ebf74c1045c 100644 --- a/go.sum +++ b/go.sum @@ -325,8 +325,8 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/karamaru-alpha/loopvar v1.0.3 h1:AOhkUFZ4hfHvmEtb8j+sXb/9vq25UUUCHH1t1eCC4ec= -github.com/karamaru-alpha/loopvar v1.0.3/go.mod h1:ayH86Bsn4k+Ou6dOqSkFssgZMPVoNciBbFs1ZlkblFw= +github.com/karamaru-alpha/loopvar v1.0.4 h1:fIum97+upQY21fNxXCi2KZ+ysDsKTGRYlhS7QG6hN6k= +github.com/karamaru-alpha/loopvar v1.0.4/go.mod h1:ayH86Bsn4k+Ou6dOqSkFssgZMPVoNciBbFs1ZlkblFw= github.com/kisielk/errcheck v1.6.3 h1:dEKh+GLHcWm2oN34nMvDzn1sqI0i0WxPvrgiJA5JuM8= github.com/kisielk/errcheck v1.6.3/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg=