diff options
| author | Taras Madan <tarasmadan@google.com> | 2024-11-11 11:41:38 +0100 |
|---|---|---|
| committer | Taras Madan <tarasmadan@google.com> | 2024-11-11 11:10:48 +0000 |
| commit | 27e76fae2ee2d84dc7db63af1d9ed7358ba35b7a (patch) | |
| tree | ed19c0e35e272b3c4cc5a2f2c595e035b2428337 /vendor/github.com/go-critic | |
| parent | 621e84e063b0e15b23e17780338627c509e1b9e8 (diff) | |
vendor: update
Diffstat (limited to 'vendor/github.com/go-critic')
5 files changed, 104 insertions, 4 deletions
diff --git a/vendor/github.com/go-critic/go-critic/checkers/caseOrder_checker.go b/vendor/github.com/go-critic/go-critic/checkers/caseOrder_checker.go index 306756834..345274f1c 100644 --- a/vendor/github.com/go-critic/go-critic/checkers/caseOrder_checker.go +++ b/vendor/github.com/go-critic/go-critic/checkers/caseOrder_checker.go @@ -82,7 +82,7 @@ func (c *caseOrderChecker) warnUnknownType(cause, concrete ast.Node) { c.ctx.Warn(cause, "type is not defined %s", concrete) } -func (c *caseOrderChecker) checkSwitch(s *ast.SwitchStmt) { +func (c *caseOrderChecker) checkSwitch(_ *ast.SwitchStmt) { // TODO(quasilyte): can handle expression cases that overlap. // Cases that have narrower value range should go before wider ones. } diff --git a/vendor/github.com/go-critic/go-critic/checkers/internal/astwalk/walk_handler.go b/vendor/github.com/go-critic/go-critic/checkers/internal/astwalk/walk_handler.go index 1f6e948d5..96d2dd0e6 100644 --- a/vendor/github.com/go-critic/go-critic/checkers/internal/astwalk/walk_handler.go +++ b/vendor/github.com/go-critic/go-critic/checkers/internal/astwalk/walk_handler.go @@ -17,7 +17,7 @@ type WalkHandler struct { // EnterFile is a default walkerEvents.EnterFile implementation // that reports every file as accepted candidate for checking. -func (w *WalkHandler) EnterFile(f *ast.File) bool { +func (w *WalkHandler) EnterFile(_ *ast.File) bool { return true } diff --git a/vendor/github.com/go-critic/go-critic/checkers/rangeAppendAll_checker.go b/vendor/github.com/go-critic/go-critic/checkers/rangeAppendAll_checker.go new file mode 100644 index 000000000..f4851d402 --- /dev/null +++ b/vendor/github.com/go-critic/go-critic/checkers/rangeAppendAll_checker.go @@ -0,0 +1,100 @@ +package checkers + +import ( + "go/ast" + "go/token" + + "github.com/go-critic/go-critic/checkers/internal/astwalk" + "github.com/go-critic/go-critic/linter" + "github.com/go-toolsmith/astcast" + "golang.org/x/tools/go/ast/astutil" +) + +func init() { + var info linter.CheckerInfo + info.Name = "rangeAppendAll" + info.Tags = []string{linter.DiagnosticTag, linter.ExperimentalTag} + info.Summary = "Detects append all its data while range it" + info.Before = `for _, n := range ns { + ... + rs = append(rs, ns...) // append all slice data + } +}` + info.After = `for _, n := range ns { + ... + rs = append(rs, n) + } +}` + + collection.AddChecker(&info, func(ctx *linter.CheckerContext) (linter.FileWalker, error) { + c := &rangeAppendAllChecker{ctx: ctx} + return astwalk.WalkerForStmt(c), nil + }) +} + +type rangeAppendAllChecker struct { + astwalk.WalkHandler + ctx *linter.CheckerContext +} + +func (c *rangeAppendAllChecker) VisitStmt(stmt ast.Stmt) { + rangeStmt, ok := stmt.(*ast.RangeStmt) + if !ok || len(rangeStmt.Body.List) == 0 { + return + } + rangeIdent, ok := rangeStmt.X.(*ast.Ident) + if !ok { + return + } + rangeObj := c.ctx.TypesInfo.ObjectOf(rangeIdent) + + astutil.Apply(rangeStmt.Body, nil, func(cur *astutil.Cursor) bool { + appendFrom := c.getValidAppendFrom(cur.Node()) + if appendFrom != nil { + appendFromObj := c.ctx.TypesInfo.ObjectOf(appendFrom) + if appendFromObj == rangeObj { + c.warn(appendFrom) + } + } + return true + }) +} + +func (c *rangeAppendAllChecker) getValidAppendFrom(expr ast.Node) *ast.Ident { + call := astcast.ToCallExpr(expr) + if len(call.Args) != 2 || call.Ellipsis == token.NoPos { + return nil + } + if qualifiedName(call.Fun) != "append" { + return nil + } + if c.isSliceLiteral(call.Args[0]) { + return nil + } + appendFrom, ok := call.Args[1].(*ast.Ident) + if !ok { + return nil + } + return appendFrom +} + +func (c *rangeAppendAllChecker) isSliceLiteral(arg ast.Expr) bool { + switch v := arg.(type) { + // []T{}, []T{n} + case *ast.CompositeLit: + return true + // []T(nil) + case *ast.CallExpr: + if astcast.ToArrayType(v.Fun) != astcast.NilArrayType && len(v.Args) == 1 { + id := astcast.ToIdent(v.Args[0]) + return id.Name == "nil" && id.Obj == nil + } + return false + default: + return false + } +} + +func (c *rangeAppendAllChecker) warn(appendFrom *ast.Ident) { + c.ctx.Warn(appendFrom, "append all `%s` data while range it", appendFrom) +} diff --git a/vendor/github.com/go-critic/go-critic/checkers/ruleguard_checker.go b/vendor/github.com/go-critic/go-critic/checkers/ruleguard_checker.go index 29723a69a..485819842 100644 --- a/vendor/github.com/go-critic/go-critic/checkers/ruleguard_checker.go +++ b/vendor/github.com/go-critic/go-critic/checkers/ruleguard_checker.go @@ -87,7 +87,7 @@ func newErrorHandler(failOnErrorFlag string) (*parseErrorHandler, error) { failOnErrorPredicates := map[string]func(error) bool{ "dsl": func(err error) bool { var e *ruleguard.ImportError; return !errors.As(err, &e) }, "import": func(err error) bool { var e *ruleguard.ImportError; return errors.As(err, &e) }, - "all": func(err error) bool { return true }, + "all": func(_ error) bool { return true }, } for _, k := range strings.Split(failOnErrorFlag, ",") { if k == "" { diff --git a/vendor/github.com/go-critic/go-critic/linter/helpers.go b/vendor/github.com/go-critic/go-critic/linter/helpers.go index 0a3fc0292..d5110df64 100644 --- a/vendor/github.com/go-critic/go-critic/linter/helpers.go +++ b/vendor/github.com/go-critic/go-critic/linter/helpers.go @@ -116,7 +116,7 @@ func validateCheckerName(info *CheckerInfo) error { return nil } -func validateCheckerDocumentation(info *CheckerInfo) error { +func validateCheckerDocumentation(_ *CheckerInfo) error { // TODO(quasilyte): validate documentation. return nil } |
