This test checks definition and hover operations over embedded fields and methods.

-- go.mod --
module mod.com

go 1.18

-- a/a.go --
package a

type A string //@loc(AString, "A")

func (_ A) Hi() {} //@loc(AHi, "Hi")

type S struct {
	Field int //@loc(SField, "Field")
	R         // embed a struct
	H         // embed an interface
}

type R struct {
	Field2 int //@loc(RField2, "Field2")
}

func (r R) Hey() {} //@loc(RHey, "Hey")

type H interface { //@loc(H, "H")
	Goodbye() //@loc(HGoodbye, "Goodbye")
}

type I interface { //@loc(I, "I")
	B() //@loc(IB, "B")
	J
}

type J interface { //@loc(J, "J")
	Hello() //@loc(JHello, "Hello")
}

-- b/b.go --
package b

import "mod.com/a" //@loc(AImport, re"\".*\"")

type embed struct {
	F int //@loc(F, "F")
}

func (embed) M() //@loc(M, "M")

type Embed struct {
	embed
	*a.A
	a.I
	a.S
}

func _() {
	e := Embed{}
	e.Hi()      //@def("Hi", AHi),hover("Hi", "Hi", AHi)
	e.B()       //@def("B", IB),hover("B", "B", IB)
	_ = e.Field     //@def("Field", SField),hover("Field", "Field", SField)
	_ = e.Field2    //@def("Field2", RField2),hover("Field2", "Field2", RField2)
	e.Hello()   //@def("Hello", JHello),hover("Hello", "Hello",JHello)
	e.Hey()     //@def("Hey", RHey),hover("Hey", "Hey", RHey)
	e.Goodbye() //@def("Goodbye", HGoodbye),hover("Goodbye", "Goodbye", HGoodbye)
	e.M() //@def("M", M),hover("M", "M", M)
	_ = e.F //@def("F", F),hover("F", "F", F)
}

type aAlias = a.A //@loc(aAlias, "aAlias")

type S1 struct { //@loc(S1, "S1")
	F1     int //@loc(S1F1, "F1")
	S2         //@loc(S1S2, "S2"),def("S2", S2),hover("S2", "S2", S2)
	a.A        //@def("A", AString),hover("A", "A", aA)
	aAlias     //@def("a", aAlias),hover("a", "aAlias", aAlias)
}

type S2 struct { //@loc(S2, "S2")
	F1   string //@loc(S2F1, "F1")
	F2   int    //@loc(S2F2, "F2")
	*a.A        //@def("A", AString),def("a",AImport)
}

type S3 struct {
	F1 struct {
		a.A //@def("A", AString)
	}
}

func Bar() {
	var x S1    //@def("S1", S1),hover("S1", "S1", S1)
	_ = x.S2    //@def("S2", S1S2),hover("S2", "S2", S1S2)
	_ = x.F1    //@def("F1", S1F1),hover("F1", "F1", S1F1)
	_ = x.F2    //@def("F2", S2F2),hover("F2", "F2", S2F2)
	_ = x.S2.F1 //@def("F1", S2F1),hover("F1", "F1", S2F1)
}

-- b/c.go --
package b

var _ = S1{ //@def("S1", S1),hover("S1", "S1", S1)
	F1: 99, //@def("F1", S1F1),hover("F1", "F1", S1F1)
}

-- @AHi --
```go
func (a.A) Hi()
```

[`(a.A).Hi` on pkg.go.dev](https://pkg.go.dev/mod.com/a#A.Hi)
-- @F --
```go
field F int
```

@loc(F, "F")


[`(b.Embed).F` on pkg.go.dev](https://pkg.go.dev/mod.com/b#Embed.F)
-- @HGoodbye --
```go
func (a.H) Goodbye()
```

@loc(HGoodbye, "Goodbye")


[`(a.H).Goodbye` on pkg.go.dev](https://pkg.go.dev/mod.com/a#H.Goodbye)
-- @IB --
```go
func (a.I) B()
```

@loc(IB, "B")


[`(a.I).B` on pkg.go.dev](https://pkg.go.dev/mod.com/a#I.B)
-- @JHello --
```go
func (a.J) Hello()
```

@loc(JHello, "Hello")


[`(a.J).Hello` on pkg.go.dev](https://pkg.go.dev/mod.com/a#J.Hello)
-- @M --
```go
func (embed) M()
```

[`(b.Embed).M` on pkg.go.dev](https://pkg.go.dev/mod.com/b#Embed.M)
-- @RField2 --
```go
field Field2 int
```

@loc(RField2, "Field2")


[`(a.R).Field2` on pkg.go.dev](https://pkg.go.dev/mod.com/a#R.Field2)
-- @RHey --
```go
func (r a.R) Hey()
```

[`(a.R).Hey` on pkg.go.dev](https://pkg.go.dev/mod.com/a#R.Hey)
-- @S1 --
```go
type S1 struct {
	F1     int //@loc(S1F1, "F1")
	S2         //@loc(S1S2, "S2"),def("S2", S2),hover("S2", "S2", S2)
	a.A        //@def("A", AString),hover("A", "A", aA)
	aAlias     //@def("a", aAlias),hover("a", "aAlias", aAlias)
}
```

```go
// Embedded fields:
F2 int // through S2 
```

[`b.S1` on pkg.go.dev](https://pkg.go.dev/mod.com/b#S1)
-- @S1F1 --
```go
field F1 int
```

@loc(S1F1, "F1")


[`(b.S1).F1` on pkg.go.dev](https://pkg.go.dev/mod.com/b#S1.F1)
-- @S1S2 --
```go
field S2 S2
```

@loc(S1S2, "S2"),def("S2", S2),hover("S2", "S2", S2)


[`(b.S1).S2` on pkg.go.dev](https://pkg.go.dev/mod.com/b#S1.S2)
-- @S2 --
```go
type S2 struct {
	F1   string //@loc(S2F1, "F1")
	F2   int    //@loc(S2F2, "F2")
	*a.A        //@def("A", AString),def("a",AImport)
}
```

```go
func (a.A) Hi()
```

[`b.S2` on pkg.go.dev](https://pkg.go.dev/mod.com/b#S2)
-- @S2F1 --
```go
field F1 string
```

@loc(S2F1, "F1")


[`(b.S2).F1` on pkg.go.dev](https://pkg.go.dev/mod.com/b#S2.F1)
-- @S2F2 --
```go
field F2 int
```

@loc(S2F2, "F2")


[`(b.S2).F2` on pkg.go.dev](https://pkg.go.dev/mod.com/b#S2.F2)
-- @SField --
```go
field Field int
```

@loc(SField, "Field")


[`(a.S).Field` on pkg.go.dev](https://pkg.go.dev/mod.com/a#S.Field)
-- @aA --
```go
type A string
```

@loc(AString, "A")


```go
func (a.A) Hi()
```

[`a.A` on pkg.go.dev](https://pkg.go.dev/mod.com/a#A)
-- @aAlias --
```go
type aAlias = a.A
```

@loc(aAlias, "aAlias")


```go
func (a.A) Hi()
```
