This test exercises miscellaneous definition and hover requests.

Its size expectations assume a 64-bit machine.

-- settings.json --
{"analyses": {"unusedfunc": false}}

-- go.mod --
module mod.com

go 1.16

-- flags --
-skip_goarch=386,arm

-- a.go --
package a //@loc(aPackage, re"package (a)"),hover(aPackage, aPackage, aPackage)

var (
	// x is a variable.
	x string //@loc(x, "x"),hover(x, x, hoverx)
)

// Constant block. When I hover on h, I should see this comment.
const (
	// When I hover on g, I should see this comment.
	g = 1 //@hover("g", "g", hoverg)

	h = 2 //@hover("h", "h", hoverh)
)

// z is a variable too.
var z string //@loc(z, "z"),hover(z, z, hoverz)

func AStuff() { //@loc(AStuff, "AStuff")
	x := 5
	Random2(x) //@def("dom2", Random2)
	Random()   //@def("()", Random)
}

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

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

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

func _() {
	// 1st type declaration block
	type (
		a struct { //@hover("a", "a", hoverDeclBlocka)
			x string
		}
	)

	// 2nd type declaration block
	type (
		// b has a comment
		b struct{} //@hover("b", "b", hoverDeclBlockb)
	)

	// 3rd type declaration block
	type (
		// c is a struct
		c struct { //@hover("c", "c", hoverDeclBlockc)
			f string
		}

		d string //@hover("d", "d", hoverDeclBlockd)
	)

	type (
		e struct { //@hover("e", "e", hoverDeclBlocke)
			f float64
		} // e has a comment
	)
}

var (
	hh H //@hover("H", "H", hoverH)
	ii I //@hover("I", "I", hoverI)
	jj J //@hover("J", "J", hoverJ)
)
-- a_test.go --
package a

import (
	"testing"
)

func TestA(t *testing.T) { //@hover("TestA", "TestA", hoverTestA)
}
-- random.go --
package a

func Random() int { //@loc(Random, "Random")
	y := 6 + 7
	return y
}

func Random2(y int) int { //@loc(Random2, "Random2"),loc(RandomParamY, "y")
	return y //@def("y", RandomParamY),hover("y", "y", hovery)
}

type Pos struct {
	x, y int //@loc(PosX, "x"),loc(PosY, "y")
}

// Typ has a comment. Its fields do not.
type Typ struct{ field string } //@loc(TypField, "field")

func _() {
	x := &Typ{}
	_ = x.field //@def("field", TypField),hover("field", "field", hoverfield)
}

func (p *Pos) Sum() int { //@loc(PosSum, "Sum")
	return p.x + p.y //@hover("x", "x", hoverpx)
}

func _() {
	var p Pos
	_ = p.Sum() //@def("()", PosSum),hover(re"Sum()", `Sum`, hoverSum)
}
-- @aPackage --
```go
package a
```

---

 - Package path: mod.com
 - Module: mod.com
 - Language version: go1.16
-- @hoverDeclBlocka --
```go
type a struct { // size=16 (0x10)
	x string
}
```

---

1st type declaration block
-- @hoverDeclBlockb --
```go
type b struct{} // size=0
```

---

b has a comment
-- @hoverDeclBlockc --
```go
type c struct { // size=16 (0x10)
	f string
}
```

---

c is a struct
-- @hoverDeclBlockd --
```go
type d string // size=16 (0x10)
```

---

3rd type declaration block
-- @hoverDeclBlocke --
```go
type e struct { // size=8
	f float64
}
```

---

e has a comment
-- @hoverH --
```go
type H interface {
	Goodbye()
}
```

---

[`a.H` on pkg.go.dev](https://pkg.go.dev/mod.com#H)
-- @hoverI --
```go
type I interface {
	B()
	J
}
```

---

```go
func (J) Hello()
```

---

[`a.I` on pkg.go.dev](https://pkg.go.dev/mod.com#I)
-- @hoverJ --
```go
type J interface {
	Hello()
}
```

---

[`a.J` on pkg.go.dev](https://pkg.go.dev/mod.com#J)
-- @hoverSum --
```go
func (p *Pos) Sum() int
```

---

[`(a.Pos).Sum` on pkg.go.dev](https://pkg.go.dev/mod.com#Pos.Sum)
-- @hoverTestA --
```go
func TestA(t *testing.T)
```
-- @hoverfield --
```go
field field string
```
-- @hoverg --
```go
const g untyped int = 1
```

---

When I hover on g, I should see this comment.
-- @hoverh --
```go
const h untyped int = 2
```

---

Constant block. When I hover on h, I should see this comment.
-- @hoverpx --
```go
field x int
```

---

@loc(PosX, "x"),loc(PosY, "y")
-- @hoverx --
```go
var x string
```

---

x is a variable.
-- @hovery --
```go
var y int
```
-- @hoverz --
```go
var z string
```

---

z is a variable too.
