Skip to content

Commit 32cf48e

Browse files
authored
Add "grouper" linter (#2497)
1 parent 620bd9b commit 32cf48e

File tree

6 files changed

+83
-0
lines changed

6 files changed

+83
-0
lines changed

Diff for: .golangci.example.yml

+29
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,35 @@ linters-settings:
806806
- unusedresult
807807
- unusedwrite
808808

809+
grouper:
810+
# Require the use of a single global 'const' declaration only.
811+
# Default: false
812+
const-require-single-const: true
813+
# Require the use of grouped global 'const' declarations.
814+
# Default: false
815+
const-require-grouping: true
816+
817+
# Require the use of a single 'import' declaration only.
818+
# Default: false
819+
import-require-single-import: true
820+
# Require the use of grouped 'import' declarations.
821+
# Default: false
822+
import-require-grouping: true
823+
824+
# Require the use of a single global 'type' declaration only.
825+
# Default: false
826+
type-require-single-type: true
827+
# Require the use of grouped global 'type' declarations.
828+
# Default: false
829+
type-require-grouping: true
830+
831+
# Require the use of a single global 'var' declaration only.
832+
# Default: false
833+
var-require-single-var: true
834+
# Require the use of grouped global 'var' declarations.
835+
# Default: false
836+
var-require-grouping: true
837+
809838
ifshort:
810839
# Maximum length of variable declaration measured in number of lines, after which linter won't suggest using short syntax.
811840
# Has higher priority than max-decl-chars.

Diff for: go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ require (
5050
github.com/kyoh86/exportloopref v0.1.8
5151
github.com/ldez/gomoddirectives v0.2.2
5252
github.com/ldez/tagliatelle v0.3.0
53+
github.com/leonklingele/grouper v1.1.0
5354
github.com/maratori/testpackage v1.0.1
5455
github.com/matoous/godox v0.0.0-20210227103229-6504466cf951 // v1.0
5556
github.com/mattn/go-colorable v0.1.12

Diff for: go.sum

+2
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

+12
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ type LintersSettings struct {
131131
Gosec GoSecSettings
132132
Gosimple StaticCheckSettings
133133
Govet GovetSettings
134+
Grouper GrouperSettings
134135
Ifshort IfshortSettings
135136
ImportAs ImportAsSettings
136137
Ireturn IreturnSettings
@@ -376,6 +377,17 @@ func (cfg GovetSettings) Validate() error {
376377
return nil
377378
}
378379

380+
type GrouperSettings struct {
381+
ConstRequireSingleConst bool `mapstructure:"const-require-single-const"`
382+
ConstRequireGrouping bool `mapstructure:"const-require-grouping"`
383+
ImportRequireSingleImport bool `mapstructure:"import-require-single-import"`
384+
ImportRequireGrouping bool `mapstructure:"import-require-grouping"`
385+
TypeRequireSingleType bool `mapstructure:"type-require-single-type"`
386+
TypeRequireGrouping bool `mapstructure:"type-require-grouping"`
387+
VarRequireSingleVar bool `mapstructure:"var-require-single-var"`
388+
VarRequireGrouping bool `mapstructure:"var-require-grouping"`
389+
}
390+
379391
type IfshortSettings struct {
380392
MaxDeclLines int `mapstructure:"max-decl-lines"`
381393
MaxDeclChars int `mapstructure:"max-decl-chars"`

Diff for: pkg/golinters/grouper.go

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package golinters
2+
3+
import (
4+
grouper "github.com/leonklingele/grouper/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 NewGrouper(settings *config.GrouperSettings) *goanalysis.Linter {
12+
linterCfg := map[string]map[string]interface{}{}
13+
if settings != nil {
14+
linterCfg["grouper"] = map[string]interface{}{
15+
"const-require-single-const": settings.ConstRequireSingleConst,
16+
"const-require-grouping": settings.ConstRequireGrouping,
17+
"import-require-single-import": settings.ImportRequireSingleImport,
18+
"import-require-grouping": settings.ImportRequireGrouping,
19+
"type-require-single-type": settings.TypeRequireSingleType,
20+
"type-require-grouping": settings.TypeRequireGrouping,
21+
"var-require-single-var": settings.VarRequireSingleVar,
22+
"var-require-grouping": settings.VarRequireGrouping,
23+
}
24+
}
25+
26+
return goanalysis.NewLinter(
27+
"grouper",
28+
"An analyzer to analyze expression groups.",
29+
[]*analysis.Analyzer{grouper.New()},
30+
linterCfg,
31+
).WithLoadMode(goanalysis.LoadModeSyntax)
32+
}

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

+7
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
112112
var gosecCfg *config.GoSecSettings
113113
var gosimpleCfg *config.StaticCheckSettings
114114
var govetCfg *config.GovetSettings
115+
var grouperCfg *config.GrouperSettings
115116
var ifshortCfg *config.IfshortSettings
116117
var importAsCfg *config.ImportAsSettings
117118
var ireturnCfg *config.IreturnSettings
@@ -143,6 +144,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
143144
gosecCfg = &m.cfg.LintersSettings.Gosec
144145
gosimpleCfg = &m.cfg.LintersSettings.Gosimple
145146
govetCfg = &m.cfg.LintersSettings.Govet
147+
grouperCfg = &m.cfg.LintersSettings.Grouper
146148
ifshortCfg = &m.cfg.LintersSettings.Ifshort
147149
importAsCfg = &m.cfg.LintersSettings.ImportAs
148150
ireturnCfg = &m.cfg.LintersSettings.Ireturn
@@ -415,6 +417,11 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
415417
WithAlternativeNames("vet", "vetshadow").
416418
WithURL("https://golang.org/cmd/vet/"),
417419

420+
linter.NewConfig(golinters.NewGrouper(grouperCfg)).
421+
WithSince("v1.44.0").
422+
WithPresets(linter.PresetStyle).
423+
WithURL("https://github.com/leonklingele/grouper"),
424+
418425
linter.NewConfig(golinters.NewIfshort(ifshortCfg)).
419426
WithSince("v1.36.0").
420427
WithPresets(linter.PresetStyle).

0 commit comments

Comments
 (0)