Skip to content

Commit

Permalink
cognitive-complexity: handle direct recursion
Browse files Browse the repository at this point in the history
  • Loading branch information
alexandear committed Nov 30, 2024
1 parent 7e1d35d commit 5dfac71
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 2 deletions.
14 changes: 12 additions & 2 deletions rule/cognitive_complexity.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{
Expand All @@ -82,6 +84,7 @@ func (w cognitiveComplexityLinter) lintCognitiveComplexity() {
}

type cognitiveComplexityVisitor struct {
name *ast.Ident
complexity int
nestingLevel int
}
Expand Down Expand Up @@ -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
}
Expand Down
10 changes: 10 additions & 0 deletions testdata/cognitive_complexity.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

0 comments on commit 5dfac71

Please sign in to comment.