blob: cdca2c0b17784e121d07e7e84867e3e5d6ac6720 [file]
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() {}