| Variants of embed-crosspkg.txt: cross-package method promotion via |
| pointer embedding, generic embedding, and interface embedding. |
| All follow the same resolution path (methodsets.Index.LocationOf) |
| as plain struct embedding; this test guards against regressions in |
| those forms. |
| |
| -- go.mod -- |
| module example.com |
| go 1.18 |
| |
| -- iface/iface.go -- |
| package iface |
| |
| type I interface { //@loc(I, "I"),implementation("I", SP, SG, J) |
| // Implementations of M include J.M (same method set as I); |
| // J.M's position is resolved via LocationOf to iface.I.M (IM), |
| // since interface embedding shares the original *types.Func. |
| M() //@loc(IM, "M"),implementation("M", TM, GM, IM) |
| N() //@loc(IN, "N") |
| } |
| |
| -- iface2/iface2.go -- |
| package iface2 |
| |
| import "example.com/iface" |
| |
| // J embeds iface.I from another package: J.M and J.N are declared |
| // in iface, so iface2's index records them with zero Posn. Querying |
| // implementations of a concrete N must resolve J.N via iface's index; |
| // the result location coincides with iface.I.N (same types.Func). |
| type J interface { //@loc(J, "J"),implementation("J", I, SP, SG) |
| iface.I |
| } |
| |
| -- impl/impl.go -- |
| package impl |
| |
| type T struct{} |
| |
| func (*T) M() {} //@loc(TM, "M") |
| |
| type G[X any] struct{} |
| |
| func (G[X]) M() {} //@loc(GM, "M") |
| |
| -- embed/embed.go -- |
| package embed |
| |
| import "example.com/impl" |
| |
| // SP embeds *impl.T: M is promoted from the pointer receiver. |
| type SP struct { //@loc(SP, "SP") |
| *impl.T |
| } |
| |
| // Querying implementations of SP.N (a concrete method) finds J.N as |
| // well as I.N; J.N's position resolves to IN via iface's index. |
| func (SP) N() {} //@implementation("N", IN) |
| |
| // SG embeds an instantiation of a generic type. |
| // M's origin is impl.G[X].M; resolution must match impl's index entry. |
| type SG struct { //@loc(SG, "SG") |
| impl.G[int] |
| } |
| |
| func (SG) N() {} |