func (w *PkgWalker) lookupNamedMethod(named *types.Named, name string) (types.Object, *types.Named) { if iface, ok := named.Underlying().(*types.Interface); ok { for i := 0; i < iface.NumMethods(); i++ { fn := iface.Method(i) if fn.Name() == name { return fn, named } } for i := 0; i < iface.NumEmbeddeds(); i++ { if obj, na := w.lookupNamedMethod(iface.Embedded(i), name); obj != nil { return obj, na } } return nil, nil } if istruct, ok := named.Underlying().(*types.Struct); ok { for i := 0; i < named.NumMethods(); i++ { fn := named.Method(i) if fn.Name() == name { return fn, named } } for i := 0; i < istruct.NumFields(); i++ { field := istruct.Field(i) if !field.Anonymous() { continue } if typ, ok := field.Type().(*types.Named); ok { if obj, na := w.lookupNamedMethod(typ, name); obj != nil { return obj, na } } } } return nil, nil }