mirror of
https://github.com/golang/go
synced 2024-11-26 23:41:37 -07:00
go/types, types2: remove internal constant enableInterfaceInference
We're not going to disable this functionality as it would invalidate code that now type-checks with type inference based on this mechanism. Change-Id: Ib11059e2f70a5a209693b06f754cba862e3650ec Reviewed-on: https://go-review.googlesource.com/c/go/+/514715 Auto-Submit: Robert Griesemer <gri@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Run-TryBot: Robert Griesemer <gri@google.com>
This commit is contained in:
parent
68a32ced0f
commit
8597d052b2
@ -53,11 +53,6 @@ const (
|
||||
// the core types, if any, of non-local (unbound) type parameters.
|
||||
enableCoreTypeUnification = true
|
||||
|
||||
// If enableInterfaceInference is set, type inference uses
|
||||
// shared methods for improved type inference involving
|
||||
// interfaces.
|
||||
enableInterfaceInference = true
|
||||
|
||||
// If traceInference is set, unification will print a trace of its operation.
|
||||
// Interpretation of trace:
|
||||
// x ≡ y attempt to unify types x and y
|
||||
@ -339,7 +334,7 @@ func (u *unifier) nify(x, y Type, mode unifyMode, p *ifacePair) (result bool) {
|
||||
// we will fail at function instantiation or argument assignment time.
|
||||
//
|
||||
// If we have at least one defined type, there is one in y.
|
||||
if ny, _ := y.(*Named); mode&exact == 0 && ny != nil && isTypeLit(x) && !(enableInterfaceInference && IsInterface(x)) {
|
||||
if ny, _ := y.(*Named); mode&exact == 0 && ny != nil && isTypeLit(x) && !IsInterface(x) {
|
||||
if traceInference {
|
||||
u.tracef("%s ≡ under %s", x, ny)
|
||||
}
|
||||
@ -437,12 +432,12 @@ func (u *unifier) nify(x, y Type, mode unifyMode, p *ifacePair) (result bool) {
|
||||
emode |= exact
|
||||
}
|
||||
|
||||
// If EnableInterfaceInference is set and we don't require exact unification,
|
||||
// if both types are interfaces, one interface must have a subset of the
|
||||
// methods of the other and corresponding method signatures must unify.
|
||||
// If we don't require exact unification and both types are interfaces,
|
||||
// one interface must have a subset of the methods of the other and
|
||||
// corresponding method signatures must unify.
|
||||
// If only one type is an interface, all its methods must be present in the
|
||||
// other type and corresponding method signatures must unify.
|
||||
if enableInterfaceInference && mode&exact == 0 {
|
||||
if mode&exact == 0 {
|
||||
// One or both interfaces may be defined types.
|
||||
// Look under the name, but not under type parameters (go.dev/issue/60564).
|
||||
xi := asInterface(x)
|
||||
@ -632,7 +627,7 @@ func (u *unifier) nify(x, y Type, mode unifyMode, p *ifacePair) (result bool) {
|
||||
}
|
||||
|
||||
case *Interface:
|
||||
assert(!enableInterfaceInference || mode&exact != 0) // handled before this switch
|
||||
assert(mode&exact != 0) // inexact unification is handled before this switch
|
||||
|
||||
// Two interface types unify if they have the same set of methods with
|
||||
// the same names, and corresponding function types unify.
|
||||
|
@ -55,11 +55,6 @@ const (
|
||||
// the core types, if any, of non-local (unbound) type parameters.
|
||||
enableCoreTypeUnification = true
|
||||
|
||||
// If enableInterfaceInference is set, type inference uses
|
||||
// shared methods for improved type inference involving
|
||||
// interfaces.
|
||||
enableInterfaceInference = true
|
||||
|
||||
// If traceInference is set, unification will print a trace of its operation.
|
||||
// Interpretation of trace:
|
||||
// x ≡ y attempt to unify types x and y
|
||||
@ -341,7 +336,7 @@ func (u *unifier) nify(x, y Type, mode unifyMode, p *ifacePair) (result bool) {
|
||||
// we will fail at function instantiation or argument assignment time.
|
||||
//
|
||||
// If we have at least one defined type, there is one in y.
|
||||
if ny, _ := y.(*Named); mode&exact == 0 && ny != nil && isTypeLit(x) && !(enableInterfaceInference && IsInterface(x)) {
|
||||
if ny, _ := y.(*Named); mode&exact == 0 && ny != nil && isTypeLit(x) && !IsInterface(x) {
|
||||
if traceInference {
|
||||
u.tracef("%s ≡ under %s", x, ny)
|
||||
}
|
||||
@ -439,12 +434,12 @@ func (u *unifier) nify(x, y Type, mode unifyMode, p *ifacePair) (result bool) {
|
||||
emode |= exact
|
||||
}
|
||||
|
||||
// If EnableInterfaceInference is set and we don't require exact unification,
|
||||
// if both types are interfaces, one interface must have a subset of the
|
||||
// methods of the other and corresponding method signatures must unify.
|
||||
// If we don't require exact unification and both types are interfaces,
|
||||
// one interface must have a subset of the methods of the other and
|
||||
// corresponding method signatures must unify.
|
||||
// If only one type is an interface, all its methods must be present in the
|
||||
// other type and corresponding method signatures must unify.
|
||||
if enableInterfaceInference && mode&exact == 0 {
|
||||
if mode&exact == 0 {
|
||||
// One or both interfaces may be defined types.
|
||||
// Look under the name, but not under type parameters (go.dev/issue/60564).
|
||||
xi := asInterface(x)
|
||||
@ -634,7 +629,7 @@ func (u *unifier) nify(x, y Type, mode unifyMode, p *ifacePair) (result bool) {
|
||||
}
|
||||
|
||||
case *Interface:
|
||||
assert(!enableInterfaceInference || mode&exact != 0) // handled before this switch
|
||||
assert(mode&exact != 0) // inexact unification is handled before this switch
|
||||
|
||||
// Two interface types unify if they have the same set of methods with
|
||||
// the same names, and corresponding function types unify.
|
||||
|
Loading…
Reference in New Issue
Block a user