]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.regabi] go/types: factor out sorting of methods
authorRob Findley <rfindley@google.com>
Thu, 4 Feb 2021 17:10:02 +0000 (12:10 -0500)
committerRobert Findley <rfindley@google.com>
Tue, 9 Feb 2021 03:57:38 +0000 (03:57 +0000)
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>
src/go/types/predicates.go
src/go/types/type.go
src/go/types/typexpr.go

index 148edbfb767a47d642077d1dbe2c42ed692779f4..954a7ca987a8f554c79264dae3b6da8905405db2 100644 (file)
@@ -6,8 +6,6 @@
 
 package types
 
-import "sort"
-
 func isNamed(typ Type) bool {
        if _, ok := typ.(*Basic); ok {
                return ok
@@ -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]
index 087cda429d689ab83c714a5f18caef0fdd442e16..66e194e967920ecb66ec4bc0a16f1c7ef2711d57 100644 (file)
@@ -4,8 +4,6 @@
 
 package types
 
-import "sort"
-
 // A Type represents a type of Go.
 // All types implement the Type interface.
 type Type interface {
@@ -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
@@ -396,7 +394,7 @@ func (t *Interface) Complete() *Interface {
        }
 
        if methods != nil {
-               sort.Sort(byUniqueMethodName(methods))
+               sortMethods(methods)
                t.allMethods = methods
        }
 
index 2b398010f4d0483f231c9c01b0862b2fbdcf5732..311a970051ad41e8aeb24fdbf49e5b577e755bb1 100644 (file)
@@ -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) })
 }
@@ -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
 
@@ -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