go.tools/go/types: print interface methods in sorted order
Required for testing code of clients. R=adonovan CC=golang-dev https://golang.org/cl/35940049
This commit is contained in:
parent
59db975409
commit
91abc02562
|
|
@ -48,7 +48,11 @@ func Id(pkg *Package, name string) string {
|
||||||
return name
|
return name
|
||||||
}
|
}
|
||||||
// unexported names need the package path for differentiation
|
// unexported names need the package path for differentiation
|
||||||
path := ""
|
// (if there's no package, make sure we don't start with '.'
|
||||||
|
// as that may change the order of methods between a setup
|
||||||
|
// inside a package and outside a package - which breaks some
|
||||||
|
// tests)
|
||||||
|
path := "_"
|
||||||
// TODO(gri): shouldn't !ast.IsExported(name) => pkg != nil be an precondition?
|
// TODO(gri): shouldn't !ast.IsExported(name) => pkg != nil be an precondition?
|
||||||
// if pkg == nil {
|
// if pkg == nil {
|
||||||
// panic("nil package in lookup of unexported name")
|
// panic("nil package in lookup of unexported name")
|
||||||
|
|
@ -56,7 +60,7 @@ func Id(pkg *Package, name string) string {
|
||||||
if pkg != nil {
|
if pkg != nil {
|
||||||
path = pkg.path
|
path = pkg.path
|
||||||
if path == "" {
|
if path == "" {
|
||||||
path = "?"
|
path = "_"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return path + "." + name
|
return path + "." + name
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"go/ast"
|
"go/ast"
|
||||||
|
"sort"
|
||||||
)
|
)
|
||||||
|
|
||||||
// TypeString returns the string representation of typ.
|
// TypeString returns the string representation of typ.
|
||||||
|
|
@ -84,7 +85,19 @@ func WriteType(buf *bytes.Buffer, this *Package, typ Type) {
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
buf.WriteString("interface{")
|
buf.WriteString("interface{")
|
||||||
for i, m := range t.methods {
|
// Sort methods instead of printing them in source order.
|
||||||
|
// This is needed at the moment because interfaces are
|
||||||
|
// created by providing the list of source methods and
|
||||||
|
// embedded interfaces, but only have an accessor to the list
|
||||||
|
// of all methods (which is sorted by name). By sorting here
|
||||||
|
// we guarantee that the list is printed the same independent
|
||||||
|
// of how the Interface was created.
|
||||||
|
// TODO(gri) remove this extra step once we have the complete
|
||||||
|
// set of accessors for Interface.
|
||||||
|
var methods []*Func
|
||||||
|
methods = append(methods, t.methods...) // make a copy
|
||||||
|
sort.Sort(byUniqueMethodName(methods))
|
||||||
|
for i, m := range methods {
|
||||||
if i > 0 {
|
if i > 0 {
|
||||||
buf.WriteString("; ")
|
buf.WriteString("; ")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue