]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.typeparams] go/types: implement TypeParam.Constraint
authorRob Findley <rfindley@google.com>
Tue, 3 Aug 2021 20:24:20 +0000 (16:24 -0400)
committerRobert Findley <rfindley@google.com>
Wed, 4 Aug 2021 11:05:55 +0000 (11:05 +0000)
This is a clean port of CL 336989 to go/types.

Change-Id: Ib8dbe03f420d28ada6d5fc7003ab0c82c7e06c41
Reviewed-on: https://go-review.googlesource.com/c/go/+/339650
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>
src/go/types/typeparam.go

index a3d60c16486e4d13734beae888517f9f789c9024..8cb44ea25ec84bc66f74103e35a0fc8ffed3f5a0 100644 (file)
@@ -60,24 +60,32 @@ func (t *TypeParam) _SetId(id uint64) {
        t.id = id
 }
 
-// TODO(rfindley): document the Bound and SetBound methods.
+// Constraint returns the type constraint specified for t.
+func (t *TypeParam) Constraint() Type {
+       // compute the type set if possible (we may not have an interface)
+       if iface, _ := under(t.bound).(*Interface); iface != nil {
+               // use the type bound position if we have one
+               pos := token.NoPos
+               if n, _ := t.bound.(*Named); n != nil {
+                       pos = n.obj.pos
+               }
+               computeTypeSet(t.check, pos, iface)
+       }
+       return t.bound
+}
 
+// Bound returns the underlying type of the type parameter's
+// constraint.
+// Deprecated for external use. Use Constraint instead.
 func (t *TypeParam) Bound() *Interface {
-       // we may not have an interface (error reported elsewhere)
-       iface, _ := under(t.bound).(*Interface)
-       if iface == nil {
-               return &emptyInterface
+       if iface, _ := under(t.Constraint()).(*Interface); iface != nil {
+               return iface
        }
-       // use the type bound position if we have one
-       pos := token.NoPos
-       if n, _ := t.bound.(*Named); n != nil {
-               pos = n.obj.pos
-       }
-       // TODO(rFindley) switch this to an unexported method on Checker.
-       computeTypeSet(t.check, pos, iface)
-       return iface
+       return &emptyInterface
 }
 
+// TODO(rfindley): document the SetBound methods.
+
 func (t *TypeParam) SetBound(bound Type) {
        if bound == nil {
                panic("internal error: bound must not be nil")