]> Cypherpunks repositories - gostls13.git/commitdiff
go/types, types2: factor out type parameter access into genericType
authorRobert Griesemer <gri@golang.org>
Thu, 25 Apr 2024 23:10:22 +0000 (16:10 -0700)
committerGopher Robot <gobot@golang.org>
Wed, 15 May 2024 21:33:05 +0000 (21:33 +0000)
Also, remove types2.Signature.SetTypeParams as it is not used
and does not exist in go/types.

Change-Id: I16c3ae988988d3735907e9c6c56e8626497ea405
Reviewed-on: https://go-review.googlesource.com/c/go/+/581817
Reviewed-by: Robert Griesemer <gri@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Robert Griesemer <gri@google.com>
Reviewed-by: Robert Findley <rfindley@google.com>
src/cmd/compile/internal/types2/instantiate.go
src/cmd/compile/internal/types2/signature.go
src/go/types/instantiate.go

index a25cb141eca0d18ce479e2ce06af3925b6d9a217..5630d06bc9d296c0c4d2b93b3630e2fac1e8ee44 100644 (file)
@@ -14,6 +14,12 @@ import (
        . "internal/types/errors"
 )
 
+// A genericType implements access to its type parameters.
+type genericType interface {
+       Type
+       TypeParams() *TypeParamList
+}
+
 // Instantiate instantiates the type orig with the given type arguments targs.
 // orig must be a *Named or a *Signature type. If there is no error, the
 // resulting Type is an instantiated type of the same kind (either a *Named or
@@ -41,17 +47,15 @@ import (
 // count is incorrect; for *Named types, a panic may occur later inside the
 // *Named API.
 func Instantiate(ctxt *Context, orig Type, targs []Type, validate bool) (Type, error) {
+       assert(len(targs) > 0)
        if ctxt == nil {
                ctxt = NewContext()
        }
+       orig_ := orig.(genericType) // signature of Instantiate must not change for backward-compatibility
+
        if validate {
-               var tparams []*TypeParam
-               switch t := orig.(type) {
-               case *Named:
-                       tparams = t.TypeParams().list()
-               case *Signature:
-                       tparams = t.TypeParams().list()
-               }
+               tparams := orig_.TypeParams().list()
+               assert(len(tparams) > 0)
                if len(targs) != len(tparams) {
                        return nil, fmt.Errorf("got %d type arguments but %s has %d type parameters", len(targs), orig, len(tparams))
                }
@@ -60,7 +64,7 @@ func Instantiate(ctxt *Context, orig Type, targs []Type, validate bool) (Type, e
                }
        }
 
-       inst := (*Checker)(nil).instance(nopos, orig, targs, nil, ctxt)
+       inst := (*Checker)(nil).instance(nopos, orig_, targs, nil, ctxt)
        return inst, nil
 }
 
@@ -75,7 +79,7 @@ func Instantiate(ctxt *Context, orig Type, targs []Type, validate bool) (Type, e
 // must be non-nil.
 //
 // For Named types the resulting instance may be unexpanded.
-func (check *Checker) instance(pos syntax.Pos, orig Type, targs []Type, expanding *Named, ctxt *Context) (res Type) {
+func (check *Checker) instance(pos syntax.Pos, orig genericType, targs []Type, expanding *Named, ctxt *Context) (res Type) {
        // The order of the contexts below matters: we always prefer instances in the
        // expanding instance context in order to preserve reference cycles.
        //
index bb4d32b016da00e01b7211c7b6018ce2ccc31fd7..7a5a2c155f00324fd502dda1af62e3c307bd2c63 100644 (file)
@@ -73,9 +73,6 @@ func (s *Signature) Recv() *Var { return s.recv }
 // TypeParams returns the type parameters of signature s, or nil.
 func (s *Signature) TypeParams() *TypeParamList { return s.tparams }
 
-// SetTypeParams sets the type parameters of signature s.
-func (s *Signature) SetTypeParams(tparams []*TypeParam) { s.tparams = bindTParams(tparams) }
-
 // RecvTypeParams returns the receiver type parameters of signature s, or nil.
 func (s *Signature) RecvTypeParams() *TypeParamList { return s.rparams }
 
index d53f5d3fba6e1c078ee16a3ede2935d927fb0f06..38a7e3ffe9b9fc7809e6d83ce7241a20a139cb39 100644 (file)
@@ -17,6 +17,12 @@ import (
        . "internal/types/errors"
 )
 
+// A genericType implements access to its type parameters.
+type genericType interface {
+       Type
+       TypeParams() *TypeParamList
+}
+
 // Instantiate instantiates the type orig with the given type arguments targs.
 // orig must be a *Named or a *Signature type. If there is no error, the
 // resulting Type is an instantiated type of the same kind (either a *Named or
@@ -44,17 +50,15 @@ import (
 // count is incorrect; for *Named types, a panic may occur later inside the
 // *Named API.
 func Instantiate(ctxt *Context, orig Type, targs []Type, validate bool) (Type, error) {
+       assert(len(targs) > 0)
        if ctxt == nil {
                ctxt = NewContext()
        }
+       orig_ := orig.(genericType) // signature of Instantiate must not change for backward-compatibility
+
        if validate {
-               var tparams []*TypeParam
-               switch t := orig.(type) {
-               case *Named:
-                       tparams = t.TypeParams().list()
-               case *Signature:
-                       tparams = t.TypeParams().list()
-               }
+               tparams := orig_.TypeParams().list()
+               assert(len(tparams) > 0)
                if len(targs) != len(tparams) {
                        return nil, fmt.Errorf("got %d type arguments but %s has %d type parameters", len(targs), orig, len(tparams))
                }
@@ -63,7 +67,7 @@ func Instantiate(ctxt *Context, orig Type, targs []Type, validate bool) (Type, e
                }
        }
 
-       inst := (*Checker)(nil).instance(nopos, orig, targs, nil, ctxt)
+       inst := (*Checker)(nil).instance(nopos, orig_, targs, nil, ctxt)
        return inst, nil
 }
 
@@ -78,7 +82,7 @@ func Instantiate(ctxt *Context, orig Type, targs []Type, validate bool) (Type, e
 // must be non-nil.
 //
 // For Named types the resulting instance may be unexpanded.
-func (check *Checker) instance(pos token.Pos, orig Type, targs []Type, expanding *Named, ctxt *Context) (res Type) {
+func (check *Checker) instance(pos token.Pos, orig genericType, targs []Type, expanding *Named, ctxt *Context) (res Type) {
        // The order of the contexts below matters: we always prefer instances in the
        // expanding instance context in order to preserve reference cycles.
        //