noliteral: Add ignoring of nested functions #17

Merged
fyrchik merged 2 commits from achuprov/linters:bugfix/noliteral_ignoring_nested_functions into master 2024-09-04 19:51:22 +00:00
3 changed files with 92 additions and 43 deletions

View file

@ -2,6 +2,7 @@ package noliteral
import ( import (
"go/ast" "go/ast"
"go/token"
astutils "git.frostfs.info/TrueCloudLab/linters/pkg/ast-utils" astutils "git.frostfs.info/TrueCloudLab/linters/pkg/ast-utils"
"github.com/mitchellh/mapstructure" "github.com/mitchellh/mapstructure"
@ -51,49 +52,66 @@ func run(pass *analysis.Pass) (interface{}, error) {
} }
for _, file := range pass.Files { for _, file := range pass.Files {
ast.Inspect(file, func(n ast.Node) bool { ast.Inspect(file, func(n ast.Node) bool {
expr, ok := n.(*ast.CallExpr) switch v := n.(type) {
if !ok { // a := zap.Error()
return true case *ast.AssignStmt:
} if _, ok := v.Rhs[0].(*ast.CallExpr); ok {
return false
isLog, _ := astutils.IsTargetMethod(expr.Fun, Config.TargetMethods)
if !isLog || len(expr.Args) == 0 || astutils.HasNoLintComment(pass, expr.Pos()) {
return true
}
if !astutils.IsStringValue(expr.Args[0]) {
alias, _ := astutils.GetAliasByPkgName(file, Config.ConstantsPackage)
if Config.ConstantsPackage == "" || astutils.GetPackageName(expr.Args[0]) == alias || astutils.GetPackageName(expr.Args[0]) == "" {
return true
} }
// a := &log.Error()
for _, pkgName := range Config.DisablePackages { case *ast.UnaryExpr:
if pkgName == astutils.GetPackageName(expr.Args[0]) { if _, ok := v.X.(*ast.CallExpr); ok && v.Op == token.AND {
return true return false
} }
// log.Error()
case *ast.CallExpr:
if expr, ok := n.(*ast.CallExpr); ok {
return analyzeCallExpr(pass, expr, file)
} }
pass.Report(analysis.Diagnostic{
Pos: expr.Pos(),
End: expr.End(),
Category: LinterName,
Message: "Wrong package for constants",
SuggestedFixes: nil,
})
return true
} }
return true
pass.Report(analysis.Diagnostic{
Pos: expr.Pos(),
End: expr.End(),
Category: LinterName,
Message: "Literals are not allowed in the body of the logger",
SuggestedFixes: nil,
})
return false
}) })
} }
return nil, nil return nil, nil
} }
func analyzeCallExpr(pass *analysis.Pass, expr *ast.CallExpr, file *ast.File) bool {
isLog, _ := astutils.IsTargetMethod(expr.Fun, Config.TargetMethods)
if !isLog || len(expr.Args) == 0 || astutils.HasNoLintComment(pass, expr.Pos()) {
return false
}
if !astutils.IsStringValue(expr.Args[0]) {
alias, _ := astutils.GetAliasByPkgName(file, Config.ConstantsPackage)
if Config.ConstantsPackage == "" || astutils.GetPackageName(expr.Args[0]) == alias || astutils.GetPackageName(expr.Args[0]) == "" {
return false
}
for _, pkgName := range Config.DisablePackages {
if pkgName == astutils.GetPackageName(expr.Args[0]) {
return false
}
}
pass.Report(analysis.Diagnostic{
Pos: expr.Pos(),
End: expr.End(),
Category: LinterName,
Message: "Wrong package for constants",
SuggestedFixes: nil,
})
return false
}
pass.Report(analysis.Diagnostic{
Pos: expr.Pos(),
End: expr.End(),
Category: LinterName,
Message: "Literals are not allowed in the body of the logger",
SuggestedFixes: nil,
})
return false
}

View file

@ -4,25 +4,46 @@ package logs //declaration package
import ( import (
"fmt" "fmt"
tochno_ne_const_dly_log "git.frostfs.info/TrueCloudLab/frostfs-node/internal/logs"// The alias of the package with constants differs from the one used tochno_ne_dly_const_log "git.frostfs.info/TrueCloudLab/frostfs-node/internal/logs"// The alias of the package with constants differs from the one used
) )
func (c *cfg) info_ok() { func (c *cfg) info_ok() {
c.log.Info(tochno_ne_const_dly_log.MSG) c.log.Info(tochno_ne_dly_const_log.MSG)
} }
func (c *cfg) debug_ok() { func (c *cfg) debug_ok() {
c.log.Debug(tochno_ne_const_dly_log.MSG) c.log.Debug(tochno_ne_dly_const_log.MSG)
} }
func (c *cfg) error_ok() { func (c *cfg) error_ok() {
c.log.Error(tochno_ne_const_dly_log.MSG) c.log.Error(tochno_ne_dly_const_log.MSG)
} }
func (c *cfg) custom_ok_const() { func (c *cfg) custom_ok_const() {
c.log.Abyr(tochno_ne_const_dly_log.MSG) c.log.Abyr(tochno_ne_dly_const_log.MSG)
} }
// issue: https://git.frostfs.info/TrueCloudLab/linters/issues/16.
// Check that the check does not trigger a false positive for "zap.Error(invalid_pkg.Error)" passed as an argument.
func (c *cfg) debug1_ok() {
c.log.Debug(tochno_ne_dly_const_log.MSG, zap.Stringer("cid", bkt.CID), zap.String("oid", obj.VersionID), zap.Error(invalid_pkg.Error))
}
func (c *cfg) error_ok() {
field:=zap.Error(invalid_pkg.Error)
}
func (c *cfg) error_ok() {
callBack:=&zap.Error(invalid_pkg.Error)
}
func (c *cfg) error_ok() {
field=zap.Error(invalid_pkg.Error)
}
func (c *cfg) error_ok() {
callBack=&zap.Error(invalid_pkg.Error)
}
type Logger interface { type Logger interface {
Debug(msg string) Debug(msg string)

View file

@ -15,6 +15,16 @@ func (c *cfg) debug_ok() {
c.log.Debug(logs.MSG) //acceptable c.log.Debug(logs.MSG) //acceptable
} }
// issue: https://git.frostfs.info/TrueCloudLab/linters/issues/16.
// Check that the check does not trigger a false positive for "zap.Error("literal")" passed as an argument.
func (c *cfg) debug1_ok() {
c.log.Debug(logs.MSG, zap.Stringer("cid", bkt.CID), zap.String("oid", obj.VersionID), zap.Error("literal"))
}
func (c *cfg) debug1_ok() {
f(zap.Error("logs.MSG"))
}
func (c *cfg) error_ok() { func (c *cfg) error_ok() {
c.log.Error(logs.MSG) //acceptable c.log.Error(logs.MSG) //acceptable
} }