@@ -1569,7 +1569,7 @@ func (p *CodeBuilder) Member(name string, flag MemberFlag, src ...ast.Node) (kin
1569
1569
flag = memberFlagMethodToFunc
1570
1570
}
1571
1571
aliasName , flag = aliasNameOf (name , flag )
1572
- kind = p .findMember (at , name , aliasName , flag , arg , srcExpr )
1572
+ kind = p .findMember (at , name , aliasName , flag , arg , srcExpr , nil )
1573
1573
if isType && kind != MemberMethod {
1574
1574
code , pos := p .loadExpr (srcExpr )
1575
1575
return MemberInvalid , p .newCodeError (
@@ -1617,7 +1617,7 @@ func getUnderlying(pkg *Package, typ types.Type) types.Type {
1617
1617
}
1618
1618
1619
1619
func (p * CodeBuilder ) findMember (
1620
- typ types.Type , name , aliasName string , flag MemberFlag , arg * Element , srcExpr ast.Node ) MemberKind {
1620
+ typ types.Type , name , aliasName string , flag MemberFlag , arg * Element , srcExpr ast.Node , visited map [ * types. Struct ] none ) MemberKind {
1621
1621
var named * types.Named
1622
1622
retry:
1623
1623
switch o := typ .(type ) {
@@ -1635,10 +1635,10 @@ retry:
1635
1635
return kind
1636
1636
}
1637
1637
if fstruc {
1638
- return p .embeddedField (struc , name , aliasName , flag , arg , srcExpr )
1638
+ return p .embeddedField (struc , name , aliasName , flag , arg , srcExpr , visited )
1639
1639
}
1640
1640
case * types.Struct :
1641
- if kind := p .field (t , name , aliasName , flag , arg , srcExpr ); kind != MemberInvalid {
1641
+ if kind := p .field (t , name , aliasName , flag , arg , srcExpr , visited ); kind != MemberInvalid {
1642
1642
return kind
1643
1643
}
1644
1644
}
@@ -1649,7 +1649,7 @@ retry:
1649
1649
}
1650
1650
goto retry
1651
1651
case * types.Struct :
1652
- if kind := p .field (o , name , aliasName , flag , arg , srcExpr ); kind != MemberInvalid {
1652
+ if kind := p .field (o , name , aliasName , flag , arg , srcExpr , visited ); kind != MemberInvalid {
1653
1653
return kind
1654
1654
}
1655
1655
if named != nil {
@@ -1829,10 +1829,18 @@ func (p *CodeBuilder) normalField(
1829
1829
}
1830
1830
1831
1831
func (p * CodeBuilder ) embeddedField (
1832
- o * types.Struct , name , aliasName string , flag MemberFlag , arg * Element , src ast.Node ) MemberKind {
1832
+ o * types.Struct , name , aliasName string , flag MemberFlag , arg * Element , src ast.Node , visited map [* types.Struct ]none ) MemberKind {
1833
+ if visited == nil {
1834
+ visited = make (map [* types.Struct ]none )
1835
+ }
1836
+ if _ , ok := visited [o ]; ok {
1837
+ return MemberInvalid
1838
+ }
1839
+ visited [o ] = none {}
1840
+
1833
1841
for i , n := 0 , o .NumFields (); i < n ; i ++ {
1834
1842
if fld := o .Field (i ); fld .Embedded () {
1835
- if kind := p .findMember (fld .Type (), name , aliasName , flag , arg , src ); kind != MemberInvalid {
1843
+ if kind := p .findMember (fld .Type (), name , aliasName , flag , arg , src , visited ); kind != MemberInvalid {
1836
1844
return kind
1837
1845
}
1838
1846
}
@@ -1841,11 +1849,11 @@ func (p *CodeBuilder) embeddedField(
1841
1849
}
1842
1850
1843
1851
func (p * CodeBuilder ) field (
1844
- o * types.Struct , name , aliasName string , flag MemberFlag , arg * Element , src ast.Node ) MemberKind {
1852
+ o * types.Struct , name , aliasName string , flag MemberFlag , arg * Element , src ast.Node , visited map [ * types. Struct ] none ) MemberKind {
1845
1853
if kind := p .normalField (o , name , arg , src ); kind != MemberInvalid {
1846
1854
return kind
1847
1855
}
1848
- return p .embeddedField (o , name , aliasName , flag , arg , src )
1856
+ return p .embeddedField (o , name , aliasName , flag , arg , src , visited )
1849
1857
}
1850
1858
1851
1859
func toFuncSig (sig * types.Signature , recv * types.Var ) * types.Signature {
0 commit comments