diff --git a/.golangci.example.yml b/.golangci.example.yml index 55a413860456a..bfb1ba9dc2d16 100644 --- a/.golangci.example.yml +++ b/.golangci.example.yml @@ -136,10 +136,16 @@ linters-settings: exhaustive: # check switch statements in generated files also check-generated: false - # indicates that switch statements are to be considered exhaustive if a - # 'default' case is present, even if all enum members aren't listed in the - # switch + # presence of "default" case in switch statements satisfies exhaustiveness, + # even if all enum members are not listed default-signifies-exhaustive: false + # enum members matching the supplied regex do not have to be listed in + # switch statements to satisfy exhaustiveness + ignore-enum-members: "" + # strategy to use when checking exhaustiveness of switch statements; one of: + # "name", "value"; see documentation for details: + # https://pkg.go.dev/github.com/nishanths/exhaustive#section-documentation + checking-strategy: "value" exhaustivestruct: # Struct Patterns is list of expressions to match struct packages and names diff --git a/pkg/config/linters_settings.go b/pkg/config/linters_settings.go index 840b283fec13e..56c2d7c6341e7 100644 --- a/pkg/config/linters_settings.go +++ b/pkg/config/linters_settings.go @@ -57,6 +57,8 @@ var defaultLintersSettings = LintersSettings{ Exhaustive: ExhaustiveSettings{ CheckGenerated: false, DefaultSignifiesExhaustive: false, + IgnoreEnumMembers: "", + CheckingStrategy: "value", }, Gofumpt: GofumptSettings{ LangVersion: "", @@ -184,7 +186,9 @@ type ErrorLintSettings struct { type ExhaustiveSettings struct { CheckGenerated bool `mapstructure:"check-generated"` DefaultSignifiesExhaustive bool `mapstructure:"default-signifies-exhaustive"` - IgnorePattern string `mapstructure:"ignore-pattern"` + IgnorePattern string `mapstructure:"ignore-pattern"` // Deprecated: this setting has no effect; see IgnoreEnumMembers instead. + IgnoreEnumMembers string `mapstructure:"ignore-enum-members"` + CheckingStrategy string `mapstructure:"checking-strategy"` } type ExhaustiveStructSettings struct { diff --git a/pkg/golinters/exhaustive.go b/pkg/golinters/exhaustive.go index 9acee6a806417..f3a138295e400 100644 --- a/pkg/golinters/exhaustive.go +++ b/pkg/golinters/exhaustive.go @@ -18,6 +18,8 @@ func NewExhaustive(settings *config.ExhaustiveSettings) *goanalysis.Linter { exhaustive.CheckGeneratedFlag: settings.CheckGenerated, exhaustive.DefaultSignifiesExhaustiveFlag: settings.DefaultSignifiesExhaustive, exhaustive.IgnorePatternFlag: settings.IgnorePattern, + exhaustive.IgnoreEnumMembersFlag: settings.IgnoreEnumMembers, + exhaustive.CheckingStrategyFlag: settings.CheckingStrategy, }, } } diff --git a/test/testdata/configs/exhaustive_ignore_enum_members.yml b/test/testdata/configs/exhaustive_ignore_enum_members.yml new file mode 100644 index 0000000000000..a3ed1d64a2983 --- /dev/null +++ b/test/testdata/configs/exhaustive_ignore_enum_members.yml @@ -0,0 +1,3 @@ +linters-settings: + exhaustive: + ignore-enum-members: "East$" diff --git a/test/testdata/exhaustive_default.go b/test/testdata/exhaustive_default.go index 1dc2637fd198f..50898eba24699 100644 --- a/test/testdata/exhaustive_default.go +++ b/test/testdata/exhaustive_default.go @@ -11,6 +11,10 @@ const ( West ) +// Should not report missing cases in the switch statement below even though +// some enum members (East, West) are not listed, because the switch statement +// has a 'default' case and the default-signifies-exhaustive setting is true. + func processDirectionDefault(d Direction) { switch d { case North, South: diff --git a/test/testdata/exhaustive_ignore_enum_members.go b/test/testdata/exhaustive_ignore_enum_members.go new file mode 100644 index 0000000000000..65bf8fc8d76f8 --- /dev/null +++ b/test/testdata/exhaustive_ignore_enum_members.go @@ -0,0 +1,21 @@ +//args: -Eexhaustive +//config_path: testdata/configs/exhaustive_ignore_enum_members.yml +package testdata + +type Direction int + +const ( + North Direction = iota + East + South + West +) + +// Should only report East as missing because the enum member West is ignored +// using the ignore-enum-members setting. + +func processDirectionIgnoreEnumMembers(d Direction) { + switch d { // ERROR "missing cases in switch of type Direction: East" + case North, South: + } +}