mirror of
https://github.com/golang/go
synced 2024-09-05 07:54:46 +00:00
[dev.typeparams] go/types: interface identity must consider full type set
This is a port of CL 333889 to go/types. Change-Id: I66cefb81a33f4677efc18c1ca923ded374a87f12 Reviewed-on: https://go-review.googlesource.com/c/go/+/335080 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
baeabf3b36
commit
62f6f130fe
|
@ -270,12 +270,21 @@ func identical(x, y Type, cmpTags bool, p *ifacePair) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
case *Interface:
|
case *Interface:
|
||||||
|
// Two interface types are identical if they describe the same type sets.
|
||||||
|
// With the existing implementation restriction, this simplifies to:
|
||||||
|
//
|
||||||
// Two interface types are identical if they have the same set of methods with
|
// Two interface types are identical if they have the same set of methods with
|
||||||
// the same names and identical function types. Lower-case method names from
|
// the same names and identical function types, and if any type restrictions
|
||||||
// different packages are always different. The order of the methods is irrelevant.
|
// are the same. Lower-case method names from different packages are always
|
||||||
|
// different. The order of the methods is irrelevant.
|
||||||
if y, ok := y.(*Interface); ok {
|
if y, ok := y.(*Interface); ok {
|
||||||
a := x.typeSet().methods
|
xset := x.typeSet()
|
||||||
b := y.typeSet().methods
|
yset := y.typeSet()
|
||||||
|
if !Identical(xset.types, yset.types) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
a := xset.methods
|
||||||
|
b := yset.methods
|
||||||
if len(a) == len(b) {
|
if len(a) == len(b) {
|
||||||
// Interface types are the only types where cycles can occur
|
// Interface types are the only types where cycles can occur
|
||||||
// that are not "terminated" via named types; and such cycles
|
// that are not "terminated" via named types; and such cycles
|
||||||
|
|
|
@ -359,16 +359,20 @@ func (u *unifier) nify(x, y Type, p *ifacePair) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
case *Union:
|
case *Union:
|
||||||
// This should not happen with the current internal use of union types.
|
panic("unimplemented: unification with type sets described by types")
|
||||||
panic("type inference across union types not implemented")
|
|
||||||
|
|
||||||
case *Interface:
|
case *Interface:
|
||||||
// Two interface types are identical if they have the same set of methods with
|
// Two interface types are identical if they have the same set of methods with
|
||||||
// the same names and identical function types. Lower-case method names from
|
// the same names and identical function types. Lower-case method names from
|
||||||
// different packages are always different. The order of the methods is irrelevant.
|
// different packages are always different. The order of the methods is irrelevant.
|
||||||
if y, ok := y.(*Interface); ok {
|
if y, ok := y.(*Interface); ok {
|
||||||
a := x.typeSet().methods
|
xset := x.typeSet()
|
||||||
b := y.typeSet().methods
|
yset := y.typeSet()
|
||||||
|
if !Identical(xset.types, yset.types) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
a := xset.methods
|
||||||
|
b := yset.methods
|
||||||
if len(a) == len(b) {
|
if len(a) == len(b) {
|
||||||
// Interface types are the only types where cycles can occur
|
// Interface types are the only types where cycles can occur
|
||||||
// that are not "terminated" via named types; and such cycles
|
// that are not "terminated" via named types; and such cycles
|
||||||
|
|
Loading…
Reference in a new issue