diff options
author | Robert Griesemer <gri@golang.org> | 2024-04-25 16:10:22 -0700 |
---|---|---|
committer | Gopher Robot <gobot@golang.org> | 2024-05-15 21:33:05 +0000 |
commit | 3c8f9256067bb3917d7cae05cffdb56dc29e4b3c (patch) | |
tree | f9a8973dc3be691a0a35f8ea519975d906d59b52 /src/go | |
parent | bf279b71e247f9676ec18d636b9f70669b653924 (diff) | |
download | go-3c8f9256067bb3917d7cae05cffdb56dc29e4b3c.tar.gz go-3c8f9256067bb3917d7cae05cffdb56dc29e4b3c.zip |
go/types, types2: factor out type parameter access into genericType
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>
Diffstat (limited to 'src/go')
-rw-r--r-- | src/go/types/instantiate.go | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/src/go/types/instantiate.go b/src/go/types/instantiate.go index d53f5d3fba..38a7e3ffe9 100644 --- a/src/go/types/instantiate.go +++ b/src/go/types/instantiate.go @@ -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. // |