зеркало из https://github.com/golang/tools.git
internal/typeparams: fix crash in interface hover with empty type set
The logic of typeparams.Free.Has was not handling ErrEmptyTypeSet from InterfaceTermSet, leading to a crash. Also fix a hover marker in hover/generics.txt that was apparently missing a '@'. Fixes golang/go#68213 Change-Id: I0e264b5c5f5ecc0d09a0b8ab381eb7d7c492c18f Reviewed-on: https://go-review.googlesource.com/c/tools/+/595555 Auto-Submit: Robert Findley <rfindley@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Alan Donovan <adonovan@google.com>
This commit is contained in:
Родитель
c0ae6bbd24
Коммит
72edac2ff3
|
@ -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}
|
||||
```
|
||||
|
|
|
@ -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()) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче