This test checks hovering over doc links in comments.

Requires go1.20+ for the unsafe package test.

-- flags --
-min_go=go1.20

-- go.mod --
module mod.com

go 1.20

-- a.go --
package p

import (
	"unsafe"

	"mod.com/util" //@hover(`"mod.com/util"`, `"mod.com/util"`, strconv)
)

// [NumberBase] is the base to use for number parsing. //@hover("NumberBase", "NumberBase", NumberBase)
const NumberBase = 10

// [Conv] converts s to an int. //@hover("Conv", "Conv", Conv)
func Conv(s string) int {
	// [util.ParseInt] parses s and returns the integer corresponding to it. //@hover("util", "util", util),hover("ParseInt", "ParseInt", strconvParseInt)
	// [NumberBase] is the base to use for number parsing.
	i, _ := util.ParseInt(s, NumberBase, 64)
	return int(i)
}

// unsafeConv converts s to a byte slice using [unsafe.Pointer]. hover("Pointer", "Pointer", unsafePointer)
func unsafeConv(s string) []byte {
	p := unsafe.StringData(s)
	b := unsafe.Slice(p, len(s))
	return b
}

-- util/conv.go --
// Package util provides utility functions.
package util

import "strconv"

// ParseInt interprets a string s in the given base (0, 2 to 36) and
// bit size (0 to 64) and returns the corresponding value i.
func ParseInt(s string, base int, bitSize int) (int64, error) {
	return strconv.ParseInt(s, base, bitSize)
}

-- @Conv --
```go
func Conv(s string) int
```

\[Conv] converts s to an int. //@hover("Conv", "Conv", Conv)


[`p.Conv` on pkg.go.dev](https://pkg.go.dev/mod.com#Conv)
-- @NumberBase --
```go
const NumberBase untyped int = 10
```

\[NumberBase] is the base to use for number parsing. //@hover("NumberBase", "NumberBase", NumberBase)


[`p.NumberBase` on pkg.go.dev](https://pkg.go.dev/mod.com#NumberBase)
-- @strconv --
Package util provides utility functions.
-- @strconvParseInt --
```go
func ParseInt(s string, base int, bitSize int) (int64, error)
```

ParseInt interprets a string s in the given base (0, 2 to 36) and bit size (0 to 64) and returns the corresponding value i.


[`util.ParseInt` on pkg.go.dev](https://pkg.go.dev/mod.com/util#ParseInt)
-- @util --
Package util provides utility functions.
