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

Requires go1.19+ for the new go/doc/comment package.

-- flags --
-min_go=go1.19

-- 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)
}

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

Hovering over type parameters should link to documentation.

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


[`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)
}

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

Hovering over type parameters should link to documentation.

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


[`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)
}

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

Hovering over type parameters should link to documentation.

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


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