mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.typeparams] cmd/compile: rename types.Type.{Short,Long}String to {Link,Name}String
The original names "ShortString" and "LongString" refer back to the fmt verbs used to request their formatting styles. However, I always get confused working with them, in particular because (1) the "ShortString" description, which uses package-path qualification, is actually generally longer than the "LongString" description, which uses package-name qualification; and (2) the documentation mentions how they're often used, but doesn't actually describe why they're safe for those purposes. This CL renames them to "LinkString" and "NameString", respectively, based on their primary use cases. It also attempts to more completely describe the strings they return and how they can be used correctly. Change-Id: I9158ae3eafa8ac53da31a78c7a6d929dc0199afe Reviewed-on: https://go-review.googlesource.com/c/go/+/330910 Trust: Matthew Dempsky <mdempsky@google.com> Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
parent
373ca3a846
commit
942edc7502
6 changed files with 39 additions and 19 deletions
|
|
@ -631,7 +631,7 @@ func (r *reader) mangle(sym *types.Sym) *types.Sym {
|
||||||
}
|
}
|
||||||
// TODO(mdempsky): We need the linker to replace "" in the symbol
|
// TODO(mdempsky): We need the linker to replace "" in the symbol
|
||||||
// names here.
|
// names here.
|
||||||
buf.WriteString(targ.ShortString())
|
buf.WriteString(targ.LinkString())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
buf.WriteByte(']')
|
buf.WriteByte(']')
|
||||||
|
|
@ -2041,7 +2041,7 @@ func (r *reader) wrapTypes(target *ir.Package) {
|
||||||
seen := make(map[string]*types.Type)
|
seen := make(map[string]*types.Type)
|
||||||
for _, typ := range needWrapperTypes {
|
for _, typ := range needWrapperTypes {
|
||||||
if typ.Sym() == nil {
|
if typ.Sym() == nil {
|
||||||
key := typ.ShortString()
|
key := typ.LinkString()
|
||||||
if prev := seen[key]; prev != nil {
|
if prev := seen[key]; prev != nil {
|
||||||
if !types.Identical(typ, prev) {
|
if !types.Identical(typ, prev) {
|
||||||
base.Fatalf("collision: types %v and %v have short string %q", typ, prev, key)
|
base.Fatalf("collision: types %v and %v have short string %q", typ, prev, key)
|
||||||
|
|
|
||||||
|
|
@ -717,7 +717,7 @@ func dcommontype(lsym *obj.LSym, t *types.Type) int {
|
||||||
}
|
}
|
||||||
|
|
||||||
exported := false
|
exported := false
|
||||||
p := t.LongString()
|
p := t.NameString()
|
||||||
// If we're writing out type T,
|
// If we're writing out type T,
|
||||||
// we are very likely to write out type *T as well.
|
// we are very likely to write out type *T as well.
|
||||||
// Use the string "*T"[1:] for "T", so that the two
|
// Use the string "*T"[1:] for "T", so that the two
|
||||||
|
|
@ -781,11 +781,11 @@ func dcommontype(lsym *obj.LSym, t *types.Type) int {
|
||||||
// TrackSym returns the symbol for tracking use of field/method f, assumed
|
// TrackSym returns the symbol for tracking use of field/method f, assumed
|
||||||
// to be a member of struct/interface type t.
|
// to be a member of struct/interface type t.
|
||||||
func TrackSym(t *types.Type, f *types.Field) *obj.LSym {
|
func TrackSym(t *types.Type, f *types.Field) *obj.LSym {
|
||||||
return base.PkgLinksym("go.track", t.ShortString()+"."+f.Sym.Name, obj.ABI0)
|
return base.PkgLinksym("go.track", t.LinkString()+"."+f.Sym.Name, obj.ABI0)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TypeSymPrefix(prefix string, t *types.Type) *types.Sym {
|
func TypeSymPrefix(prefix string, t *types.Type) *types.Sym {
|
||||||
p := prefix + "." + t.ShortString()
|
p := prefix + "." + t.LinkString()
|
||||||
s := types.TypeSymLookup(p)
|
s := types.TypeSymLookup(p)
|
||||||
|
|
||||||
// This function is for looking up type-related generated functions
|
// This function is for looking up type-related generated functions
|
||||||
|
|
@ -833,7 +833,7 @@ func TypePtr(t *types.Type) *ir.AddrExpr {
|
||||||
// ITabAddr returns an expression representing a pointer to the itab
|
// ITabAddr returns an expression representing a pointer to the itab
|
||||||
// for concrete type typ implementing interface iface.
|
// for concrete type typ implementing interface iface.
|
||||||
func ITabAddr(typ, iface *types.Type) *ir.AddrExpr {
|
func ITabAddr(typ, iface *types.Type) *ir.AddrExpr {
|
||||||
s, existed := ir.Pkgs.Itab.LookupOK(typ.ShortString() + "," + iface.ShortString())
|
s, existed := ir.Pkgs.Itab.LookupOK(typ.LinkString() + "," + iface.LinkString())
|
||||||
lsym := s.Linksym()
|
lsym := s.Linksym()
|
||||||
|
|
||||||
if !existed {
|
if !existed {
|
||||||
|
|
|
||||||
|
|
@ -678,7 +678,7 @@ func (s *typeSet) add(pos src.XPos, typ *types.Type) {
|
||||||
// LongString does not uniquely identify types, so we need to
|
// LongString does not uniquely identify types, so we need to
|
||||||
// disambiguate collisions with types.Identical.
|
// disambiguate collisions with types.Identical.
|
||||||
// TODO(mdempsky): Add a method that *is* unique.
|
// TODO(mdempsky): Add a method that *is* unique.
|
||||||
ls := typ.LongString()
|
ls := typ.NameString()
|
||||||
prevs := s.m[ls]
|
prevs := s.m[ls]
|
||||||
for _, prev := range prevs {
|
for _, prev := range prevs {
|
||||||
if types.Identical(typ, prev.typ) {
|
if types.Identical(typ, prev.typ) {
|
||||||
|
|
|
||||||
|
|
@ -242,17 +242,37 @@ func (t *Type) String() string {
|
||||||
return tconv(t, 0, fmtGo)
|
return tconv(t, 0, fmtGo)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ShortString generates a short description of t.
|
// LinkString returns an unexpanded string description of t, suitable
|
||||||
// It is used in autogenerated method names, reflection,
|
// for use in link symbols. "Unexpanded" here means that the
|
||||||
// and itab names.
|
// description uses `"".` to qualify identifiers from the current
|
||||||
func (t *Type) ShortString() string {
|
// package, and "expansion" refers to the renaming step performed by
|
||||||
|
// the linker to replace these qualifiers with proper `path/to/pkg.`
|
||||||
|
// qualifiers.
|
||||||
|
//
|
||||||
|
// After expansion, the description corresponds to type identity. That
|
||||||
|
// is, for any pair of types t1 and t2, Identical(t1, t2) and
|
||||||
|
// expand(t1.LinkString()) == expand(t2.LinkString()) report the same
|
||||||
|
// value.
|
||||||
|
//
|
||||||
|
// Within a single compilation unit, LinkString always returns the
|
||||||
|
// same unexpanded description for identical types. Thus it's safe to
|
||||||
|
// use as a map key to implement a type-identity-keyed map. However,
|
||||||
|
// make sure all LinkString calls used for this purpose happen within
|
||||||
|
// the same compile process; the string keys are not stable across
|
||||||
|
// multiple processes.
|
||||||
|
func (t *Type) LinkString() string {
|
||||||
return tconv(t, 0, fmtTypeID)
|
return tconv(t, 0, fmtTypeID)
|
||||||
}
|
}
|
||||||
|
|
||||||
// LongString generates a complete description of t.
|
// NameString generates a user-readable, mostly unique string
|
||||||
// It is useful for reflection,
|
// description of t. NameString always returns the same description
|
||||||
// or when a unique fingerprint or hash of a type is required.
|
// for identical types, even across compilation units.
|
||||||
func (t *Type) LongString() string {
|
//
|
||||||
|
// NameString qualifies identifiers by package name, so it has
|
||||||
|
// collisions when different packages share the same names and
|
||||||
|
// identifiers. It also does not distinguish function-scope defined
|
||||||
|
// types from package-scoped defined types or from each other.
|
||||||
|
func (t *Type) NameString() string {
|
||||||
return tconv(t, 0, fmtTypeIDName)
|
return tconv(t, 0, fmtTypeIDName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -677,7 +697,7 @@ func FmtConst(v constant.Value, sharp bool) string {
|
||||||
|
|
||||||
// TypeHash computes a hash value for type t to use in type switch statements.
|
// TypeHash computes a hash value for type t to use in type switch statements.
|
||||||
func TypeHash(t *Type) uint32 {
|
func TypeHash(t *Type) uint32 {
|
||||||
p := t.LongString()
|
p := t.NameString()
|
||||||
|
|
||||||
// Using MD5 is overkill, but reduces accidental collisions.
|
// Using MD5 is overkill, but reduces accidental collisions.
|
||||||
h := md5.Sum([]byte(p))
|
h := md5.Sum([]byte(p))
|
||||||
|
|
|
||||||
|
|
@ -2129,7 +2129,7 @@ func TypeSymLookup(name string) *Sym {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TypeSymName(t *Type) string {
|
func TypeSymName(t *Type) string {
|
||||||
name := t.ShortString()
|
name := t.LinkString()
|
||||||
// Use a separate symbol name for Noalg types for #17752.
|
// Use a separate symbol name for Noalg types for #17752.
|
||||||
if TypeHasNoAlg(t) {
|
if TypeHasNoAlg(t) {
|
||||||
name = "noalg." + name
|
name = "noalg." + name
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,7 @@ func (o *orderState) newTemp(t *types.Type, clear bool) *ir.Name {
|
||||||
var v *ir.Name
|
var v *ir.Name
|
||||||
// Note: LongString is close to the type equality we want,
|
// Note: LongString is close to the type equality we want,
|
||||||
// but not exactly. We still need to double-check with types.Identical.
|
// but not exactly. We still need to double-check with types.Identical.
|
||||||
key := t.LongString()
|
key := t.NameString()
|
||||||
a := o.free[key]
|
a := o.free[key]
|
||||||
for i, n := range a {
|
for i, n := range a {
|
||||||
if types.Identical(t, n.Type()) {
|
if types.Identical(t, n.Type()) {
|
||||||
|
|
@ -370,7 +370,7 @@ func (o *orderState) markTemp() ordermarker {
|
||||||
// which must have been returned by markTemp.
|
// which must have been returned by markTemp.
|
||||||
func (o *orderState) popTemp(mark ordermarker) {
|
func (o *orderState) popTemp(mark ordermarker) {
|
||||||
for _, n := range o.temp[mark:] {
|
for _, n := range o.temp[mark:] {
|
||||||
key := n.Type().LongString()
|
key := n.Type().NameString()
|
||||||
o.free[key] = append(o.free[key], n)
|
o.free[key] = append(o.free[key], n)
|
||||||
}
|
}
|
||||||
o.temp = o.temp[:mark]
|
o.temp = o.temp[:mark]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue