diff --git a/gopls/internal/test/marker/testdata/hover/generics.txt b/gopls/internal/test/marker/testdata/hover/generics.txt index 86e2b2ce1..50ce49bb3 100644 --- a/gopls/internal/test/marker/testdata/hover/generics.txt +++ b/gopls/internal/test/marker/testdata/hover/generics.txt @@ -3,8 +3,11 @@ This file contains tests for hovering over generic Go code. Requires go1.20+ for the new go/doc/comment package, and a change in Go 1.20 that affected the formatting of constraint interfaces. +Its size expectations assume a 64-bit machine. + -- flags -- -min_go=go1.20 +-skip_goarch=386,arm -- go.mod -- // A go.mod is require for correct pkgsite links. @@ -13,10 +16,28 @@ module mod.com go 1.18 +-- issue68213.go -- +package generics + +// Hovering over an interface with empty type set must not panic. +type empty interface { //@hover("empty", "empty", empty) + int + string +} + +-- @empty -- +```go +type empty interface { // size=16 (0x10) + int + string +} +``` + +Hovering over an interface with empty type set must not panic. -- generics.go -- package generics -type value[T any] struct { //hover("lue", "value", value),hover("T", "T", valueT) +type value[T any] struct { //@hover("lue", "value", value),hover("T", "T", valueT) val T //@hover("T", "T", valuevalT) Q int64 //@hover("Q", "Q", valueQ) } @@ -30,6 +51,52 @@ func F[P interface{ ~int | string }]() { //@hover("P", "P", Ptparam) var _ P //@hover("P","P",Pvar) } +-- @value -- +```go +type value[T any] struct { + val T //@hover("T", "T", valuevalT) + Q int64 //@hover("Q", "Q", valueQ) +} +``` +-- @valueT -- +```go +type parameter T any +``` +-- @valuevalT -- +```go +type parameter T any +``` +-- @valueQ -- +```go +field Q int64 // size=8 +``` + +@hover("Q", "Q", valueQ) +-- @ValueT -- +```go +type parameter T any +``` +-- @ValuevalT -- +```go +type parameter T any +``` +-- @ValueQ -- +```go +field Q int64 // size=8 +``` + +@hover("Q", "Q", ValueQ) + + +[`(generics.Value).Q` on pkg.go.dev](https://pkg.go.dev/mod.com#Value.Q) +-- @Ptparam -- +```go +type parameter P interface{~int | string} +``` +-- @Pvar -- +```go +type parameter P interface{~int | string} +``` -- inferred.go -- package generics @@ -44,42 +111,7 @@ func _() { _ = app([]int{}, 0) //@hover("app", "app", appint) } --- @ValueQ -- -```go -field Q int64 // size=8 -``` - -@hover("Q", "Q", ValueQ) - - -[`(generics.Value).Q` on pkg.go.dev](https://pkg.go.dev/mod.com#Value.Q) --- @ValueT -- -```go -type parameter T any -``` --- @ValuevalT -- -```go -type parameter T any -``` -- @appint -- ```go func app(s []int, e int) []int // func[S interface{~[]E}, E interface{}](s S, e E) S ``` --- @valueQ -- -```go -field Q int64 // size=8 -``` - -@hover("Q", "Q", valueQ) --- @valuevalT -- -```go -type parameter T any -``` --- @Ptparam -- -```go -type parameter P interface{~int | string} -``` --- @Pvar -- -```go -type parameter P interface{~int | string} -``` diff --git a/internal/typeparams/free.go b/internal/typeparams/free.go index de3496d10..a1d138226 100644 --- a/internal/typeparams/free.go +++ b/internal/typeparams/free.go @@ -21,7 +21,6 @@ type Free struct { // Has reports whether the specified type has a free type parameter. func (w *Free) Has(typ types.Type) (res bool) { - // detect cycles if x, ok := w.seen[typ]; ok { return x @@ -83,7 +82,7 @@ func (w *Free) Has(typ types.Type) (res bool) { } terms, err := InterfaceTermSet(t) if err != nil { - panic(err) + return false // ill typed } for _, term := range terms { if w.Has(term.Type()) {