mirror of https://github.com/golang/go.git
go/types: remove subscripts from type parameter names
Now that we've removed the necessity for subscripts in importers, we can effectively eliminate them from the the type parameter API by removing them from the type string. Change-Id: Ic4491b0dea27b0e0ce2d0636dccfaf05168ef9e5 Reviewed-on: https://go-review.googlesource.com/c/go/+/357814 Trust: Robert Findley <rfindley@google.com> Run-TryBot: Robert Findley <rfindley@google.com> Reviewed-by: Robert Griesemer <gri@golang.org> TryBot-Result: Go Bot <gobot@golang.org>
This commit is contained in:
parent
52b10ab794
commit
70ffd852cc
|
|
@ -345,18 +345,18 @@ func TestTypesInfo(t *testing.T) {
|
|||
{broken + `x5; func _() { var x map[string][...]int; x = map[string][...]int{"": {1,2,3}} }`, `x`, `map[string][-1]int`},
|
||||
|
||||
// parameterized functions
|
||||
{genericPkg + `p0; func f[T any](T) {}; var _ = f[int]`, `f`, `func[generic_p0.T₁ interface{}](generic_p0.T₁)`},
|
||||
{genericPkg + `p0; func f[T any](T) {}; var _ = f[int]`, `f`, `func[generic_p0.T interface{}](generic_p0.T)`},
|
||||
{genericPkg + `p1; func f[T any](T) {}; var _ = f[int]`, `f[int]`, `func(int)`},
|
||||
{genericPkg + `p2; func f[T any](T) {}; func _() { f(42) }`, `f`, `func(int)`},
|
||||
{genericPkg + `p3; func f[T any](T) {}; func _() { f[int](42) }`, `f[int]`, `func(int)`},
|
||||
{genericPkg + `p4; func f[T any](T) {}; func _() { f[int](42) }`, `f`, `func[generic_p4.T₁ interface{}](generic_p4.T₁)`},
|
||||
{genericPkg + `p4; func f[T any](T) {}; func _() { f[int](42) }`, `f`, `func[generic_p4.T interface{}](generic_p4.T)`},
|
||||
{genericPkg + `p5; func f[T any](T) {}; func _() { f(42) }`, `f(42)`, `()`},
|
||||
|
||||
// type parameters
|
||||
{genericPkg + `t0; type t[] int; var _ t`, `t`, `generic_t0.t`}, // t[] is a syntax error that is ignored in this test in favor of t
|
||||
{genericPkg + `t1; type t[P any] int; var _ t[int]`, `t`, `generic_t1.t[generic_t1.P₁ interface{}]`},
|
||||
{genericPkg + `t2; type t[P interface{}] int; var _ t[int]`, `t`, `generic_t2.t[generic_t2.P₁ interface{}]`},
|
||||
{genericPkg + `t3; type t[P, Q interface{}] int; var _ t[int, int]`, `t`, `generic_t3.t[generic_t3.P₁, generic_t3.Q₂ interface{}]`},
|
||||
{genericPkg + `t1; type t[P any] int; var _ t[int]`, `t`, `generic_t1.t[generic_t1.P interface{}]`},
|
||||
{genericPkg + `t2; type t[P interface{}] int; var _ t[int]`, `t`, `generic_t2.t[generic_t2.P interface{}]`},
|
||||
{genericPkg + `t3; type t[P, Q interface{}] int; var _ t[int, int]`, `t`, `generic_t3.t[generic_t3.P, generic_t3.Q interface{}]`},
|
||||
|
||||
// TODO (rFindley): compare with types2, which resolves the type broken_t4.t[P₁, Q₂ interface{m()}] here
|
||||
{broken + `t4; type t[P, Q interface{ m() }] int; var _ t[int, int]`, `t`, `broken_t4.t`},
|
||||
|
|
@ -365,7 +365,7 @@ func TestTypesInfo(t *testing.T) {
|
|||
{genericPkg + `g0; type t[P any] int; var x struct{ f t[int] }; var _ = x.f`, `x.f`, `generic_g0.t[int]`},
|
||||
|
||||
// issue 45096
|
||||
{genericPkg + `issue45096; func _[T interface{ ~int8 | ~int16 | ~int32 }](x T) { _ = x < 0 }`, `0`, `generic_issue45096.T₁`},
|
||||
{genericPkg + `issue45096; func _[T interface{ ~int8 | ~int16 | ~int32 }](x T) { _ = x < 0 }`, `0`, `generic_issue45096.T`},
|
||||
|
||||
// issue 47895
|
||||
{`package p; import "unsafe"; type S struct { f int }; var s S; var _ = unsafe.Offsetof(s.f)`, `s.f`, `int`},
|
||||
|
|
|
|||
|
|
@ -113,15 +113,15 @@ var builtinCalls = []struct {
|
|||
|
||||
{"Alignof", `_ = unsafe.Alignof(0)`, `invalid type`}, // constant
|
||||
{"Alignof", `var x struct{}; _ = unsafe.Alignof(x)`, `invalid type`}, // constant
|
||||
{"Alignof", `var x P; _ = unsafe.Alignof(x)`, `func(p.P₁) uintptr`},
|
||||
{"Alignof", `var x P; _ = unsafe.Alignof(x)`, `func(p.P) uintptr`},
|
||||
|
||||
{"Offsetof", `var x struct{f bool}; _ = unsafe.Offsetof(x.f)`, `invalid type`}, // constant
|
||||
{"Offsetof", `var x struct{_ int; f bool}; _ = unsafe.Offsetof((&x).f)`, `invalid type`}, // constant
|
||||
{"Offsetof", `var x struct{_ int; f P}; _ = unsafe.Offsetof((&x).f)`, `func(p.P₁) uintptr`},
|
||||
{"Offsetof", `var x struct{_ int; f P}; _ = unsafe.Offsetof((&x).f)`, `func(p.P) uintptr`},
|
||||
|
||||
{"Sizeof", `_ = unsafe.Sizeof(0)`, `invalid type`}, // constant
|
||||
{"Sizeof", `var x struct{}; _ = unsafe.Sizeof(x)`, `invalid type`}, // constant
|
||||
{"Sizeof", `var x P; _ = unsafe.Sizeof(x)`, `func(p.P₁) uintptr`},
|
||||
{"Sizeof", `var x P; _ = unsafe.Sizeof(x)`, `func(p.P) uintptr`},
|
||||
|
||||
{"Slice", `var p *int; _ = unsafe.Slice(p, 1)`, `func(*int, int) []int`},
|
||||
{"Slice", `var p *byte; var n uintptr; _ = unsafe.Slice(p, n)`, `func(*byte, uintptr) []byte`},
|
||||
|
|
|
|||
|
|
@ -63,10 +63,10 @@ func (check *Checker) markImports(pkg *Package) {
|
|||
}
|
||||
|
||||
func (check *Checker) sprintf(format string, args ...interface{}) string {
|
||||
return sprintf(check.fset, check.qualifier, format, args...)
|
||||
return sprintf(check.fset, check.qualifier, false, format, args...)
|
||||
}
|
||||
|
||||
func sprintf(fset *token.FileSet, qf Qualifier, format string, args ...interface{}) string {
|
||||
func sprintf(fset *token.FileSet, qf Qualifier, debug bool, format string, args ...interface{}) string {
|
||||
for i, arg := range args {
|
||||
switch a := arg.(type) {
|
||||
case nil:
|
||||
|
|
@ -84,7 +84,7 @@ func sprintf(fset *token.FileSet, qf Qualifier, format string, args ...interface
|
|||
case Object:
|
||||
arg = ObjectString(a, qf)
|
||||
case Type:
|
||||
arg = TypeString(a, qf)
|
||||
arg = typeString(a, qf, debug)
|
||||
}
|
||||
args[i] = arg
|
||||
}
|
||||
|
|
@ -95,13 +95,13 @@ func (check *Checker) trace(pos token.Pos, format string, args ...interface{}) {
|
|||
fmt.Printf("%s:\t%s%s\n",
|
||||
check.fset.Position(pos),
|
||||
strings.Repeat(". ", check.indent),
|
||||
check.sprintf(format, args...),
|
||||
sprintf(check.fset, check.qualifier, true, format, args...),
|
||||
)
|
||||
}
|
||||
|
||||
// dump is only needed for debugging
|
||||
func (check *Checker) dump(format string, args ...interface{}) {
|
||||
fmt.Println(check.sprintf(format, args...))
|
||||
fmt.Println(sprintf(check.fset, check.qualifier, true, format, args...))
|
||||
}
|
||||
|
||||
func (check *Checker) err(err error) {
|
||||
|
|
|
|||
|
|
@ -146,7 +146,7 @@ func (check *Checker) satisfies(pos token.Pos, targ Type, tpar *TypeParam, smap
|
|||
qf = check.qualifier
|
||||
}
|
||||
errorf := func(format string, args ...interface{}) error {
|
||||
return errors.New(sprintf(nil, qf, format, args...))
|
||||
return errors.New(sprintf(nil, qf, false, format, args...))
|
||||
}
|
||||
|
||||
// The type parameter bound is parameterized with the same type parameters
|
||||
|
|
|
|||
|
|
@ -44,8 +44,14 @@ func RelativeTo(pkg *Package) Qualifier {
|
|||
// The Qualifier controls the printing of
|
||||
// package-level objects, and may be nil.
|
||||
func TypeString(typ Type, qf Qualifier) string {
|
||||
return typeString(typ, qf, false)
|
||||
}
|
||||
|
||||
func typeString(typ Type, qf Qualifier, debug bool) string {
|
||||
var buf bytes.Buffer
|
||||
WriteType(&buf, typ, qf)
|
||||
w := newTypeWriter(&buf, qf)
|
||||
w.debug = debug
|
||||
w.typ(typ)
|
||||
return buf.String()
|
||||
}
|
||||
|
||||
|
|
@ -65,19 +71,20 @@ func WriteSignature(buf *bytes.Buffer, sig *Signature, qf Qualifier) {
|
|||
}
|
||||
|
||||
type typeWriter struct {
|
||||
buf *bytes.Buffer
|
||||
seen map[Type]bool
|
||||
qf Qualifier
|
||||
ctxt *Context // if non-nil, we are type hashing
|
||||
buf *bytes.Buffer
|
||||
seen map[Type]bool
|
||||
qf Qualifier
|
||||
ctxt *Context // if non-nil, we are type hashing
|
||||
debug bool // if true, write debug annotations
|
||||
}
|
||||
|
||||
func newTypeWriter(buf *bytes.Buffer, qf Qualifier) *typeWriter {
|
||||
return &typeWriter{buf, make(map[Type]bool), qf, nil}
|
||||
return &typeWriter{buf, make(map[Type]bool), qf, nil, false}
|
||||
}
|
||||
|
||||
func newTypeHasher(buf *bytes.Buffer, ctxt *Context) *typeWriter {
|
||||
assert(ctxt != nil)
|
||||
return &typeWriter{buf, make(map[Type]bool), nil, ctxt}
|
||||
return &typeWriter{buf, make(map[Type]bool), nil, ctxt, false}
|
||||
}
|
||||
|
||||
func (w *typeWriter) byte(b byte) {
|
||||
|
|
@ -274,7 +281,10 @@ func (w *typeWriter) typ(typ Type) {
|
|||
if t.obj.pkg != nil {
|
||||
writePackage(w.buf, t.obj.pkg, w.qf)
|
||||
}
|
||||
w.string(t.obj.name + subscript(t.id))
|
||||
w.string(t.obj.name)
|
||||
if w.debug || w.ctxt != nil {
|
||||
w.string(subscript(t.id))
|
||||
}
|
||||
|
||||
case *top:
|
||||
w.error("⊤")
|
||||
|
|
|
|||
Loading…
Reference in New Issue