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
|
# 'default' case is present, even if all enum members aren't listed in the
|
||||||
# switch
|
# switch
|
||||||
default-signifies-exhaustive: false
|
default-signifies-exhaustive: false
|
||||||
|
exhaustivestruct:
|
||||||
|
struct-patterns:
|
||||||
|
- '*.Test'
|
||||||
|
- '*.Test2'
|
||||||
|
- '*.Embedded'
|
||||||
|
- '*.External'
|
||||||
funlen:
|
funlen:
|
||||||
lines: 60
|
lines: 60
|
||||||
statements: 40
|
statements: 40
|
||||||
|
@ -265,6 +265,7 @@ type LintersSettings struct {
|
|||||||
Nestif NestifSettings
|
Nestif NestifSettings
|
||||||
NoLintLint NoLintLintSettings
|
NoLintLint NoLintLintSettings
|
||||||
Exhaustive ExhaustiveSettings
|
Exhaustive ExhaustiveSettings
|
||||||
|
ExhaustiveStruct ExhaustiveStructSettings
|
||||||
Gofumpt GofumptSettings
|
Gofumpt GofumptSettings
|
||||||
ErrorLint ErrorLintSettings
|
ErrorLint ErrorLintSettings
|
||||||
Makezero MakezeroSettings
|
Makezero MakezeroSettings
|
||||||
@ -387,6 +388,10 @@ type ExhaustiveSettings struct {
|
|||||||
DefaultSignifiesExhaustive bool `mapstructure:"default-signifies-exhaustive"`
|
DefaultSignifiesExhaustive bool `mapstructure:"default-signifies-exhaustive"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ExhaustiveStructSettings struct {
|
||||||
|
StructPatterns []string `mapstructure:"struct-patterns"`
|
||||||
|
}
|
||||||
|
|
||||||
type GofumptSettings struct {
|
type GofumptSettings struct {
|
||||||
ExtraRules bool `mapstructure:"extra-rules"`
|
ExtraRules bool `mapstructure:"extra-rules"`
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,31 @@
|
|||||||
package golinters
|
package golinters
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/mbilski/exhaustivestruct/pkg/analyzer"
|
"github.com/mbilski/exhaustivestruct/pkg/analyzer"
|
||||||
"golang.org/x/tools/go/analysis"
|
"golang.org/x/tools/go/analysis"
|
||||||
|
|
||||||
|
"github.com/golangci/golangci-lint/pkg/config"
|
||||||
"github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
|
"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(
|
return goanalysis.NewLinter(
|
||||||
"exhaustivestruct",
|
a.Name,
|
||||||
"Checks if all struct's fields are initialized",
|
a.Doc,
|
||||||
[]*analysis.Analyzer{analyzer.Analyzer},
|
[]*analysis.Analyzer{a},
|
||||||
nil,
|
cfg,
|
||||||
).WithLoadMode(goanalysis.LoadModeTypesInfo)
|
).WithLoadMode(goanalysis.LoadModeTypesInfo)
|
||||||
}
|
}
|
||||||
|
@ -92,6 +92,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
|
|||||||
var govetCfg *config.GovetSettings
|
var govetCfg *config.GovetSettings
|
||||||
var testpackageCfg *config.TestpackageSettings
|
var testpackageCfg *config.TestpackageSettings
|
||||||
var exhaustiveCfg *config.ExhaustiveSettings
|
var exhaustiveCfg *config.ExhaustiveSettings
|
||||||
|
var exhaustiveStructCfg *config.ExhaustiveStructSettings
|
||||||
var errorlintCfg *config.ErrorLintSettings
|
var errorlintCfg *config.ErrorLintSettings
|
||||||
var thelperCfg *config.ThelperSettings
|
var thelperCfg *config.ThelperSettings
|
||||||
var predeclaredCfg *config.PredeclaredSettings
|
var predeclaredCfg *config.PredeclaredSettings
|
||||||
@ -102,6 +103,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
|
|||||||
govetCfg = &m.cfg.LintersSettings.Govet
|
govetCfg = &m.cfg.LintersSettings.Govet
|
||||||
testpackageCfg = &m.cfg.LintersSettings.Testpackage
|
testpackageCfg = &m.cfg.LintersSettings.Testpackage
|
||||||
exhaustiveCfg = &m.cfg.LintersSettings.Exhaustive
|
exhaustiveCfg = &m.cfg.LintersSettings.Exhaustive
|
||||||
|
exhaustiveStructCfg = &m.cfg.LintersSettings.ExhaustiveStruct
|
||||||
errorlintCfg = &m.cfg.LintersSettings.ErrorLint
|
errorlintCfg = &m.cfg.LintersSettings.ErrorLint
|
||||||
thelperCfg = &m.cfg.LintersSettings.Thelper
|
thelperCfg = &m.cfg.LintersSettings.Thelper
|
||||||
predeclaredCfg = &m.cfg.LintersSettings.Predeclared
|
predeclaredCfg = &m.cfg.LintersSettings.Predeclared
|
||||||
@ -339,7 +341,7 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config {
|
|||||||
WithPresets(linter.PresetStyle).
|
WithPresets(linter.PresetStyle).
|
||||||
WithLoadForGoAnalysis().
|
WithLoadForGoAnalysis().
|
||||||
WithURL("https://github.com/moricho/tparallel"),
|
WithURL("https://github.com/moricho/tparallel"),
|
||||||
linter.NewConfig(golinters.NewExhaustiveStruct()).
|
linter.NewConfig(golinters.NewExhaustiveStruct(exhaustiveStructCfg)).
|
||||||
WithPresets(linter.PresetStyle).
|
WithPresets(linter.PresetStyle).
|
||||||
WithLoadForGoAnalysis().
|
WithLoadForGoAnalysis().
|
||||||
WithURL("https://github.com/mbilski/exhaustivestruct"),
|
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