1
0
mirror of https://github.com/golang/go synced 2024-09-29 02:24:33 -06:00

go/types: optimize common case in structuralType

This is a port of CL 363668 from types2 to go/types.

Change-Id: Ic55acb2e27f57c33467cef2f687cd695e092ba6d
Reviewed-on: https://go-review.googlesource.com/c/go/+/364898
Trust: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Findley <rfindley@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
Robert Findley 2021-11-17 19:22:22 -05:00
parent 2463b4fcaf
commit 353cb71ea2

View File

@ -56,15 +56,20 @@ func match(x, y Type) Type {
return nil
}
// If typ is a type parameter, structuralType returns the single underlying
// type of all types in the corresponding type constraint if it exists, or
// nil otherwise. If the type set contains only unrestricted and restricted
// channel types (with identical element types), the single underlying type
// is the restricted channel type if the restrictions are always the same.
// If typ is not a type parameter, structuralType returns the underlying type.
func structuralType(typ Type) Type {
// If t is not a type parameter, structuralType returns the underlying type.
// If t is a type parameter, structuralType returns the single underlying
// type of all types in its type set if it exists, or nil otherwise. If the
// type set contains only unrestricted and restricted channel types (with
// identical element types), the single underlying type is the restricted
// channel type if the restrictions are always the same, or nil otherwise.
func structuralType(t Type) Type {
tpar, _ := t.(*TypeParam)
if tpar == nil {
return under(t)
}
var su Type
if underIs(typ, func(u Type) bool {
if tpar.underIs(func(u Type) bool {
if u == nil {
return false
}