Denis Isaev 692dacb773 Update go-critic
New checkers were added:
  - badCall
  - dupImports
  - evalOrder
  - newDeref

The following checkers were fixed/improved:
  - assignOp
  - caseOrder
  - commentedOutCode
  - deprecatedComment
  - dupArg
  - rangeValCopy
  - typeSwitchVar
  - wrapperFunc

Relates: #429
2019-04-25 16:59:23 +03:00

46 lines
1.2 KiB
Go

package checkers
import (
"go/ast"
"github.com/go-critic/go-critic/checkers/internal/lintutil"
"github.com/go-lintpack/lintpack"
"github.com/go-lintpack/lintpack/astwalk"
"github.com/go-toolsmith/astcast"
"golang.org/x/tools/go/ast/astutil"
)
func init() {
var info lintpack.CheckerInfo
info.Name = "newDeref"
info.Tags = []string{"style", "experimental"}
info.Summary = "Detects immediate dereferencing of `new` expressions"
info.Before = `x := *new(bool)`
info.After = `x := false`
collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
return astwalk.WalkerForExpr(&newDerefChecker{ctx: ctx})
})
}
type newDerefChecker struct {
astwalk.WalkHandler
ctx *lintpack.CheckerContext
}
func (c *newDerefChecker) VisitExpr(expr ast.Expr) {
deref := astcast.ToStarExpr(expr)
call := astcast.ToCallExpr(deref.X)
if astcast.ToIdent(call.Fun).Name == "new" {
typ := c.ctx.TypesInfo.TypeOf(call.Args[0])
zv := lintutil.ZeroValueOf(astutil.Unparen(call.Args[0]), typ)
if zv != nil {
c.warn(expr, zv)
}
}
}
func (c *newDerefChecker) warn(cause, suggestion ast.Expr) {
c.ctx.Warn(cause, "replace `%s` with `%s`", cause, suggestion)
}