mirror of
https://github.com/mgechev/revive.git
synced 2025-11-23 22:04:49 +02:00
refactor: move functions out from utils.go (#1139)
This commit is contained in:
@@ -73,3 +73,7 @@ func (*BlankImportsRule) fileHasValidEmbedComment(fileAst *ast.File) bool {
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// isBlank returns whether id is the blank identifier "_".
|
||||
// If id == nil, the answer is false.
|
||||
func isBlank(id *ast.Ident) bool { return id != nil && id.Name == "_" }
|
||||
|
||||
@@ -70,3 +70,23 @@ func (w lintBoolLiteral) addFailure(node ast.Node, msg, cat string) {
|
||||
Failure: msg,
|
||||
})
|
||||
}
|
||||
|
||||
// isBoolOp returns true if the given token corresponds to a bool operator.
|
||||
func isBoolOp(t token.Token) bool {
|
||||
switch t {
|
||||
case token.LAND, token.LOR, token.EQL, token.NEQ:
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func isExprABooleanLit(n ast.Node) (lexeme string, ok bool) {
|
||||
oper, ok := n.(*ast.Ident)
|
||||
|
||||
if !ok {
|
||||
return "", false
|
||||
}
|
||||
|
||||
return oper.Name, (oper.Name == "true" || oper.Name == "false")
|
||||
}
|
||||
|
||||
@@ -53,6 +53,15 @@ func (dc *disabledChecks) isDisabled(checkName string) bool {
|
||||
}
|
||||
}
|
||||
|
||||
var commonMethods = map[string]bool{
|
||||
"Error": true,
|
||||
"Read": true,
|
||||
"ServeHTTP": true,
|
||||
"String": true,
|
||||
"Write": true,
|
||||
"Unwrap": true,
|
||||
}
|
||||
|
||||
// ExportedRule lints given else constructs.
|
||||
type ExportedRule struct {
|
||||
stuttersMsg string
|
||||
|
||||
@@ -6,31 +6,11 @@ import (
|
||||
"go/ast"
|
||||
"go/printer"
|
||||
"go/token"
|
||||
"go/types"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/mgechev/revive/lint"
|
||||
)
|
||||
|
||||
// isBlank returns whether id is the blank identifier "_".
|
||||
// If id == nil, the answer is false.
|
||||
func isBlank(id *ast.Ident) bool { return id != nil && id.Name == "_" }
|
||||
|
||||
var commonMethods = map[string]bool{
|
||||
"Error": true,
|
||||
"Read": true,
|
||||
"ServeHTTP": true,
|
||||
"String": true,
|
||||
"Write": true,
|
||||
"Unwrap": true,
|
||||
}
|
||||
|
||||
var knownNameExceptions = map[string]bool{
|
||||
"LastInsertId": true, // must match database/sql
|
||||
"kWh": true,
|
||||
}
|
||||
|
||||
func isCgoExported(f *ast.FuncDecl) bool {
|
||||
if f.Recv != nil || f.Doc == nil {
|
||||
return false
|
||||
@@ -45,34 +25,11 @@ func isCgoExported(f *ast.FuncDecl) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
var allCapsRE = regexp.MustCompile(`^[A-Z0-9_]+$`)
|
||||
|
||||
func isIdent(expr ast.Expr, ident string) bool {
|
||||
id, ok := expr.(*ast.Ident)
|
||||
return ok && id.Name == ident
|
||||
}
|
||||
|
||||
var zeroLiteral = map[string]bool{
|
||||
"false": true, // bool
|
||||
// runes
|
||||
`'\x00'`: true,
|
||||
`'\000'`: true,
|
||||
// strings
|
||||
`""`: true,
|
||||
"``": true,
|
||||
// numerics
|
||||
"0": true,
|
||||
"0.": true,
|
||||
"0.0": true,
|
||||
"0i": true,
|
||||
}
|
||||
|
||||
func validType(t types.Type) bool {
|
||||
return t != nil &&
|
||||
t != types.Typ[types.Invalid] &&
|
||||
!strings.Contains(t.String(), "invalid type") // good but not foolproof
|
||||
}
|
||||
|
||||
// isPkgDot checks if the expression is <pkg>.<name>
|
||||
func isPkgDot(expr ast.Expr, pkg, name string) bool {
|
||||
sel, ok := expr.(*ast.SelectorExpr)
|
||||
@@ -125,32 +82,6 @@ func (p picker) Visit(node ast.Node) ast.Visitor {
|
||||
return p
|
||||
}
|
||||
|
||||
// isBoolOp returns true if the given token corresponds to
|
||||
// a bool operator
|
||||
func isBoolOp(t token.Token) bool {
|
||||
switch t {
|
||||
case token.LAND, token.LOR, token.EQL, token.NEQ:
|
||||
return true
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
const (
|
||||
trueName = "true"
|
||||
falseName = "false"
|
||||
)
|
||||
|
||||
func isExprABooleanLit(n ast.Node) (lexeme string, ok bool) {
|
||||
oper, ok := n.(*ast.Ident)
|
||||
|
||||
if !ok {
|
||||
return "", false
|
||||
}
|
||||
|
||||
return oper.Name, (oper.Name == trueName || oper.Name == falseName)
|
||||
}
|
||||
|
||||
// gofmt returns a string representation of an AST subtree.
|
||||
func gofmt(x any) string {
|
||||
buf := bytes.Buffer{}
|
||||
|
||||
@@ -5,10 +5,26 @@ import (
|
||||
"go/ast"
|
||||
"go/token"
|
||||
"go/types"
|
||||
"strings"
|
||||
|
||||
"github.com/mgechev/revive/lint"
|
||||
)
|
||||
|
||||
var zeroLiteral = map[string]bool{
|
||||
"false": true, // bool
|
||||
// runes
|
||||
`'\x00'`: true,
|
||||
`'\000'`: true,
|
||||
// strings
|
||||
`""`: true,
|
||||
"``": true,
|
||||
// numerics
|
||||
"0": true,
|
||||
"0.": true,
|
||||
"0.0": true,
|
||||
"0i": true,
|
||||
}
|
||||
|
||||
// VarDeclarationsRule lints given else constructs.
|
||||
type VarDeclarationsRule struct{}
|
||||
|
||||
@@ -120,3 +136,9 @@ func (w *lintVarDeclarations) Visit(node ast.Node) ast.Visitor {
|
||||
}
|
||||
return w
|
||||
}
|
||||
|
||||
func validType(t types.Type) bool {
|
||||
return t != nil &&
|
||||
t != types.Typ[types.Invalid] &&
|
||||
!strings.Contains(t.String(), "invalid type") // good but not foolproof
|
||||
}
|
||||
|
||||
@@ -13,9 +13,16 @@ import (
|
||||
|
||||
var anyCapsRE = regexp.MustCompile(`[A-Z]`)
|
||||
|
||||
var allCapsRE = regexp.MustCompile(`^[A-Z0-9_]+$`)
|
||||
|
||||
// regexp for constant names like `SOME_CONST`, `SOME_CONST_2`, `X123_3`, `_SOME_PRIVATE_CONST` (#851, #865)
|
||||
var upperCaseConstRE = regexp.MustCompile(`^_?[A-Z][A-Z\d]*(_[A-Z\d]+)*$`)
|
||||
|
||||
var knownNameExceptions = map[string]bool{
|
||||
"LastInsertId": true, // must match database/sql
|
||||
"kWh": true,
|
||||
}
|
||||
|
||||
// VarNamingRule lints given else constructs.
|
||||
type VarNamingRule struct {
|
||||
allowList []string
|
||||
|
||||
Reference in New Issue
Block a user