@@ -38,20 +38,15 @@ func HasTail(node dst.Node) bool {
3838// HasRecursive determines whether the given node or one of its children has a
3939// golines annotation on it. It's currently implemented for function declarations, fields,
4040// call expressions, and selector expressions only.
41- func HasRecursive ( node dst.Node ) bool {
41+ func HasRecursive [ T dst.Node ]( node T ) bool {
4242 if Has (node ) {
4343 return true
4444 }
4545
46- switch n := node .(type ) {
46+ switch n := any ( node ) .(type ) {
4747 case * dst.FuncDecl :
48- if n .Type != nil && n .Type .Params != nil {
49- for _ , item := range n .Type .Params .List {
50- if HasRecursive (item ) {
51- return true
52- }
53- }
54- }
48+ return n .Type != nil && n .Type .Params != nil &&
49+ HasRecursive (n .Type .Params )
5550
5651 case * dst.Field :
5752 return HasTail (n ) || HasRecursive (n .Type )
@@ -60,20 +55,13 @@ func HasRecursive(node dst.Node) bool {
6055 return Has (n .Sel ) || Has (n .X )
6156
6257 case * dst.CallExpr :
63- if HasRecursive (n .Fun ) {
64- return true
65- }
66-
67- if slices .ContainsFunc (n .Args , Has ) {
68- return true
69- }
58+ return HasRecursive (n .Fun ) || slices .ContainsFunc (n .Args , Has )
7059
7160 case * dst.InterfaceType :
72- for _ , field := range n .Methods .List {
73- if HasRecursive (field ) {
74- return true
75- }
76- }
61+ return HasRecursive (n .Methods )
62+
63+ case * dst.FieldList :
64+ return slices .ContainsFunc (n .List , HasRecursive )
7765 }
7866
7967 return false
0 commit comments