1
0
mirror of https://github.com/mgechev/revive.git synced 2025-10-30 23:37:49 +02:00

cognitive-complexity: handle direct recursion (#1149)

This commit is contained in:
Oleksandr Redko
2024-12-01 13:16:06 +02:00
committed by GitHub
parent 3bc240434f
commit bb9e681da6
2 changed files with 22 additions and 2 deletions

View File

@@ -67,7 +67,9 @@ func (w cognitiveComplexityLinter) lintCognitiveComplexity() {
f := w.file
for _, decl := range f.AST.Decls {
if fn, ok := decl.(*ast.FuncDecl); ok && fn.Body != nil {
v := cognitiveComplexityVisitor{}
v := cognitiveComplexityVisitor{
name: fn.Name,
}
c := v.subTreeComplexity(fn.Body)
if c > w.maxComplexity {
w.onFailure(lint.Failure{
@@ -82,6 +84,7 @@ func (w cognitiveComplexityLinter) lintCognitiveComplexity() {
}
type cognitiveComplexityVisitor struct {
name *ast.Ident
complexity int
nestingLevel int
}
@@ -125,8 +128,15 @@ func (v *cognitiveComplexityVisitor) Visit(n ast.Node) ast.Visitor {
if n.Label != nil {
v.complexity++
}
case *ast.CallExpr:
if ident, ok := n.Fun.(*ast.Ident); ok {
if ident.Obj == v.name.Obj && ident.Name == v.name.Name {
// called by same function directly (direct recursion)
v.complexity++
return nil
}
}
}
// TODO handle (at least) direct recursion
return v
}

View File

@@ -281,3 +281,13 @@ func (m *Migrator) MigrateIfNeeded(target *EtcdVersionPair) error { // MATCH /fu
// no regression test for issue #451
func myFunc()
// Recursive functions
func Walk(t *Tree, ch chan int) { // MATCH /function Walk has cognitive complexity 3 (> max enabled 0)/
if t == nil { // +1
return
}
Walk(t.Left, ch) // +1
ch <- t.Value
Walk(t.Right, ch) // +1
}