Skip to content

Commit

Permalink
Fix gocognit output when a function has generic receiver type
Browse files Browse the repository at this point in the history
recvString func in gocognit returns BADRECV when the function's receiver is a
generic type.

Implement recvString in two variants in order to keep the code
compatible with go versions less than 1.18
  • Loading branch information
ivanruski committed Jun 30, 2022
1 parent 8514510 commit bf94da4
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 12 deletions.
12 changes: 0 additions & 12 deletions gocognit.go
Expand Up @@ -49,18 +49,6 @@ func funcName(fn *ast.FuncDecl) string {
return fn.Name.Name
}

// recvString returns a string representation of recv of the
// form "T", "*T", or "BADRECV" (if not a proper receiver type).
func recvString(recv ast.Expr) string {
switch t := recv.(type) {
case *ast.Ident:
return t.Name
case *ast.StarExpr:
return "*" + recvString(t.X)
}
return "BADRECV"
}

// Complexity calculates the cognitive complexity of a function.
func Complexity(fn *ast.FuncDecl) int {
v := complexityVisitor{
Expand Down
30 changes: 30 additions & 0 deletions recv.go
@@ -0,0 +1,30 @@
//go:build go1.18
// +build go1.18

package gocognit

import (
"go/ast"
"strings"
)

// recvString returns a string representation of recv of the
// form "T", "*T", Type[T], Type[T, V], or "BADRECV" (if not a proper receiver type).
func recvString(recv ast.Expr) string {
switch t := recv.(type) {
case *ast.Ident:
return t.Name
case *ast.StarExpr:
return "*" + recvString(t.X)
case *ast.IndexExpr:
return recvString(t.X) + "[" + recvString(t.Index) + "]"
case *ast.IndexListExpr:
targs := make([]string, len(t.Indices))
for i, exp := range t.Indices {
targs[i] = recvString(exp)
}

return recvString(t.X) + "[" + strings.Join(targs, ", ") + "]"
}
return "BADRECV"
}
20 changes: 20 additions & 0 deletions recv_pre118.go
@@ -0,0 +1,20 @@
//go:build !go1.18
// +build !go1.18

package gocognit

import (
"go/ast"
)

// recvString returns a string representation of recv of the
// form "T", "*T", or "BADRECV" (if not a proper receiver type).
func recvString(recv ast.Expr) string {
switch t := recv.(type) {
case *ast.Ident:
return t.Name
case *ast.StarExpr:
return "*" + recvString(t.X)
}
return "BADRECV"
}

0 comments on commit bf94da4

Please sign in to comment.