aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/timonwong
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2025-01-22 16:07:17 +0100
committerTaras Madan <tarasmadan@google.com>2025-01-23 10:42:36 +0000
commit7b4377ad9d8a7205416df8d6217ef2b010f89481 (patch)
treee6fec4fd12ff807a16d847923f501075bf71d16c /vendor/github.com/timonwong
parent475a4c203afb8b7d3af51c4fd32bb170ff32a45e (diff)
vendor: delete
Diffstat (limited to 'vendor/github.com/timonwong')
-rw-r--r--vendor/github.com/timonwong/loggercheck/.codecov.yml16
-rw-r--r--vendor/github.com/timonwong/loggercheck/.gitignore9
-rw-r--r--vendor/github.com/timonwong/loggercheck/.golangci.yml94
-rw-r--r--vendor/github.com/timonwong/loggercheck/.goreleaser.yml59
-rw-r--r--vendor/github.com/timonwong/loggercheck/LICENSE21
-rw-r--r--vendor/github.com/timonwong/loggercheck/Makefile22
-rw-r--r--vendor/github.com/timonwong/loggercheck/README.md106
-rw-r--r--vendor/github.com/timonwong/loggercheck/internal/checkers/checker.go58
-rw-r--r--vendor/github.com/timonwong/loggercheck/internal/checkers/common.go46
-rw-r--r--vendor/github.com/timonwong/loggercheck/internal/checkers/filter.go35
-rw-r--r--vendor/github.com/timonwong/loggercheck/internal/checkers/general.go68
-rw-r--r--vendor/github.com/timonwong/loggercheck/internal/checkers/printf/printf.go252
-rw-r--r--vendor/github.com/timonwong/loggercheck/internal/checkers/slog.go19
-rw-r--r--vendor/github.com/timonwong/loggercheck/internal/checkers/zap.go21
-rw-r--r--vendor/github.com/timonwong/loggercheck/internal/rules/rules.go198
-rw-r--r--vendor/github.com/timonwong/loggercheck/internal/sets/string.go59
-rw-r--r--vendor/github.com/timonwong/loggercheck/internal/stringutil/is.go15
-rw-r--r--vendor/github.com/timonwong/loggercheck/loggercheck.go196
-rw-r--r--vendor/github.com/timonwong/loggercheck/options.go31
-rw-r--r--vendor/github.com/timonwong/loggercheck/staticrules.go96
20 files changed, 0 insertions, 1421 deletions
diff --git a/vendor/github.com/timonwong/loggercheck/.codecov.yml b/vendor/github.com/timonwong/loggercheck/.codecov.yml
deleted file mode 100644
index ef90457ca..000000000
--- a/vendor/github.com/timonwong/loggercheck/.codecov.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-coverage:
- range: 70..90 # green if 90+, red if 70-
- status:
- patch:
- # coverage status for pull request diff
- default:
- threshold: 1% # allow a little drop
- project:
- # coverage status for whole project
- default:
- target: auto # use coverage of base commit as target
- threshold: 1% # allow a little drop
-
-ignore:
- - "plugin/**"
- - "cmd/**"
diff --git a/vendor/github.com/timonwong/loggercheck/.gitignore b/vendor/github.com/timonwong/loggercheck/.gitignore
deleted file mode 100644
index 33df0df91..000000000
--- a/vendor/github.com/timonwong/loggercheck/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-.vscode/
-.idea/
-
-bin/
-vendor/
-
-dist/
-
-cover.out
diff --git a/vendor/github.com/timonwong/loggercheck/.golangci.yml b/vendor/github.com/timonwong/loggercheck/.golangci.yml
deleted file mode 100644
index 6d5e17bef..000000000
--- a/vendor/github.com/timonwong/loggercheck/.golangci.yml
+++ /dev/null
@@ -1,94 +0,0 @@
-linters-settings:
- dupl:
- threshold: 100
- funlen:
- lines: 100
- statements: 50
- goconst:
- min-len: 2
- min-occurrences: 3
- gocritic:
- enabled-tags:
- - diagnostic
- - experimental
- - opinionated
- - performance
- - style
- disabled-checks:
- - whyNoLint
- gocyclo:
- min-complexity: 15
- goimports:
- local-prefixes: github.com/timonwong/loggercheck
- mnd:
- # don't include the "operation" and "assign"
- checks:
- - argument
- - case
- - condition
- - return
- ignored-numbers:
- - '0'
- - '1'
- - '2'
- - '3'
- ignored-functions:
- - strings.SplitN
- - strconv.ParseInt
- govet:
- shadow: true
- lll:
- line-length: 140
- misspell:
- locale: US
- nolintlint:
- allow-unused: false # report any unused nolint directives
- require-explanation: false # don't require an explanation for nolint directives
- require-specific: false # don't require nolint directives to be specific about which linter is being skipped
-linters:
- disable-all: true
- enable:
- - bodyclose
- - dogsled
- - dupl
- - errcheck
- - copyloopvar
- - funlen
- - gochecknoinits
- - goconst
- - gocritic
- - gocyclo
- - gofumpt
- - goimports
- - mnd
- - goprintffuncname
- - gosec
- - gosimple
- - govet
- - ineffassign
- - lll
- - misspell
- - nakedret
- - noctx
- - nolintlint
- - revive
- - staticcheck
- - stylecheck
- - typecheck
- - unconvert
- - unparam
- - unused
- - whitespace
-
-issues:
- # Excluding configuration per-path, per-linter, per-text and per-source
- exclude-rules:
- - path: _test\.go
- linters:
- - mnd
- exclude-dirs:
- - testdata
-
-run:
- timeout: 5m
- go: '1.23' \ No newline at end of file
diff --git a/vendor/github.com/timonwong/loggercheck/.goreleaser.yml b/vendor/github.com/timonwong/loggercheck/.goreleaser.yml
deleted file mode 100644
index 55ffe7ea0..000000000
--- a/vendor/github.com/timonwong/loggercheck/.goreleaser.yml
+++ /dev/null
@@ -1,59 +0,0 @@
----
-project_name: loggercheck
-
-release:
- github:
- owner: timonwong
- name: loggercheck
-
-builds:
- - binary: loggercheck
- goos:
- - darwin
- - windows
- - linux
- goarch:
- - '386'
- - amd64
- - arm
- - arm64
- goarm:
- - '7'
- env:
- - CGO_ENABLED=0
- ignore:
- - goos: darwin
- goarch: '386'
- main: ./cmd/loggercheck/
- flags:
- - -trimpath
- ldflags: -s -w
-
-archives:
- - name_template: '{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}'
- format_overrides:
- - goos: windows
- format: zip
- files:
- - LICENSE
- - README.md
-
-snapshot:
- name_template: '{{ incpatch .Version }}-next'
-
-checksum:
- name_template: 'checksums.txt'
-
-changelog:
- sort: asc
- filters:
- exclude:
- - '(?i)^docs?:'
- - '(?i)^docs\([^:]+\):'
- - '(?i)^docs\[[^:]+\]:'
- - '^tests?:'
- - '(?i)^dev:'
- - '^build\(deps\): bump .* in /docs \(#\d+\)'
- - '^build\(deps\): bump .* in /\.github/peril \(#\d+\)'
- - Merge pull request
- - Merge branch
diff --git a/vendor/github.com/timonwong/loggercheck/LICENSE b/vendor/github.com/timonwong/loggercheck/LICENSE
deleted file mode 100644
index fb6531090..000000000
--- a/vendor/github.com/timonwong/loggercheck/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2022 Timon Wong
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/vendor/github.com/timonwong/loggercheck/Makefile b/vendor/github.com/timonwong/loggercheck/Makefile
deleted file mode 100644
index 37bf87202..000000000
--- a/vendor/github.com/timonwong/loggercheck/Makefile
+++ /dev/null
@@ -1,22 +0,0 @@
-.PHONY: lint
-lint:
- golangci-lint run ./...
-
-.PHONY: test-deps
-test-deps:
- cd testdata/src/a && go mod vendor
-
-.PHONY: test
-test: test-deps
- go test -v -covermode=atomic -coverprofile=cover.out -coverpkg ./... ./...
-
-.PHONY: build
-build:
- go build -o bin/loggercheck ./cmd/loggercheck
-
-.PHONY: build-plugin
-build-plugin:
- CGO_ENABLED=1 go build -o bin/loggercheck.so -buildmode=plugin ./plugin
-
-.PHONY: build-all
-build-all: build build-plugin
diff --git a/vendor/github.com/timonwong/loggercheck/README.md b/vendor/github.com/timonwong/loggercheck/README.md
deleted file mode 100644
index d8f86fc41..000000000
--- a/vendor/github.com/timonwong/loggercheck/README.md
+++ /dev/null
@@ -1,106 +0,0 @@
-# loggercheck
-
-## Description
-
-A linter checks the odd number of key and value pairs for common logger libraries:
-- [kitlog](https://github.com/go-kit/log)
-- [klog](https://github.com/kubernetes/klog)
-- [logr](https://github.com/go-logr/logr)
-- [zap](https://github.com/uber-go/zap)
-- [log/slog](https://pkg.go.dev/log/slog)
-
-It's recommended to use loggercheck with [golangci-lint](https://golangci-lint.run/usage/linters/#loggercheck).
-
-## Badges
-
-![Build Status](https://github.com/timonwong/loggercheck/workflows/CI/badge.svg)
-[![Coverage](https://img.shields.io/codecov/c/github/timonwong/loggercheck?token=Nutf41gwoG)](https://app.codecov.io/gh/timonwong/loggercheck)
-[![License](https://img.shields.io/github/license/timonwong/loggercheck.svg)](/LICENSE)
-[![Release](https://img.shields.io/github/release/timonwong/loggercheck.svg)](https://github.com/timonwong/loggercheck/releases/latest)
-
-## Install
-
-```shel
-go install github.com/timonwong/loggercheck/cmd/loggercheck
-```
-
-## Usage
-
-```
-loggercheck: Checks key value pairs for common logger libraries (kitlog,logr,klog,zap).
-
-Usage: loggercheck [-flag] [package]
-
-
-Flags:
- -V print version and exit
- -all
- no effect (deprecated)
- -c int
- display offending line with this many lines of context (default -1)
- -cpuprofile string
- write CPU profile to this file
- -debug string
- debug flags, any subset of "fpstv"
- -disable value
- comma-separated list of disabled logger checker (kitlog,klog,logr,zap) (default kitlog)
- -fix
- apply all suggested fixes
- -flags
- print analyzer flags in JSON
- -json
- emit JSON output
- -memprofile string
- write memory profile to this file
- -noprintflike
- require printf-like format specifier not present in args
- -requirestringkey
- require all logging keys to be inlined constant strings
- -rulefile string
- path to a file contains a list of rules
- -source
- no effect (deprecated)
- -tags string
- no effect (deprecated)
- -test
- indicates whether test files should be analyzed, too (default true)
- -trace string
- write trace log to this file
- -v no effect (deprecated)
-```
-
-## Example
-
-```go
-package a
-
-import (
- "context"
- "fmt"
-
- "github.com/go-logr/logr"
-)
-
-func Example() {
- log := logr.Discard()
- log = log.WithValues("key")
- log.Info("message", "key1", "value1", "key2", "value2", "key3")
- log.Error(fmt.Errorf("error"), "message", "key1", "value1", "key2")
- log.Error(fmt.Errorf("error"), "message", "key1", "value1", "key2", "value2")
-
- var log2 logr.Logger
- log2 = log
- log2.Info("message", "key1")
-
- log3 := logr.FromContextOrDiscard(context.TODO())
- log3.Error(fmt.Errorf("error"), "message", "key1")
-}
-```
-
-```
-a.go:12:23: odd number of arguments passed as key-value pairs for logging
-a.go:13:22: odd number of arguments passed as key-value pairs for logging
-a.go:14:44: odd number of arguments passed as key-value pairs for logging
-a.go:19:23: odd number of arguments passed as key-value pairs for logging
-a.go:22:45: odd number of arguments passed as key-value pairs for logging
-``` \ No newline at end of file
diff --git a/vendor/github.com/timonwong/loggercheck/internal/checkers/checker.go b/vendor/github.com/timonwong/loggercheck/internal/checkers/checker.go
deleted file mode 100644
index 5fa1cfb2c..000000000
--- a/vendor/github.com/timonwong/loggercheck/internal/checkers/checker.go
+++ /dev/null
@@ -1,58 +0,0 @@
-package checkers
-
-import (
- "go/ast"
- "go/types"
-
- "golang.org/x/tools/go/analysis"
-)
-
-type Config struct {
- RequireStringKey bool
- NoPrintfLike bool
-}
-
-type CallContext struct {
- Expr *ast.CallExpr
- Func *types.Func
- Signature *types.Signature
-}
-
-type Checker interface {
- FilterKeyAndValues(pass *analysis.Pass, keyAndValues []ast.Expr) []ast.Expr
- CheckLoggingKey(pass *analysis.Pass, keyAndValues []ast.Expr)
- CheckPrintfLikeSpecifier(pass *analysis.Pass, args []ast.Expr)
-}
-
-func ExecuteChecker(c Checker, pass *analysis.Pass, call CallContext, cfg Config) {
- params := call.Signature.Params()
- nparams := params.Len() // variadic => nonzero
- startIndex := nparams - 1
-
- iface, ok := types.Unalias(params.At(startIndex).Type().(*types.Slice).Elem()).(*types.Interface)
- if !ok || !iface.Empty() {
- return // final (args) param is not ...interface{}
- }
-
- keyValuesArgs := c.FilterKeyAndValues(pass, call.Expr.Args[startIndex:])
-
- if len(keyValuesArgs)%2 != 0 {
- firstArg := keyValuesArgs[0]
- lastArg := keyValuesArgs[len(keyValuesArgs)-1]
- pass.Report(analysis.Diagnostic{
- Pos: firstArg.Pos(),
- End: lastArg.End(),
- Category: DiagnosticCategory,
- Message: "odd number of arguments passed as key-value pairs for logging",
- })
- }
-
- if cfg.RequireStringKey {
- c.CheckLoggingKey(pass, keyValuesArgs)
- }
-
- if cfg.NoPrintfLike {
- // Check all args
- c.CheckPrintfLikeSpecifier(pass, call.Expr.Args)
- }
-}
diff --git a/vendor/github.com/timonwong/loggercheck/internal/checkers/common.go b/vendor/github.com/timonwong/loggercheck/internal/checkers/common.go
deleted file mode 100644
index 977f5d70c..000000000
--- a/vendor/github.com/timonwong/loggercheck/internal/checkers/common.go
+++ /dev/null
@@ -1,46 +0,0 @@
-package checkers
-
-import (
- "go/ast"
- "go/constant"
- "go/printer"
- "go/token"
- "go/types"
- "strings"
- "unicode/utf8"
-
- "golang.org/x/tools/go/analysis"
-)
-
-const (
- DiagnosticCategory = "logging"
-)
-
-// extractValueFromStringArg returns true if the argument is a string type (literal or constant).
-func extractValueFromStringArg(pass *analysis.Pass, arg ast.Expr) (value string, ok bool) {
- if typeAndValue, ok := pass.TypesInfo.Types[arg]; ok {
- if typ, ok := typeAndValue.Type.(*types.Basic); ok && typ.Kind() == types.String && typeAndValue.Value != nil {
- return constant.StringVal(typeAndValue.Value), true
- }
- }
-
- return "", false
-}
-
-func renderNodeEllipsis(fset *token.FileSet, v interface{}) string {
- const maxLen = 20
-
- buf := &strings.Builder{}
- _ = printer.Fprint(buf, fset, v)
- s := buf.String()
- if utf8.RuneCountInString(s) > maxLen {
- // Copied from go/constant/value.go
- i := 0
- for n := 0; n < maxLen-3; n++ {
- _, size := utf8.DecodeRuneInString(s[i:])
- i += size
- }
- s = s[:i] + "..."
- }
- return s
-}
diff --git a/vendor/github.com/timonwong/loggercheck/internal/checkers/filter.go b/vendor/github.com/timonwong/loggercheck/internal/checkers/filter.go
deleted file mode 100644
index a09a54f99..000000000
--- a/vendor/github.com/timonwong/loggercheck/internal/checkers/filter.go
+++ /dev/null
@@ -1,35 +0,0 @@
-package checkers
-
-import (
- "go/ast"
- "go/types"
-
- "golang.org/x/tools/go/analysis"
-)
-
-func filterKeyAndValues(pass *analysis.Pass, keyAndValues []ast.Expr, objName string) []ast.Expr {
- // Check the argument count
- filtered := make([]ast.Expr, 0, len(keyAndValues))
- for _, arg := range keyAndValues {
- // Skip any object type field we found
- switch arg := arg.(type) {
- case *ast.CallExpr, *ast.Ident:
- typ := types.Unalias(pass.TypesInfo.TypeOf(arg))
-
- switch typ := typ.(type) {
- case *types.Named:
- obj := typ.Obj()
- if obj != nil && obj.Name() == objName {
- continue
- }
-
- default:
- // pass
- }
- }
-
- filtered = append(filtered, arg)
- }
-
- return filtered
-}
diff --git a/vendor/github.com/timonwong/loggercheck/internal/checkers/general.go b/vendor/github.com/timonwong/loggercheck/internal/checkers/general.go
deleted file mode 100644
index 6512cce30..000000000
--- a/vendor/github.com/timonwong/loggercheck/internal/checkers/general.go
+++ /dev/null
@@ -1,68 +0,0 @@
-package checkers
-
-import (
- "fmt"
- "go/ast"
-
- "golang.org/x/tools/go/analysis"
-
- "github.com/timonwong/loggercheck/internal/checkers/printf"
- "github.com/timonwong/loggercheck/internal/stringutil"
-)
-
-type General struct{}
-
-func (g General) FilterKeyAndValues(_ *analysis.Pass, keyAndValues []ast.Expr) []ast.Expr {
- return keyAndValues
-}
-
-func (g General) CheckLoggingKey(pass *analysis.Pass, keyAndValues []ast.Expr) {
- for i := 0; i < len(keyAndValues); i += 2 {
- arg := keyAndValues[i]
- if value, ok := extractValueFromStringArg(pass, arg); ok {
- if stringutil.IsASCII(value) {
- continue
- }
-
- pass.Report(analysis.Diagnostic{
- Pos: arg.Pos(),
- End: arg.End(),
- Category: DiagnosticCategory,
- Message: fmt.Sprintf(
- "logging keys are expected to be alphanumeric strings, please remove any non-latin characters from %q",
- value),
- })
- } else {
- pass.Report(analysis.Diagnostic{
- Pos: arg.Pos(),
- End: arg.End(),
- Category: DiagnosticCategory,
- Message: fmt.Sprintf(
- "logging keys are expected to be inlined constant strings, please replace %q provided with string",
- renderNodeEllipsis(pass.Fset, arg)),
- })
- }
- }
-}
-
-func (g General) CheckPrintfLikeSpecifier(pass *analysis.Pass, args []ast.Expr) {
- for _, arg := range args {
- format, ok := extractValueFromStringArg(pass, arg)
- if !ok {
- continue
- }
-
- if specifier, ok := printf.IsPrintfLike(format); ok {
- pass.Report(analysis.Diagnostic{
- Pos: arg.Pos(),
- End: arg.End(),
- Category: DiagnosticCategory,
- Message: fmt.Sprintf("logging message should not use format specifier %q", specifier),
- })
-
- return // One error diagnostic is enough
- }
- }
-}
-
-var _ Checker = (*General)(nil)
diff --git a/vendor/github.com/timonwong/loggercheck/internal/checkers/printf/printf.go b/vendor/github.com/timonwong/loggercheck/internal/checkers/printf/printf.go
deleted file mode 100644
index 926b57e04..000000000
--- a/vendor/github.com/timonwong/loggercheck/internal/checkers/printf/printf.go
+++ /dev/null
@@ -1,252 +0,0 @@
-package printf
-
-import (
- "strconv"
- "strings"
- "unicode/utf8"
-)
-
-// Copied from golang.org/x/tools
-// Copyright 2010 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-type printVerb struct {
- verb rune // User may provide verb through Formatter; could be a rune.
- flags string // known flags are all ASCII
-}
-
-// Common flag sets for printf verbs.
-const (
- noFlag = ""
- numFlag = " -+.0"
- sharpNumFlag = " -+.0#"
- allFlags = " -+.0#"
-)
-
-// printVerbs identifies which flags are known to printf for each verb.
-var printVerbs = []printVerb{
- // '-' is a width modifier, always valid.
- // '.' is a precision for float, max width for strings.
- // '+' is required sign for numbers, Go format for %v.
- // '#' is alternate format for several verbs.
- // ' ' is spacer for numbers
- {'%', noFlag},
- {'b', sharpNumFlag},
- {'c', "-"},
- {'d', numFlag},
- {'e', sharpNumFlag},
- {'E', sharpNumFlag},
- {'f', sharpNumFlag},
- {'F', sharpNumFlag},
- {'g', sharpNumFlag},
- {'G', sharpNumFlag},
- {'o', sharpNumFlag},
- {'O', sharpNumFlag},
- {'p', "-#"},
- {'q', " -+.0#"},
- {'s', " -+.0"},
- {'t', "-"},
- {'T', "-"},
- {'U', "-#"},
- {'v', allFlags},
- {'w', allFlags},
- {'x', sharpNumFlag},
- {'X', sharpNumFlag},
-}
-
-// formatState holds the parsed representation of a printf directive such as "%3.*[4]d".
-// It is constructed by parsePrintfVerb.
-type formatState struct {
- verb rune // the format verb: 'd' for "%d"
- format string // the full format directive from % through verb, "%.3d".
- flags []byte // the list of # + etc.
- // Used only during parse.
- hasIndex bool // Whether the argument is indexed.
- indexPending bool // Whether we have an indexed argument that has not resolved.
- nbytes int // number of bytes of the format string consumed.
-}
-
-// parseFlags accepts any printf flags.
-func (s *formatState) parseFlags() {
- for s.nbytes < len(s.format) {
- switch c := s.format[s.nbytes]; c {
- case '#', '0', '+', '-', ' ':
- s.flags = append(s.flags, c)
- s.nbytes++
- default:
- return
- }
- }
-}
-
-// scanNum advances through a decimal number if present.
-func (s *formatState) scanNum() {
- for ; s.nbytes < len(s.format); s.nbytes++ {
- c := s.format[s.nbytes]
- if c < '0' || '9' < c {
- return
- }
- }
-}
-
-func stringIndexAt(s, substr string, start int) int {
- idx := strings.Index(s[start:], substr)
- if idx < 0 {
- return idx
- }
- return idx + start
-}
-
-// parseIndex scans an index expression. It returns false if there is a syntax error.
-func (s *formatState) parseIndex() bool {
- if s.nbytes == len(s.format) || s.format[s.nbytes] != '[' {
- return true
- }
- // Argument index present.
- s.nbytes++ // skip '['
- start := s.nbytes
- s.scanNum()
- ok := true
- if s.nbytes == len(s.format) || s.nbytes == start || s.format[s.nbytes] != ']' {
- ok = false
- s.nbytes = stringIndexAt(s.format, "]", start)
- if s.nbytes < 0 {
- return false
- }
- }
- arg32, err := strconv.ParseInt(s.format[start:s.nbytes], 10, 32)
- if err != nil || !ok || arg32 <= 0 {
- return false
- }
- s.nbytes++ // skip ']'
- s.hasIndex = true
- s.indexPending = true
- return true
-}
-
-// parseNum scans a width or precision (or *).
-func (s *formatState) parseNum() {
- if s.nbytes < len(s.format) && s.format[s.nbytes] == '*' {
- if s.indexPending { // Absorb it.
- s.indexPending = false
- }
- s.nbytes++
- } else {
- s.scanNum()
- }
-}
-
-// parsePrecision scans for a precision. It returns false if there's a bad index expression.
-func (s *formatState) parsePrecision() bool {
- // If there's a period, there may be a precision.
- if s.nbytes < len(s.format) && s.format[s.nbytes] == '.' {
- s.flags = append(s.flags, '.') // Treat precision as a flag.
- s.nbytes++
- if !s.parseIndex() {
- return false
- }
- s.parseNum()
- }
- return true
-}
-
-// parsePrintfVerb looks the formatting directive that begins the format string
-// and returns a formatState that encodes what the directive wants, without looking
-// at the actual arguments present in the call. The result is nil if there is an error.
-func parsePrintfVerb(format string) *formatState {
- state := &formatState{
- format: format,
- flags: make([]byte, 0, 5), //nolint:mnd
- nbytes: 1, // There's guaranteed to be a percent sign.
- }
-
- // There may be flags.
- state.parseFlags()
- // There may be an index.
- if !state.parseIndex() {
- return nil
- }
- // There may be a width.
- state.parseNum()
- // There may be a precision.
- if !state.parsePrecision() {
- return nil
- }
- // Now a verb, possibly prefixed by an index (which we may already have).
- if !state.indexPending && !state.parseIndex() {
- return nil
- }
- if state.nbytes == len(state.format) {
- // missing verb at end of string
- return nil
- }
- verb, w := utf8.DecodeRuneInString(state.format[state.nbytes:])
- state.verb = verb
- state.nbytes += w
- state.format = state.format[:state.nbytes]
- return state
-}
-
-func containsAll(s string, pattern []byte) bool {
- for _, c := range pattern {
- if !strings.ContainsRune(s, rune(c)) {
- return false
- }
- }
- return true
-}
-
-func isPrintfArg(state *formatState) bool {
- var v printVerb
- found := false
- // Linear scan is fast enough for a small list.
- for _, v = range printVerbs {
- if v.verb == state.verb {
- found = true
- break
- }
- }
-
- if !found {
- // unknown verb, just skip
- return false
- }
-
- if !containsAll(v.flags, state.flags) {
- // unrecognized format flag, just skip
- return false
- }
-
- return true
-}
-
-func IsPrintfLike(format string) (firstSpecifier string, ok bool) {
- if !strings.Contains(format, "%") {
- return "", false
- }
-
- for i, w := 0, 0; i < len(format); i += w {
- w = 1
- if format[i] != '%' {
- continue
- }
-
- state := parsePrintfVerb(format[i:])
- if state == nil {
- return "", false
- }
-
- w = len(state.format)
- if !isPrintfArg(state) {
- return "", false
- }
-
- if !ok {
- firstSpecifier = state.format
- ok = true
- }
- }
-
- return
-}
diff --git a/vendor/github.com/timonwong/loggercheck/internal/checkers/slog.go b/vendor/github.com/timonwong/loggercheck/internal/checkers/slog.go
deleted file mode 100644
index 5812e6660..000000000
--- a/vendor/github.com/timonwong/loggercheck/internal/checkers/slog.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package checkers
-
-import (
- "go/ast"
-
- "golang.org/x/tools/go/analysis"
-)
-
-type Slog struct {
- General
-}
-
-func (z Slog) FilterKeyAndValues(pass *analysis.Pass, keyAndValues []ast.Expr) []ast.Expr {
- // check slog.Group() constructed group slog.Attr
- // since we also check `slog.Group` so it is OK skip here
- return filterKeyAndValues(pass, keyAndValues, "Attr")
-}
-
-var _ Checker = (*Slog)(nil)
diff --git a/vendor/github.com/timonwong/loggercheck/internal/checkers/zap.go b/vendor/github.com/timonwong/loggercheck/internal/checkers/zap.go
deleted file mode 100644
index 4dac21f78..000000000
--- a/vendor/github.com/timonwong/loggercheck/internal/checkers/zap.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package checkers
-
-import (
- "go/ast"
-
- "golang.org/x/tools/go/analysis"
-)
-
-type Zap struct {
- General
-}
-
-func (z Zap) FilterKeyAndValues(pass *analysis.Pass, keyAndValues []ast.Expr) []ast.Expr {
- // Skip any zapcore.Field we found
- // This is a strongly-typed field. Consume it and move on.
- // Actually it's go.uber.org/zap/zapcore.Field, however for simplicity
- // we don't check the import path
- return filterKeyAndValues(pass, keyAndValues, "Field")
-}
-
-var _ Checker = (*Zap)(nil)
diff --git a/vendor/github.com/timonwong/loggercheck/internal/rules/rules.go b/vendor/github.com/timonwong/loggercheck/internal/rules/rules.go
deleted file mode 100644
index 3ed69b5bd..000000000
--- a/vendor/github.com/timonwong/loggercheck/internal/rules/rules.go
+++ /dev/null
@@ -1,198 +0,0 @@
-package rules
-
-import (
- "bufio"
- "errors"
- "fmt"
- "go/types"
- "io"
- "strings"
-)
-
-var ErrInvalidRule = errors.New("invalid rule format")
-
-const CustomRulesetName = "custom"
-
-type Ruleset struct {
- Name string
- PackageImport string
- Rules []FuncRule
-
- ruleIndicesByFuncName map[string][]int
-}
-
-func (rs *Ruleset) Match(fn *types.Func) bool {
- // PackageImport is already checked (by indices), skip checking it here
- sig := fn.Type().(*types.Signature) // it's safe since we already checked
-
- // Fail fast if the function name is not in the rule list.
- indices, ok := rs.ruleIndicesByFuncName[fn.Name()]
- if !ok {
- return false
- }
-
- for _, idx := range indices {
- rule := &rs.Rules[idx]
- if matchRule(rule, sig) {
- return true
- }
- }
-
- return false
-}
-
-func receiverTypeOf(recvType types.Type) string {
- buf := &strings.Builder{}
-
- var recvNamed *types.Named
- switch recvType := recvType.(type) {
- case *types.Pointer:
- buf.WriteByte('*')
- if elem, ok := recvType.Elem().(*types.Named); ok {
- recvNamed = elem
- }
- case *types.Named:
- recvNamed = recvType
- }
-
- if recvNamed == nil {
- // not supported type
- return ""
- }
-
- buf.WriteString(recvNamed.Obj().Name())
- typeParams := recvNamed.TypeParams()
- if typeParamsLen := typeParams.Len(); typeParamsLen > 0 {
- buf.WriteByte('[')
- for i := 0; i < typeParamsLen; i++ {
- if i > 0 {
- // comma as separator
- buf.WriteByte(',')
- }
- p := typeParams.At(i)
- buf.WriteString(p.Obj().Name())
- }
- buf.WriteByte(']')
- }
-
- return buf.String()
-}
-
-func matchRule(p *FuncRule, sig *types.Signature) bool {
- // we do not check package import here since it's already checked in Match()
- recv := sig.Recv()
- isReceiver := recv != nil
- if isReceiver != p.IsReceiver {
- return false
- }
-
- if isReceiver {
- recvType := recv.Type()
- receiverType := receiverTypeOf(recvType)
- if receiverType != p.ReceiverType {
- return false
- }
- }
-
- return true
-}
-
-type FuncRule struct { // package import should be accessed from Rulset
- ReceiverType string
- FuncName string
- IsReceiver bool
-}
-
-func ParseFuncRule(rule string) (packageImport string, pat FuncRule, err error) {
- lastDot := strings.LastIndexFunc(rule, func(r rune) bool {
- return r == '.' || r == '/'
- })
- if lastDot == -1 || rule[lastDot] == '/' {
- return "", pat, ErrInvalidRule
- }
-
- importOrReceiver := rule[:lastDot]
- pat.FuncName = rule[lastDot+1:]
-
- if strings.HasPrefix(rule, "(") { // package
- if !strings.HasSuffix(importOrReceiver, ")") {
- return "", FuncRule{}, ErrInvalidRule
- }
-
- var isPointerReceiver bool
- pat.IsReceiver = true
- receiver := importOrReceiver[1 : len(importOrReceiver)-1]
- if strings.HasPrefix(receiver, "*") {
- isPointerReceiver = true
- receiver = receiver[1:]
- }
-
- typeDotIdx := strings.LastIndexFunc(receiver, func(r rune) bool {
- return r == '.' || r == '/'
- })
- if typeDotIdx == -1 || receiver[typeDotIdx] == '/' {
- return "", FuncRule{}, ErrInvalidRule
- }
- receiverType := receiver[typeDotIdx+1:]
- if isPointerReceiver {
- receiverType = "*" + receiverType
- }
- pat.ReceiverType = receiverType
- packageImport = receiver[:typeDotIdx]
- } else {
- packageImport = importOrReceiver
- }
-
- return packageImport, pat, nil
-}
-
-func ParseRules(lines []string) (result []Ruleset, err error) {
- rulesByImport := make(map[string][]FuncRule)
- for i, line := range lines {
- if line == "" {
- continue
- }
-
- if strings.HasPrefix(line, "#") { // comments
- continue
- }
-
- packageImport, pat, err := ParseFuncRule(line)
- if err != nil {
- return nil, fmt.Errorf("error parse rule at line %d: %w", i+1, err)
- }
- rulesByImport[packageImport] = append(rulesByImport[packageImport], pat)
- }
-
- for packageImport, rules := range rulesByImport {
- ruleIndicesByFuncName := make(map[string][]int, len(rules))
- for idx, rule := range rules {
- fnName := rule.FuncName
- ruleIndicesByFuncName[fnName] = append(ruleIndicesByFuncName[fnName], idx)
- }
-
- result = append(result, Ruleset{
- Name: CustomRulesetName, // NOTE(timonwong) Always "custom" for custom rule
- PackageImport: packageImport,
- Rules: rules,
- ruleIndicesByFuncName: ruleIndicesByFuncName,
- })
- }
- return result, nil
-}
-
-func ParseRuleFile(r io.Reader) (result []Ruleset, err error) {
- // Rule files are relatively small, so read it into string slice first.
- var lines []string
-
- scanner := bufio.NewScanner(r)
- for scanner.Scan() {
- line := strings.TrimSpace(scanner.Text())
- lines = append(lines, line)
- }
- if err := scanner.Err(); err != nil {
- return nil, err
- }
-
- return ParseRules(lines)
-}
diff --git a/vendor/github.com/timonwong/loggercheck/internal/sets/string.go b/vendor/github.com/timonwong/loggercheck/internal/sets/string.go
deleted file mode 100644
index daf8d57fc..000000000
--- a/vendor/github.com/timonwong/loggercheck/internal/sets/string.go
+++ /dev/null
@@ -1,59 +0,0 @@
-package sets
-
-import (
- "sort"
- "strings"
-)
-
-type Empty struct{}
-
-type StringSet map[string]Empty
-
-func NewString(items ...string) StringSet {
- s := make(StringSet)
- s.Insert(items...)
- return s
-}
-
-func (s StringSet) Insert(items ...string) {
- for _, item := range items {
- s[item] = Empty{}
- }
-}
-
-func (s StringSet) Has(item string) bool {
- _, contained := s[item]
- return contained
-}
-
-func (s StringSet) List() []string {
- if len(s) == 0 {
- return nil
- }
-
- res := make([]string, 0, len(s))
- for key := range s {
- res = append(res, key)
- }
- sort.Strings(res)
- return res
-}
-
-// Set implements flag.Value interface.
-func (s *StringSet) Set(v string) error {
- v = strings.TrimSpace(v)
- if v == "" {
- *s = nil
- return nil
- }
-
- parts := strings.Split(v, ",")
- set := NewString(parts...)
- *s = set
- return nil
-}
-
-// String implements flag.Value interface
-func (s StringSet) String() string {
- return strings.Join(s.List(), ",")
-}
diff --git a/vendor/github.com/timonwong/loggercheck/internal/stringutil/is.go b/vendor/github.com/timonwong/loggercheck/internal/stringutil/is.go
deleted file mode 100644
index a36b742fc..000000000
--- a/vendor/github.com/timonwong/loggercheck/internal/stringutil/is.go
+++ /dev/null
@@ -1,15 +0,0 @@
-package stringutil
-
-import "unicode/utf8"
-
-// IsASCII returns true if string are ASCII.
-func IsASCII(s string) bool {
- for _, r := range s {
- if r >= utf8.RuneSelf {
- // Not ASCII.
- return false
- }
- }
-
- return true
-}
diff --git a/vendor/github.com/timonwong/loggercheck/loggercheck.go b/vendor/github.com/timonwong/loggercheck/loggercheck.go
deleted file mode 100644
index d418c7629..000000000
--- a/vendor/github.com/timonwong/loggercheck/loggercheck.go
+++ /dev/null
@@ -1,196 +0,0 @@
-package loggercheck
-
-import (
- "flag"
- "fmt"
- "go/ast"
- "go/types"
- "os"
- "strings"
-
- "golang.org/x/tools/go/analysis"
- "golang.org/x/tools/go/analysis/passes/inspect"
- "golang.org/x/tools/go/ast/inspector"
- "golang.org/x/tools/go/types/typeutil"
-
- "github.com/timonwong/loggercheck/internal/checkers"
- "github.com/timonwong/loggercheck/internal/rules"
- "github.com/timonwong/loggercheck/internal/sets"
-)
-
-const Doc = `Checks key value pairs for common logger libraries (kitlog,klog,logr,zap).`
-
-func NewAnalyzer(opts ...Option) *analysis.Analyzer {
- l := newLoggerCheck(opts...)
- a := &analysis.Analyzer{
- Name: "loggercheck",
- Doc: Doc,
- Flags: *l.fs,
- Run: l.run,
- Requires: []*analysis.Analyzer{inspect.Analyzer},
- }
- return a
-}
-
-type loggercheck struct {
- fs *flag.FlagSet
-
- disable sets.StringSet // flag -disable
- ruleFile string // flag -rulefile
- requireStringKey bool // flag -requirestringkey
- noPrintfLike bool // flag -noprintflike
-
- rules []string // used for external integration, for example golangci-lint
- rulesetList []rules.Ruleset // populate at runtime
- rulesetIndicesByImport map[string][]int // ruleset index, populate at runtime
-}
-
-func newLoggerCheck(opts ...Option) *loggercheck {
- fs := flag.NewFlagSet("loggercheck", flag.ExitOnError)
- l := &loggercheck{
- fs: fs,
- disable: sets.NewString("kitlog"),
- rulesetList: append([]rules.Ruleset{}, staticRuleList...), // ensure we make a clone of static rules first
- }
-
- fs.StringVar(&l.ruleFile, "rulefile", "", "path to a file contains a list of rules")
- fs.Var(&l.disable, "disable", "comma-separated list of disabled logger checker (kitlog,klog,logr,zap,slog)")
- fs.BoolVar(&l.requireStringKey, "requirestringkey", false, "require all logging keys to be inlined constant strings")
- fs.BoolVar(&l.noPrintfLike, "noprintflike", false, "require printf-like format specifier not present in args")
-
- for _, opt := range opts {
- opt(l)
- }
-
- return l
-}
-
-func (l *loggercheck) isCheckerDisabled(name string) bool {
- return l.disable.Has(name)
-}
-
-// vendorLessPath returns the devendorized version of the import path ipath.
-// For example: "a/vendor/github.com/go-logr/logr" will become "github.com/go-logr/logr".
-func vendorLessPath(ipath string) string {
- if i := strings.LastIndex(ipath, "/vendor/"); i >= 0 {
- return ipath[i+len("/vendor/"):]
- }
- return ipath
-}
-
-func (l *loggercheck) getCheckerForFunc(fn *types.Func) checkers.Checker {
- pkg := fn.Pkg()
- if pkg == nil {
- return nil
- }
-
- pkgPath := vendorLessPath(pkg.Path())
- indices := l.rulesetIndicesByImport[pkgPath]
-
- for _, idx := range indices {
- rs := &l.rulesetList[idx]
- if l.isCheckerDisabled(rs.Name) {
- // Skip ignored logger checker.
- continue
- }
-
- if !rs.Match(fn) {
- continue
- }
-
- checker := checkerByRulesetName[rs.Name]
- if checker == nil {
- return checkers.General{}
- }
- return checker
- }
-
- return nil
-}
-
-func (l *loggercheck) checkLoggerArguments(pass *analysis.Pass, call *ast.CallExpr) {
- fn, _ := typeutil.Callee(pass.TypesInfo, call).(*types.Func)
- if fn == nil {
- return // function pointer is not supported
- }
-
- sig, ok := fn.Type().(*types.Signature)
- if !ok || !sig.Variadic() {
- return // not variadic
- }
-
- // ellipsis args is hard, just skip
- if call.Ellipsis.IsValid() {
- return
- }
-
- checker := l.getCheckerForFunc(fn)
- if checker == nil {
- return
- }
-
- checkers.ExecuteChecker(checker, pass, checkers.CallContext{
- Expr: call,
- Func: fn,
- Signature: sig,
- }, checkers.Config{
- RequireStringKey: l.requireStringKey,
- NoPrintfLike: l.noPrintfLike,
- })
-}
-
-func (l *loggercheck) processConfig() error {
- if l.ruleFile != "" { // flags takes precedence over configs
- f, err := os.Open(l.ruleFile)
- if err != nil {
- return fmt.Errorf("failed to open rule file: %w", err)
- }
- defer f.Close()
-
- custom, err := rules.ParseRuleFile(f)
- if err != nil {
- return fmt.Errorf("failed to parse rule file: %w", err)
- }
- l.rulesetList = append(l.rulesetList, custom...)
- } else if len(l.rules) > 0 {
- custom, err := rules.ParseRules(l.rules)
- if err != nil {
- return fmt.Errorf("failed to parse rules: %w", err)
- }
- l.rulesetList = append(l.rulesetList, custom...)
- }
-
- // Build index
- indices := make(map[string][]int)
- for i, rs := range l.rulesetList {
- indices[rs.PackageImport] = append(indices[rs.PackageImport], i)
- }
- l.rulesetIndicesByImport = indices
-
- return nil
-}
-
-func (l *loggercheck) run(pass *analysis.Pass) (interface{}, error) {
- err := l.processConfig()
- if err != nil {
- return nil, err
- }
-
- insp := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
- nodeFilter := []ast.Node{
- (*ast.CallExpr)(nil),
- }
- insp.Preorder(nodeFilter, func(node ast.Node) {
- call := node.(*ast.CallExpr)
-
- typ := pass.TypesInfo.Types[call.Fun].Type
- if typ == nil {
- // Skip checking functions with unknown type.
- return
- }
-
- l.checkLoggerArguments(pass, call)
- })
-
- return nil, nil
-}
diff --git a/vendor/github.com/timonwong/loggercheck/options.go b/vendor/github.com/timonwong/loggercheck/options.go
deleted file mode 100644
index 6b5f00af1..000000000
--- a/vendor/github.com/timonwong/loggercheck/options.go
+++ /dev/null
@@ -1,31 +0,0 @@
-package loggercheck
-
-import (
- "github.com/timonwong/loggercheck/internal/sets"
-)
-
-type Option func(*loggercheck)
-
-func WithDisable(disable []string) Option {
- return func(l *loggercheck) {
- l.disable = sets.NewString(disable...)
- }
-}
-
-func WithRules(customRules []string) Option {
- return func(l *loggercheck) {
- l.rules = customRules
- }
-}
-
-func WithRequireStringKey(requireStringKey bool) Option {
- return func(l *loggercheck) {
- l.requireStringKey = requireStringKey
- }
-}
-
-func WithNoPrintfLike(noPrintfLike bool) Option {
- return func(l *loggercheck) {
- l.noPrintfLike = noPrintfLike
- }
-}
diff --git a/vendor/github.com/timonwong/loggercheck/staticrules.go b/vendor/github.com/timonwong/loggercheck/staticrules.go
deleted file mode 100644
index 1398e47b2..000000000
--- a/vendor/github.com/timonwong/loggercheck/staticrules.go
+++ /dev/null
@@ -1,96 +0,0 @@
-package loggercheck
-
-import (
- "errors"
- "fmt"
-
- "github.com/timonwong/loggercheck/internal/checkers"
- "github.com/timonwong/loggercheck/internal/rules"
-)
-
-var (
- staticRuleList = []rules.Ruleset{
- mustNewStaticRuleSet("logr", []string{
- "(github.com/go-logr/logr.Logger).Error",
- "(github.com/go-logr/logr.Logger).Info",
- "(github.com/go-logr/logr.Logger).WithValues",
- }),
- mustNewStaticRuleSet("klog", []string{
- "k8s.io/klog/v2.InfoS",
- "k8s.io/klog/v2.InfoSDepth",
- "k8s.io/klog/v2.ErrorS",
- "(k8s.io/klog/v2.Verbose).InfoS",
- "(k8s.io/klog/v2.Verbose).InfoSDepth",
- "(k8s.io/klog/v2.Verbose).ErrorS",
- }),
- mustNewStaticRuleSet("zap", []string{
- "(*go.uber.org/zap.SugaredLogger).With",
- "(*go.uber.org/zap.SugaredLogger).Debugw",
- "(*go.uber.org/zap.SugaredLogger).Infow",
- "(*go.uber.org/zap.SugaredLogger).Warnw",
- "(*go.uber.org/zap.SugaredLogger).Errorw",
- "(*go.uber.org/zap.SugaredLogger).DPanicw",
- "(*go.uber.org/zap.SugaredLogger).Panicw",
- "(*go.uber.org/zap.SugaredLogger).Fatalw",
- }),
- mustNewStaticRuleSet("kitlog", []string{
- "github.com/go-kit/log.With",
- "github.com/go-kit/log.WithPrefix",
- "github.com/go-kit/log.WithSuffix",
- "(github.com/go-kit/log.Logger).Log",
- }),
- mustNewStaticRuleSet("slog", []string{
- "log/slog.Group",
-
- "log/slog.With",
-
- "log/slog.Debug",
- "log/slog.Info",
- "log/slog.Warn",
- "log/slog.Error",
-
- "log/slog.DebugContext",
- "log/slog.InfoContext",
- "log/slog.WarnContext",
- "log/slog.ErrorContext",
-
- "(*log/slog.Logger).With",
-
- "(*log/slog.Logger).Debug",
- "(*log/slog.Logger).Info",
- "(*log/slog.Logger).Warn",
- "(*log/slog.Logger).Error",
-
- "(*log/slog.Logger).DebugContext",
- "(*log/slog.Logger).InfoContext",
- "(*log/slog.Logger).WarnContext",
- "(*log/slog.Logger).ErrorContext",
- }),
- }
- checkerByRulesetName = map[string]checkers.Checker{
- // by default, checkers.General will be used.
- "zap": checkers.Zap{},
- "slog": checkers.Slog{},
- }
-)
-
-// mustNewStaticRuleSet only called at init, catch errors during development.
-// In production it will not panic.
-func mustNewStaticRuleSet(name string, lines []string) rules.Ruleset {
- if len(lines) == 0 {
- panic(errors.New("no rules provided"))
- }
-
- rulesetList, err := rules.ParseRules(lines)
- if err != nil {
- panic(err)
- }
-
- if len(rulesetList) != 1 {
- panic(fmt.Errorf("expected 1 ruleset, got %d", len(rulesetList)))
- }
-
- ruleset := rulesetList[0]
- ruleset.Name = name
- return ruleset
-}