revive: fix add-constant rule support. (#2003)

This commit is contained in:
Ludovic Fernandez 2021-05-19 17:39:10 +02:00 committed by GitHub
parent b73972f6af
commit cf8fd685d0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 41 additions and 6 deletions

View File

@ -495,7 +495,7 @@ linters-settings:
rowserrcheck: rowserrcheck:
packages: packages:
- github.com/jmoiron/sqlx - github.com/jmoiron/sqlx
-
revive: revive:
# see https://github.com/mgechev/revive#available-rules for details. # see https://github.com/mgechev/revive#available-rules for details.
ignore-generated-header: true ignore-generated-header: true
@ -503,6 +503,13 @@ linters-settings:
rules: rules:
- name: indent-error-flow - name: indent-error-flow
severity: warning severity: warning
- name: add-constant
severity: warning
arguments:
- maxLitCount: "3"
allowStrs: '""'
allowInts: "0,1,2"
allowFloats: "0.0,0.,1.0,1.,2.0,2."
staticcheck: staticcheck:
# Select the Go version to target. The default is '1.13'. # Select the Go version to target. The default is '1.13'.

View File

@ -4,7 +4,6 @@ import (
"bytes" "bytes"
"context" "context"
"crypto/sha256" "crypto/sha256"
"encoding/json"
"io" "io"
"os" "os"
"path/filepath" "path/filepath"
@ -16,6 +15,7 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag" "github.com/spf13/pflag"
"gopkg.in/yaml.v3"
"github.com/golangci/golangci-lint/internal/cache" "github.com/golangci/golangci-lint/internal/cache"
"github.com/golangci/golangci-lint/internal/pkgcache" "github.com/golangci/golangci-lint/internal/pkgcache"
@ -194,7 +194,7 @@ func computeConfigSalt(cfg *config.Config) ([]byte, error) {
// We don't hash all config fields to reduce meaningless cache // We don't hash all config fields to reduce meaningless cache
// invalidations. At least, it has a huge impact on tests speed. // invalidations. At least, it has a huge impact on tests speed.
lintersSettingsBytes, err := json.Marshal(cfg.LintersSettings) lintersSettingsBytes, err := yaml.Marshal(cfg.LintersSettings)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "failed to json marshal config linter settings") return nil, errors.Wrap(err, "failed to json marshal config linter settings")
} }

View File

@ -13,16 +13,20 @@ import (
reviveConfig "github.com/mgechev/revive/config" reviveConfig "github.com/mgechev/revive/config"
"github.com/mgechev/revive/lint" "github.com/mgechev/revive/lint"
"github.com/mgechev/revive/rule" "github.com/mgechev/revive/rule"
"github.com/pkg/errors"
"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/config"
"github.com/golangci/golangci-lint/pkg/golinters/goanalysis" "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
"github.com/golangci/golangci-lint/pkg/lint/linter" "github.com/golangci/golangci-lint/pkg/lint/linter"
"github.com/golangci/golangci-lint/pkg/logutils"
"github.com/golangci/golangci-lint/pkg/result" "github.com/golangci/golangci-lint/pkg/result"
) )
const reviveName = "revive" const reviveName = "revive"
var reviveDebugf = logutils.Debug("revive")
// jsonObject defines a JSON object of an failure // jsonObject defines a JSON object of an failure
type jsonObject struct { type jsonObject struct {
Severity lint.Severity Severity lint.Severity
@ -145,18 +149,20 @@ func getReviveConfig(cfg *config.ReviveSettings) (*lint.Config, error) {
err := toml.NewEncoder(buf).Encode(rawRoot) err := toml.NewEncoder(buf).Encode(rawRoot)
if err != nil { if err != nil {
return nil, err return nil, errors.Wrap(err, "failed to encode configuration")
} }
conf = &lint.Config{} conf = &lint.Config{}
_, err = toml.DecodeReader(buf, conf) _, err = toml.DecodeReader(buf, conf)
if err != nil { if err != nil {
return nil, err return nil, errors.Wrap(err, "failed to decode configuration")
} }
} }
normalizeConfig(conf) normalizeConfig(conf)
reviveDebugf("revive configuration: %#v", conf)
return conf, nil return conf, nil
} }
@ -184,7 +190,7 @@ func createConfigMap(cfg *config.ReviveSettings) map[string]interface{} {
for _, s := range cfg.Rules { for _, s := range cfg.Rules {
rawRules[s.Name] = map[string]interface{}{ rawRules[s.Name] = map[string]interface{}{
"severity": s.Severity, "severity": s.Severity,
"arguments": s.Arguments, "arguments": safeTomlSlice(s.Arguments),
} }
} }
@ -195,6 +201,28 @@ func createConfigMap(cfg *config.ReviveSettings) map[string]interface{} {
return rawRoot return rawRoot
} }
func safeTomlSlice(r []interface{}) []interface{} {
if len(r) == 0 {
return nil
}
if _, ok := r[0].(map[interface{}]interface{}); !ok {
return r
}
var typed []interface{}
for _, elt := range r {
item := map[string]interface{}{}
for k, v := range elt.(map[interface{}]interface{}) {
item[k.(string)] = v
}
typed = append(typed, item)
}
return typed
}
// This element is not exported by revive, so we need copy the code. // This element is not exported by revive, so we need copy the code.
// Extracted from https://github.com/mgechev/revive/blob/389ba853b0b3587f0c3b71b5f0c61ea4e23928ec/config/config.go#L15 // Extracted from https://github.com/mgechev/revive/blob/389ba853b0b3587f0c3b71b5f0c61ea4e23928ec/config/config.go#L15
var defaultRules = []lint.Rule{ var defaultRules = []lint.Rule{