From 62b4d6af1e909f09cfbf2a053276762006eacbeb Mon Sep 17 00:00:00 2001 From: Leon Klingele Date: Wed, 19 Jan 2022 08:32:10 +0100 Subject: [PATCH] Add "grouper" linter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit grouper — a Go linter to analyze expression groups https://github.com/leonklingele/grouper --- .golangci.example.yml | 14 +++++++++++++ go.mod | 1 + go.sum | 2 ++ pkg/config/linters_settings.go | 16 +++++++++++++++ pkg/golinters/grouper.go | 37 ++++++++++++++++++++++++++++++++++ pkg/lint/lintersdb/manager.go | 7 +++++++ 6 files changed, 77 insertions(+) create mode 100644 pkg/golinters/grouper.go diff --git a/.golangci.example.yml b/.golangci.example.yml index df2af8e2525e..08124125faec 100644 --- a/.golangci.example.yml +++ b/.golangci.example.yml @@ -516,6 +516,20 @@ linters-settings: - shadow disable-all: false + grouper: + # const + const-require-single-const: false + const-require-grouping: false + # import + import-require-single-import: false + import-require-grouping: false + # type + type-require-single-type: false + type-require-grouping: false + # var + var-require-single-var: false + var-require-grouping: false + depguard: list-type: denylist include-go-root: false diff --git a/go.mod b/go.mod index 79835dae4bf2..b6bb6eaea9ab 100644 --- a/go.mod +++ b/go.mod @@ -50,6 +50,7 @@ require ( github.com/kyoh86/exportloopref v0.1.8 github.com/ldez/gomoddirectives v0.2.2 github.com/ldez/tagliatelle v0.3.0 + github.com/leonklingele/grouper v1.1.0 github.com/maratori/testpackage v1.0.1 github.com/matoous/godox v0.0.0-20210227103229-6504466cf951 // v1.0 github.com/mattn/go-colorable v0.1.12 diff --git a/go.sum b/go.sum index 4c60d553b8cb..e6148f70a032 100644 --- a/go.sum +++ b/go.sum @@ -489,6 +489,8 @@ github.com/ldez/gomoddirectives v0.2.2 h1:p9/sXuNFArS2RLc+UpYZSI4KQwGMEDWC/LbtF5 github.com/ldez/gomoddirectives v0.2.2/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= github.com/ldez/tagliatelle v0.3.0 h1:Aubm2ZsrsjIGFvdxemMPJaXrSJ5Cys6VWyTQFt9k2dI= github.com/ldez/tagliatelle v0.3.0/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= +github.com/leonklingele/grouper v1.1.0 h1:tC2y/ygPbMFSBOs3DcyaEMKnnwH7eYKzohOtRrf0SAg= +github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= diff --git a/pkg/config/linters_settings.go b/pkg/config/linters_settings.go index e7f07db50aa4..e6238f1b01f4 100644 --- a/pkg/config/linters_settings.go +++ b/pkg/config/linters_settings.go @@ -127,6 +127,7 @@ type LintersSettings struct { Gosec GoSecSettings Gosimple StaticCheckSettings Govet GovetSettings + Grouper GrouperSettings Ifshort IfshortSettings ImportAs ImportAsSettings Ireturn IreturnSettings @@ -368,6 +369,21 @@ func (cfg GovetSettings) Validate() error { return nil } +type GrouperSettings struct { + // const + ConstRequireSingleConst bool `mapstructure:"const-require-single-const"` + ConstRequireGrouping bool `mapstructure:"const-require-grouping"` + // import + ImportRequireSingleImport bool `mapstructure:"import-require-single-import"` + ImportRequireGrouping bool `mapstructure:"import-require-grouping"` + // type + TypeRequireSingleType bool `mapstructure:"type-require-single-type"` + TypeRequireGrouping bool `mapstructure:"type-require-grouping"` + // var + VarRequireSingleVar bool `mapstructure:"var-require-single-var"` + VarRequireGrouping bool `mapstructure:"var-require-grouping"` +} + type IfshortSettings struct { MaxDeclLines int `mapstructure:"max-decl-lines"` MaxDeclChars int `mapstructure:"max-decl-chars"` diff --git a/pkg/golinters/grouper.go b/pkg/golinters/grouper.go new file mode 100644 index 000000000000..6537791049dd --- /dev/null +++ b/pkg/golinters/grouper.go @@ -0,0 +1,37 @@ +package golinters + +import ( + "golang.org/x/tools/go/analysis" + + "github.com/golangci/golangci-lint/pkg/config" + "github.com/golangci/golangci-lint/pkg/golinters/goanalysis" + + grouper "github.com/leonklingele/grouper/pkg/analyzer" +) + +func NewGrouper(settings *config.GrouperSettings) *goanalysis.Linter { + linterCfg := map[string]map[string]interface{}{} + if settings != nil { + linterCfg["grouper"] = map[string]interface{}{ + // const + "const-require-single-const": settings.ConstRequireSingleConst, + "const-require-grouping": settings.ConstRequireGrouping, + // import + "import-require-single-import": settings.ImportRequireSingleImport, + "import-require-grouping": settings.ImportRequireGrouping, + // type + "type-require-single-type": settings.TypeRequireSingleType, + "type-require-grouping": settings.TypeRequireGrouping, + // var + "var-require-single-var": settings.VarRequireSingleVar, + "var-require-grouping": settings.VarRequireGrouping, + } + } + + return goanalysis.NewLinter( + "grouper", + "An analyzer to analyze expression groups.", + []*analysis.Analyzer{grouper.New()}, + linterCfg, + ).WithLoadMode(goanalysis.LoadModeSyntax) +} diff --git a/pkg/lint/lintersdb/manager.go b/pkg/lint/lintersdb/manager.go index 28bf08056a9d..c1ebe13b2b24 100644 --- a/pkg/lint/lintersdb/manager.go +++ b/pkg/lint/lintersdb/manager.go @@ -111,6 +111,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config { var gosecCfg *config.GoSecSettings var gosimpleCfg *config.StaticCheckSettings var govetCfg *config.GovetSettings + var grouperCfg *config.GrouperSettings var ifshortCfg *config.IfshortSettings var importAsCfg *config.ImportAsSettings var ireturnCfg *config.IreturnSettings @@ -141,6 +142,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config { gosecCfg = &m.cfg.LintersSettings.Gosec gosimpleCfg = &m.cfg.LintersSettings.Gosimple govetCfg = &m.cfg.LintersSettings.Govet + grouperCfg = &m.cfg.LintersSettings.Grouper ifshortCfg = &m.cfg.LintersSettings.Ifshort importAsCfg = &m.cfg.LintersSettings.ImportAs ireturnCfg = &m.cfg.LintersSettings.Ireturn @@ -408,6 +410,11 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config { WithAlternativeNames("vet", "vetshadow"). WithURL("https://golang.org/cmd/vet/"), + linter.NewConfig(golinters.NewGrouper(grouperCfg)). + WithSince("v1.44.0"). + WithPresets(linter.PresetStyle). + WithURL("https://github.com/leonklingele/grouper"), + linter.NewConfig(golinters.NewIfshort(ifshortCfg)). WithSince("v1.36.0"). WithPresets(linter.PresetStyle).