fix #370: fix go-critic configuration broken in v1.13
This commit is contained in:
parent
af080e7503
commit
3e9b681cf0
@ -295,3 +295,11 @@ func (s *GocriticSettings) validateCheckerNames() error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *GocriticSettings) GetLowercasedParams() map[string]GocriticCheckSettings {
|
||||||
|
ret := map[string]GocriticCheckSettings{}
|
||||||
|
for checker, params := range s.SettingsPerCheck {
|
||||||
|
ret[strings.ToLower(checker)] = params
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
@ -8,8 +8,12 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"github.com/golangci/golangci-lint/pkg/config"
|
||||||
|
|
||||||
"github.com/go-lintpack/lintpack"
|
"github.com/go-lintpack/lintpack"
|
||||||
"golang.org/x/tools/go/loader"
|
"golang.org/x/tools/go/loader"
|
||||||
|
|
||||||
@ -27,11 +31,52 @@ func (Gocritic) Desc() string {
|
|||||||
return "The most opinionated Go source code linter"
|
return "The most opinionated Go source code linter"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (lint Gocritic) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
|
func (Gocritic) normalizeCheckerInfoParams(info *lintpack.CheckerInfo) lintpack.CheckerParams {
|
||||||
sizes := types.SizesFor("gc", runtime.GOARCH)
|
// lowercase info param keys here because golangci-lint's config parser lowercases all strings
|
||||||
lintpackCtx := lintpack.NewContext(lintCtx.Program.Fset, sizes)
|
ret := lintpack.CheckerParams{}
|
||||||
|
for k, v := range info.Params {
|
||||||
|
ret[strings.ToLower(k)] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func (lint Gocritic) configureCheckerInfo(info *lintpack.CheckerInfo, allParams map[string]config.GocriticCheckSettings) error {
|
||||||
|
params := allParams[strings.ToLower(info.Name)]
|
||||||
|
if params == nil { // no config for this checker
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
infoParams := lint.normalizeCheckerInfoParams(info)
|
||||||
|
for k, p := range params {
|
||||||
|
v, ok := infoParams[k]
|
||||||
|
if ok {
|
||||||
|
v.Value = p
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// param `k` isn't supported
|
||||||
|
if len(info.Params) == 0 {
|
||||||
|
return fmt.Errorf("checker %s config param %s doesn't exist: checker doesn't have params",
|
||||||
|
info.Name, k)
|
||||||
|
}
|
||||||
|
|
||||||
|
var supportedKeys []string
|
||||||
|
for sk := range info.Params {
|
||||||
|
supportedKeys = append(supportedKeys, sk)
|
||||||
|
}
|
||||||
|
sort.Strings(supportedKeys)
|
||||||
|
|
||||||
|
return fmt.Errorf("checker %s config param %s doesn't exist, all existing: %s",
|
||||||
|
info.Name, k, supportedKeys)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (lint Gocritic) buildEnabledCheckers(lintCtx *linter.Context, lintpackCtx *lintpack.Context) ([]*lintpack.Checker, error) {
|
||||||
s := lintCtx.Settings().Gocritic
|
s := lintCtx.Settings().Gocritic
|
||||||
|
allParams := s.GetLowercasedParams()
|
||||||
|
|
||||||
var enabledCheckers []*lintpack.Checker
|
var enabledCheckers []*lintpack.Checker
|
||||||
for _, info := range lintpack.GetCheckersInfo() {
|
for _, info := range lintpack.GetCheckersInfo() {
|
||||||
@ -39,10 +84,26 @@ func (lint Gocritic) Run(ctx context.Context, lintCtx *linter.Context) ([]result
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := lint.configureCheckerInfo(info, allParams); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
c := lintpack.NewChecker(lintpackCtx, info)
|
c := lintpack.NewChecker(lintpackCtx, info)
|
||||||
enabledCheckers = append(enabledCheckers, c)
|
enabledCheckers = append(enabledCheckers, c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return enabledCheckers, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (lint Gocritic) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
|
||||||
|
sizes := types.SizesFor("gc", runtime.GOARCH)
|
||||||
|
lintpackCtx := lintpack.NewContext(lintCtx.Program.Fset, sizes)
|
||||||
|
|
||||||
|
enabledCheckers, err := lint.buildEnabledCheckers(lintCtx, lintpackCtx)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
issuesCh := make(chan result.Issue, 1024)
|
issuesCh := make(chan result.Issue, 1024)
|
||||||
var panicErr error
|
var panicErr error
|
||||||
go func() {
|
go func() {
|
||||||
|
8
test/testdata/configs/gocritic.yml
vendored
Normal file
8
test/testdata/configs/gocritic.yml
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
linters-settings:
|
||||||
|
gocritic:
|
||||||
|
enabled-checks:
|
||||||
|
- rangeValCopy
|
||||||
|
- flagDeref
|
||||||
|
settings:
|
||||||
|
rangevalcopy:
|
||||||
|
sizethreshold: 2
|
27
test/testdata/gocritic.go
vendored
27
test/testdata/gocritic.go
vendored
@ -1,6 +1,31 @@
|
|||||||
//args: -Egocritic
|
//args: -Egocritic
|
||||||
|
//config_path: testdata/configs/gocritic.yml
|
||||||
package testdata
|
package testdata
|
||||||
|
|
||||||
import "flag"
|
import (
|
||||||
|
"flag"
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
var _ = *flag.Bool("global1", false, "") // ERROR "flagDeref: immediate deref in \*flag.Bool\(.global1., false, ..\) is most likely an error; consider using flag\.BoolVar"
|
var _ = *flag.Bool("global1", false, "") // ERROR "flagDeref: immediate deref in \*flag.Bool\(.global1., false, ..\) is most likely an error; consider using flag\.BoolVar"
|
||||||
|
|
||||||
|
type size1 struct {
|
||||||
|
a bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type size2 struct {
|
||||||
|
size1
|
||||||
|
b bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func gocriticRangeValCopySize1(ss []size1) {
|
||||||
|
for _, s := range ss {
|
||||||
|
log.Print(s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func gocriticRangeValCopySize2(ss []size2) {
|
||||||
|
for _, s := range ss { // ERROR "rangeValCopy: each iteration copies 2 bytes.*"
|
||||||
|
log.Print(s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user