Skip to content

Commit

Permalink
[dev.regabi] go/types: factor out sorting of methods
Browse files Browse the repository at this point in the history
This is a port of CL 285993 to go/types.

Change-Id: I7560cf1176fea5de2c54786a086e547c73294a60
Reviewed-on: https://go-review.googlesource.com/c/go/+/289717
Trust: Robert Findley <rfindley@google.com>
Trust: Robert Griesemer <gri@golang.org>
Run-TryBot: Robert Findley <rfindley@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
  • Loading branch information
findleyr committed Feb 9, 2021
1 parent 11d15c1 commit 813958f
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 11 deletions.
6 changes: 2 additions & 4 deletions src/go/types/predicates.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@

package types

import "sort"

func isNamed(typ Type) bool {
if _, ok := typ.(*Basic); ok {
return ok
Expand Down Expand Up @@ -273,8 +271,8 @@ func (check *Checker) identical0(x, y Type, cmpTags bool, p *ifacePair) bool {
p = p.prev
}
if debug {
assert(sort.IsSorted(byUniqueMethodName(a)))
assert(sort.IsSorted(byUniqueMethodName(b)))
assertSortedMethods(a)
assertSortedMethods(b)
}
for i, f := range a {
g := b[i]
Expand Down
8 changes: 3 additions & 5 deletions src/go/types/type.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@

package types

import "sort"

// A Type represents a type of Go.
// All types implement the Type interface.
type Type interface {
Expand Down Expand Up @@ -301,8 +299,8 @@ func NewInterfaceType(methods []*Func, embeddeds []Type) *Interface {
}

// sort for API stability
sort.Sort(byUniqueMethodName(methods))
sort.Stable(byUniqueTypeName(embeddeds))
sortMethods(methods)
sortTypes(embeddeds)

typ.methods = methods
typ.embeddeds = embeddeds
Expand Down Expand Up @@ -396,7 +394,7 @@ func (t *Interface) Complete() *Interface {
}

if methods != nil {
sort.Sort(byUniqueMethodName(methods))
sortMethods(methods)
t.allMethods = methods
}

Expand Down
21 changes: 19 additions & 2 deletions src/go/types/typexpr.go
Original file line number Diff line number Diff line change
Expand Up @@ -518,8 +518,8 @@ func (check *Checker) interfaceType(ityp *Interface, iface *ast.InterfaceType, d
}

// sort for API stability
sort.Sort(byUniqueMethodName(ityp.methods))
sort.Stable(byUniqueTypeName(ityp.embeddeds))
sortMethods(ityp.methods)
sortTypes(ityp.embeddeds)

check.later(func() { check.completeInterface(ityp) })
}
Expand Down Expand Up @@ -613,6 +613,10 @@ func (check *Checker) completeInterface(ityp *Interface) {
}
}

func sortTypes(list []Type) {
sort.Stable(byUniqueTypeName(list))
}

// byUniqueTypeName named type lists can be sorted by their unique type names.
type byUniqueTypeName []Type

Expand All @@ -627,6 +631,19 @@ func sortName(t Type) string {
return ""
}

func sortMethods(list []*Func) {
sort.Sort(byUniqueMethodName(list))
}

func assertSortedMethods(list []*Func) {
if !debug {
panic("internal error: assertSortedMethods called outside debug mode")
}
if !sort.IsSorted(byUniqueMethodName(list)) {
panic("internal error: methods not sorted")
}
}

// byUniqueMethodName method lists can be sorted by their unique method names.
type byUniqueMethodName []*Func

Expand Down

0 comments on commit 813958f

Please sign in to comment.