mirror of
https://github.com/golang/go
synced 2024-09-15 22:20:06 +00:00
[dev.typeparams] go/types: (TypeParam) SetBound -> SetConstraint
This is a straightforward port of CL 338196 to go/types, minus the deprecated TypeParam.Bound() method (since it is not needed), plus an adjustment for methodset.go. Change-Id: Ie372bfeec245094102a2c3257a43499d75981447 Reviewed-on: https://go-review.googlesource.com/c/go/+/339675 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:
parent
ed3667d079
commit
3efc8f9a8d
|
@ -826,7 +826,7 @@ func (check *Checker) applyTypeFunc(f func(Type) Type, x Type) Type {
|
||||||
// type and collect possible result types at the same time.
|
// type and collect possible result types at the same time.
|
||||||
var rtypes []Type
|
var rtypes []Type
|
||||||
var tildes []bool
|
var tildes []bool
|
||||||
if !tp.Bound().is(func(typ Type, tilde bool) bool {
|
if !tp.iface().is(func(typ Type, tilde bool) bool {
|
||||||
if r := f(typ); r != nil {
|
if r := f(typ); r != nil {
|
||||||
rtypes = append(rtypes, r)
|
rtypes = append(rtypes, r)
|
||||||
tildes = append(tildes, tilde)
|
tildes = append(tildes, tilde)
|
||||||
|
|
|
@ -482,7 +482,7 @@ func (check *Checker) selector(x *operand, e *ast.SelectorExpr) {
|
||||||
var why string
|
var why string
|
||||||
if tpar := asTypeParam(x.typ); tpar != nil {
|
if tpar := asTypeParam(x.typ); tpar != nil {
|
||||||
// Type parameter bounds don't specify fields, so don't mention "field".
|
// Type parameter bounds don't specify fields, so don't mention "field".
|
||||||
if tname := tpar.Bound().obj; tname != nil {
|
if tname := tpar.iface().obj; tname != nil {
|
||||||
why = check.sprintf("interface %s has no method %s", tname.name, sel)
|
why = check.sprintf("interface %s has no method %s", tname.name, sel)
|
||||||
} else {
|
} else {
|
||||||
why = check.sprintf("type bound for %s has no method %s", x.typ, sel)
|
why = check.sprintf("type bound for %s has no method %s", x.typ, sel)
|
||||||
|
|
|
@ -162,7 +162,7 @@ func (check *Checker) verify(pos token.Pos, tparams []*TypeName, targs []Type, p
|
||||||
// A suitable error is reported if the result is false.
|
// A suitable error is reported if the result is false.
|
||||||
// TODO(gri) This should be a method of interfaces or type sets.
|
// TODO(gri) This should be a method of interfaces or type sets.
|
||||||
func (check *Checker) satisfies(pos token.Pos, targ Type, tpar *TypeParam, smap *substMap) bool {
|
func (check *Checker) satisfies(pos token.Pos, targ Type, tpar *TypeParam, smap *substMap) bool {
|
||||||
iface := tpar.Bound()
|
iface := tpar.iface()
|
||||||
if iface.Empty() {
|
if iface.Empty() {
|
||||||
return true // no type bound
|
return true // no type bound
|
||||||
}
|
}
|
||||||
|
@ -176,7 +176,7 @@ func (check *Checker) satisfies(pos token.Pos, targ Type, tpar *TypeParam, smap
|
||||||
// if iface is comparable, targ must be comparable
|
// if iface is comparable, targ must be comparable
|
||||||
// TODO(gri) the error messages needs to be better, here
|
// TODO(gri) the error messages needs to be better, here
|
||||||
if iface.IsComparable() && !Comparable(targ) {
|
if iface.IsComparable() && !Comparable(targ) {
|
||||||
if tpar := asTypeParam(targ); tpar != nil && tpar.Bound().typeSet().IsTop() {
|
if tpar := asTypeParam(targ); tpar != nil && tpar.iface().typeSet().IsTop() {
|
||||||
check.softErrorf(atPos(pos), _Todo, "%s has no constraints", targ)
|
check.softErrorf(atPos(pos), _Todo, "%s has no constraints", targ)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
@ -222,7 +222,7 @@ func (check *Checker) satisfies(pos token.Pos, targ Type, tpar *TypeParam, smap
|
||||||
// If targ is itself a type parameter, each of its possible types, but at least one, must be in the
|
// If targ is itself a type parameter, each of its possible types, but at least one, must be in the
|
||||||
// list of iface types (i.e., the targ type list must be a non-empty subset of the iface types).
|
// list of iface types (i.e., the targ type list must be a non-empty subset of the iface types).
|
||||||
if targ := asTypeParam(targ); targ != nil {
|
if targ := asTypeParam(targ); targ != nil {
|
||||||
targBound := targ.Bound()
|
targBound := targ.iface()
|
||||||
if targBound.typeSet().types == nil {
|
if targBound.typeSet().types == nil {
|
||||||
check.softErrorf(atPos(pos), _Todo, "%s does not satisfy %s (%s has no type constraints)", targ, tpar.bound, targ)
|
check.softErrorf(atPos(pos), _Todo, "%s does not satisfy %s (%s has no type constraints)", targ, tpar.bound, targ)
|
||||||
return false
|
return false
|
||||||
|
|
|
@ -190,7 +190,7 @@ func lookupFieldOrMethod(T Type, addressable bool, pkg *Package, name string) (o
|
||||||
}
|
}
|
||||||
|
|
||||||
case *TypeParam:
|
case *TypeParam:
|
||||||
if i, m := t.Bound().typeSet().LookupMethod(pkg, name); m != nil {
|
if i, m := t.iface().typeSet().LookupMethod(pkg, name); m != nil {
|
||||||
assert(m.typ != nil)
|
assert(m.typ != nil)
|
||||||
index = concat(e.index, i)
|
index = concat(e.index, i)
|
||||||
if obj != nil || e.multiples {
|
if obj != nil || e.multiples {
|
||||||
|
|
|
@ -160,7 +160,7 @@ func NewMethodSet(T Type) *MethodSet {
|
||||||
mset = mset.add(t.typeSet().methods, e.index, true, e.multiples)
|
mset = mset.add(t.typeSet().methods, e.index, true, e.multiples)
|
||||||
|
|
||||||
case *TypeParam:
|
case *TypeParam:
|
||||||
mset = mset.add(t.Bound().typeSet().methods, e.index, true, e.multiples)
|
mset = mset.add(t.iface().typeSet().methods, e.index, true, e.multiples)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -113,7 +113,7 @@ func comparable(T Type, seen map[Type]bool) bool {
|
||||||
case *Array:
|
case *Array:
|
||||||
return comparable(t.elem, seen)
|
return comparable(t.elem, seen)
|
||||||
case *TypeParam:
|
case *TypeParam:
|
||||||
return t.Bound().IsComparable()
|
return t.iface().IsComparable()
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ func optype(typ Type) Type {
|
||||||
// for a type parameter list of the form:
|
// for a type parameter list of the form:
|
||||||
// (type T interface { type T }).
|
// (type T interface { type T }).
|
||||||
// See also issue #39680.
|
// See also issue #39680.
|
||||||
if a := t.Bound().typeSet().types; a != nil && a != typ {
|
if a := t.iface().typeSet().types; a != nil && a != typ {
|
||||||
// If we have a union with a single entry, ignore
|
// If we have a union with a single entry, ignore
|
||||||
// any tilde because under(~t) == under(t).
|
// any tilde because under(~t) == under(t).
|
||||||
if u, _ := a.(*Union); u != nil && u.NumTerms() == 1 {
|
if u, _ := a.(*Union); u != nil && u.NumTerms() == 1 {
|
||||||
|
|
|
@ -74,25 +74,22 @@ func (t *TypeParam) Constraint() Type {
|
||||||
return t.bound
|
return t.bound
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bound returns the underlying type of the type parameter's
|
// SetConstraint sets the type constraint for t.
|
||||||
// constraint.
|
func (t *TypeParam) SetConstraint(bound Type) {
|
||||||
// Deprecated for external use. Use Constraint instead.
|
if bound == nil {
|
||||||
func (t *TypeParam) Bound() *Interface {
|
panic("types2.TypeParam.SetConstraint: bound must not be nil")
|
||||||
|
}
|
||||||
|
t.bound = bound
|
||||||
|
}
|
||||||
|
|
||||||
|
// iface returns the constraint interface of t.
|
||||||
|
func (t *TypeParam) iface() *Interface {
|
||||||
if iface, _ := under(t.Constraint()).(*Interface); iface != nil {
|
if iface, _ := under(t.Constraint()).(*Interface); iface != nil {
|
||||||
return iface
|
return iface
|
||||||
}
|
}
|
||||||
return &emptyInterface
|
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")
|
|
||||||
}
|
|
||||||
t.bound = bound
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *TypeParam) Underlying() Type { return t }
|
func (t *TypeParam) Underlying() Type { return t }
|
||||||
func (t *TypeParam) String() string { return TypeString(t, nil) }
|
func (t *TypeParam) String() string { return TypeString(t, nil) }
|
||||||
|
|
||||||
|
@ -135,5 +132,5 @@ func bindTParams(list []*TypeName) *TypeParams {
|
||||||
// Implementation
|
// Implementation
|
||||||
|
|
||||||
func (t *TypeParam) underIs(f func(Type) bool) bool {
|
func (t *TypeParam) underIs(f func(Type) bool) bool {
|
||||||
return t.Bound().typeSet().underIs(f)
|
return t.iface().typeSet().underIs(f)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue