This file contains tests for documentation links to generic code in hover.

-- go.mod --
module mod.com

go 1.19

-- a.go --
package a

import "mod.com/generic"

func _() {
	// Hovering over instantiated object should produce accurate type
	// information, but link to the generic declarations.

	var x generic.GT[int] //@hover("GT", "GT", xGT)
	_ = x.F //@hover("x", "x", x),hover("F", "F", xF)

	f := generic.GF[int] //@hover("GF", "GF", fGF)
	_ = f //@hover("f", "f", f)
}

-- generic/generic.go --
package generic

// Hovering over type parameters should link to documentation.
//
// TODO(rfindley): should it? We should probably link to the type.
type GT[P any] struct{ //@hover("GT", "GT", GT),hover("P", "P", GTP)
	F P //@hover("F", "F", F),hover("P", "P", FP)
}

func (GT[P]) M(p P) { //@hover("GT", "GT", GTrecv),hover("M","M", M),hover(re"p (P)", re"p (P)", pP)
}

func GF[P any] (p P) { //@hover("GF", "GF", GF)
}

-- @F --
```go
field F P
```

@hover("F", "F", F),hover("P", "P", FP)


[`(generic.GT).F` on pkg.go.dev](https://pkg.go.dev/mod.com/generic#GT.F)
-- @FP --
```go
type parameter P any
```
-- @GF --
```go
func GF[P any](p P)
```

[`generic.GF` on pkg.go.dev](https://pkg.go.dev/mod.com/generic#GF)
-- @GT --
```go
type GT[P any] struct {
	F P //@hover("F", "F", F),hover("P", "P", FP)
}
```

Hovering over type parameters should link to documentation.

TODO(rfindley): should it? We should probably link to the type.


```go
func (GT[P]) M(p P)
```

[`generic.GT` on pkg.go.dev](https://pkg.go.dev/mod.com/generic#GT)
-- @GTP --
```go
type parameter P any
```
-- @GTrecv --
```go
type GT[P any] struct {
	F P //@hover("F", "F", F),hover("P", "P", FP)
}
```

Hovering over type parameters should link to documentation.

TODO(rfindley): should it? We should probably link to the type.


```go
func (GT[P]) M(p P)
```

[`generic.GT` on pkg.go.dev](https://pkg.go.dev/mod.com/generic#GT)
-- @M --
```go
func (GT[P]) M(p P)
```

[`(generic.GT).M` on pkg.go.dev](https://pkg.go.dev/mod.com/generic#GT.M)
-- @f --
```go
var f func(p int)
```
-- @fGF --
```go
func generic.GF(p int) // func[P any](p P)
```

[`generic.GF` on pkg.go.dev](https://pkg.go.dev/mod.com/generic#GF)
-- @pP --
```go
type parameter P any
```
-- @x --
```go
var x generic.GT[int]
```

@hover("GT", "GT", xGT)
-- @xF --
```go
field F int
```

@hover("F", "F", F),hover("P", "P", FP)


[`(generic.GT).F` on pkg.go.dev](https://pkg.go.dev/mod.com/generic#GT.F)
-- @xGT --
```go
type GT[P any] struct {
	F P //@hover("F", "F", F),hover("P", "P", FP)
}
```

Hovering over type parameters should link to documentation.

TODO(rfindley): should it? We should probably link to the type.


```go
func (generic.GT[P]) M(p P)
```

[`generic.GT` on pkg.go.dev](https://pkg.go.dev/mod.com/generic#GT)
