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,25 +52,46 @@ 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()
case *ast.AssignStmt:
if _, ok := v.Rhs[0].(*ast.CallExpr); ok {
return false
}
// a := &log.Error()
case *ast.UnaryExpr:
if _, ok := v.X.(*ast.CallExpr); ok && v.Op == token.AND {
return false
}
// log.Error()
case *ast.CallExpr:
if expr, ok := n.(*ast.CallExpr); ok {
return analyzeCallExpr(pass, expr, file)
}
}
return true return true
})
} }
return nil, nil
}
func analyzeCallExpr(pass *analysis.Pass, expr *ast.CallExpr, file *ast.File) bool {
isLog, _ := astutils.IsTargetMethod(expr.Fun, Config.TargetMethods) isLog, _ := astutils.IsTargetMethod(expr.Fun, Config.TargetMethods)
if !isLog || len(expr.Args) == 0 || astutils.HasNoLintComment(pass, expr.Pos()) { if !isLog || len(expr.Args) == 0 || astutils.HasNoLintComment(pass, expr.Pos()) {
return true return false
} }
if !astutils.IsStringValue(expr.Args[0]) { if !astutils.IsStringValue(expr.Args[0]) {
alias, _ := astutils.GetAliasByPkgName(file, Config.ConstantsPackage) alias, _ := astutils.GetAliasByPkgName(file, Config.ConstantsPackage)
if Config.ConstantsPackage == "" || astutils.GetPackageName(expr.Args[0]) == alias || astutils.GetPackageName(expr.Args[0]) == "" { if Config.ConstantsPackage == "" || astutils.GetPackageName(expr.Args[0]) == alias || astutils.GetPackageName(expr.Args[0]) == "" {
return true return false
} }
for _, pkgName := range Config.DisablePackages { for _, pkgName := range Config.DisablePackages {
if pkgName == astutils.GetPackageName(expr.Args[0]) { if pkgName == astutils.GetPackageName(expr.Args[0]) {
return true return false
} }
} }
@ -80,7 +102,7 @@ func run(pass *analysis.Pass) (interface{}, error) {
Message: "Wrong package for constants", Message: "Wrong package for constants",
SuggestedFixes: nil, SuggestedFixes: nil,
}) })
return true return false
} }
pass.Report(analysis.Diagnostic{ pass.Report(analysis.Diagnostic{
@ -92,8 +114,4 @@ func run(pass *analysis.Pass) (interface{}, error) {
}) })
return false return false
})
}
return nil, nil
} }

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
} }