exhaustivestruct: add missing settings (#1746)
This commit is contained in:
parent
4b3fb4c64f
commit
ea5f479087
@ -111,6 +111,12 @@ linters-settings:
|
||||
# 'default' case is present, even if all enum members aren't listed in the
|
||||
# switch
|
||||
default-signifies-exhaustive: false
|
||||
exhaustivestruct:
|
||||
struct-patterns:
|
||||
- '*.Test'
|
||||
- '*.Test2'
|
||||
- '*.Embedded'
|
||||
- '*.External'
|
||||
funlen:
|
||||
lines: 60
|
||||
statements: 40
|
||||
|
@ -265,6 +265,7 @@ type LintersSettings struct {
|
||||
Nestif NestifSettings
|
||||
NoLintLint NoLintLintSettings
|
||||
Exhaustive ExhaustiveSettings
|
||||
ExhaustiveStruct ExhaustiveStructSettings
|
||||
Gofumpt GofumptSettings
|
||||
ErrorLint ErrorLintSettings
|
||||
Makezero MakezeroSettings
|
||||
@ -387,6 +388,10 @@ type ExhaustiveSettings struct {
|
||||
DefaultSignifiesExhaustive bool `mapstructure:"default-signifies-exhaustive"`
|
||||
}
|
||||
|
||||
type ExhaustiveStructSettings struct {
|
||||
StructPatterns []string `mapstructure:"struct-patterns"`
|
||||
}
|
||||
|
||||
type GofumptSettings struct {
|
||||
ExtraRules bool `mapstructure:"extra-rules"`
|
||||
}
|
||||
|
@ -1,17 +1,31 @@
|
||||
package golinters
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/mbilski/exhaustivestruct/pkg/analyzer"
|
||||
"golang.org/x/tools/go/analysis"
|
||||
|
||||
"github.com/golangci/golangci-lint/pkg/config"
|
||||
"github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
|
||||
)
|
||||
|
||||
func NewExhaustiveStruct() *goanalysis.Linter {
|
||||
func NewExhaustiveStruct(settings *config.ExhaustiveStructSettings) *goanalysis.Linter {
|
||||
a := analyzer.Analyzer
|
||||
|
||||
var cfg map[string]map[string]interface{}
|
||||
if settings != nil {
|
||||
cfg = map[string]map[string]interface{}{
|
||||
a.Name: {
|
||||
"struct_patterns": strings.Join(settings.StructPatterns, ","),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
return goanalysis.NewLinter(
|
||||
"exhaustivestruct",
|
||||
"Checks if all struct's fields are initialized",
|
||||
[]*analysis.Analyzer{analyzer.Analyzer},
|
||||
nil,
|
||||
a.Name,
|
||||
a.Doc,
|
||||
[]*analysis.Analyzer{a},
|
||||
cfg,
|
||||
).WithLoadMode(goanalysis.LoadModeTypesInfo)
|
||||
}
|
||||
|
@ -92,6 +92,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
|
||||
var govetCfg *config.GovetSettings
|
||||
var testpackageCfg *config.TestpackageSettings
|
||||
var exhaustiveCfg *config.ExhaustiveSettings
|
||||
var exhaustiveStructCfg *config.ExhaustiveStructSettings
|
||||
var errorlintCfg *config.ErrorLintSettings
|
||||
var thelperCfg *config.ThelperSettings
|
||||
var predeclaredCfg *config.PredeclaredSettings
|
||||
@ -102,6 +103,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
|
||||
govetCfg = &m.cfg.LintersSettings.Govet
|
||||
testpackageCfg = &m.cfg.LintersSettings.Testpackage
|
||||
exhaustiveCfg = &m.cfg.LintersSettings.Exhaustive
|
||||
exhaustiveStructCfg = &m.cfg.LintersSettings.ExhaustiveStruct
|
||||
errorlintCfg = &m.cfg.LintersSettings.ErrorLint
|
||||
thelperCfg = &m.cfg.LintersSettings.Thelper
|
||||
predeclaredCfg = &m.cfg.LintersSettings.Predeclared
|
||||
@ -339,7 +341,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
|
||||
WithPresets(linter.PresetStyle).
|
||||
WithLoadForGoAnalysis().
|
||||
WithURL("https://github.com/moricho/tparallel"),
|
||||
linter.NewConfig(golinters.NewExhaustiveStruct()).
|
||||
linter.NewConfig(golinters.NewExhaustiveStruct(exhaustiveStructCfg)).
|
||||
WithPresets(linter.PresetStyle).
|
||||
WithLoadForGoAnalysis().
|
||||
WithURL("https://github.com/mbilski/exhaustivestruct"),
|
||||
|
113
test/testdata/exhaustivestruct_custom.go
vendored
Normal file
113
test/testdata/exhaustivestruct_custom.go
vendored
Normal file
@ -0,0 +1,113 @@
|
||||
//args: -Eexhaustivestruct
|
||||
//config: linters-settings.exhaustivestruct.struct-patterns=*.Test1,*.Test3
|
||||
package testdata
|
||||
|
||||
import "time"
|
||||
|
||||
type Test1 struct {
|
||||
A string
|
||||
B int
|
||||
c bool // private field inside the same package are not ignored
|
||||
D float64
|
||||
E time.Time
|
||||
}
|
||||
|
||||
var passTest1 = Test1{
|
||||
A: "a",
|
||||
B: 0,
|
||||
c: false,
|
||||
D: 1.0,
|
||||
E: time.Now(),
|
||||
}
|
||||
|
||||
var failTest1 = Test1{ // ERROR "B is missing in Test"
|
||||
A: "a",
|
||||
c: false,
|
||||
D: 1.0,
|
||||
E: time.Now(),
|
||||
}
|
||||
|
||||
var failMultipleTest1 = Test1{ // ERROR "B, D are missing in Test"
|
||||
A: "a",
|
||||
c: false,
|
||||
E: time.Now(),
|
||||
}
|
||||
|
||||
var failPrivateTest1 = Test1{ // ERROR "c is missing in Test"
|
||||
A: "a",
|
||||
B: 0,
|
||||
D: 1.0,
|
||||
E: time.Now(),
|
||||
}
|
||||
|
||||
type Test2 struct {
|
||||
A string
|
||||
B int
|
||||
c bool // private field inside the same package are not ignored
|
||||
D float64
|
||||
E time.Time
|
||||
}
|
||||
|
||||
var passTest2 = Test1{
|
||||
A: "a",
|
||||
B: 0,
|
||||
c: false,
|
||||
D: 1.0,
|
||||
E: time.Now(),
|
||||
}
|
||||
|
||||
var failTest2 = Test2{
|
||||
A: "a",
|
||||
c: false,
|
||||
D: 1.0,
|
||||
E: time.Now(),
|
||||
}
|
||||
|
||||
var failMultipleTest2 = Test2{
|
||||
A: "a",
|
||||
c: false,
|
||||
E: time.Now(),
|
||||
}
|
||||
|
||||
var failPrivateTest2 = Test2{
|
||||
A: "a",
|
||||
B: 0,
|
||||
D: 1.0,
|
||||
E: time.Now(),
|
||||
}
|
||||
|
||||
type Test3 struct {
|
||||
A string
|
||||
B int
|
||||
c bool // private field inside the same package are not ignored
|
||||
D float64
|
||||
E time.Time
|
||||
}
|
||||
|
||||
var passTest3 = Test3{
|
||||
A: "a",
|
||||
B: 0,
|
||||
c: false,
|
||||
D: 1.0,
|
||||
E: time.Now(),
|
||||
}
|
||||
|
||||
var failTest3 = Test3{ // ERROR "B is missing in Test"
|
||||
A: "a",
|
||||
c: false,
|
||||
D: 1.0,
|
||||
E: time.Now(),
|
||||
}
|
||||
|
||||
var failMultipleTest3 = Test3{ // ERROR "B, D are missing in Test"
|
||||
A: "a",
|
||||
c: false,
|
||||
E: time.Now(),
|
||||
}
|
||||
|
||||
var failPrivateTest3 = Test3{ // ERROR "c is missing in Test"
|
||||
A: "a",
|
||||
B: 0,
|
||||
D: 1.0,
|
||||
E: time.Now(),
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user