| // Copyright 2021 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| //go:build !go1.18 |
| // +build !go1.18 |
| |
| package typeparams |
| |
| import ( |
| "go/ast" |
| "go/token" |
| "go/types" |
| ) |
| |
| func unsupported() { |
| panic("type parameters are unsupported at this go version") |
| } |
| |
| // IndexListExpr is a placeholder type, as type parameters are not supported at |
| // this Go version. Its methods panic on use. |
| type IndexListExpr struct { |
| ast.Expr |
| X ast.Expr // expression |
| Lbrack token.Pos // position of "[" |
| Indices []ast.Expr // index expressions |
| Rbrack token.Pos // position of "]" |
| } |
| |
| // ForTypeSpec returns an empty field list, as type parameters on not supported |
| // at this Go version. |
| func ForTypeSpec(*ast.TypeSpec) *ast.FieldList { |
| return nil |
| } |
| |
| // ForFuncType returns an empty field list, as type parameters are not |
| // supported at this Go version. |
| func ForFuncType(*ast.FuncType) *ast.FieldList { |
| return nil |
| } |
| |
| // TypeParam is a placeholder type, as type parameters are not supported at |
| // this Go version. Its methods panic on use. |
| type TypeParam struct{ types.Type } |
| |
| func (*TypeParam) Index() int { unsupported(); return 0 } |
| func (*TypeParam) Constraint() types.Type { unsupported(); return nil } |
| func (*TypeParam) Obj() *types.TypeName { unsupported(); return nil } |
| |
| // TypeParamList is a placeholder for an empty type parameter list. |
| type TypeParamList struct{} |
| |
| func (*TypeParamList) Len() int { return 0 } |
| func (*TypeParamList) At(int) *TypeParam { unsupported(); return nil } |
| |
| // TypeList is a placeholder for an empty type list. |
| type TypeList struct{} |
| |
| func (*TypeList) Len() int { return 0 } |
| func (*TypeList) At(int) types.Type { unsupported(); return nil } |
| |
| // NewTypeParam is unsupported at this Go version, and panics. |
| func NewTypeParam(name *types.TypeName, constraint types.Type) *TypeParam { |
| unsupported() |
| return nil |
| } |
| |
| // SetTypeParamConstraint is unsupported at this Go version, and panics. |
| func SetTypeParamConstraint(tparam *TypeParam, constraint types.Type) { |
| unsupported() |
| } |
| |
| // NewSignatureType calls types.NewSignature, panicking if recvTypeParams or |
| // typeParams is non-empty. |
| func NewSignatureType(recv *types.Var, recvTypeParams, typeParams []*TypeParam, params, results *types.Tuple, variadic bool) *types.Signature { |
| if len(recvTypeParams) != 0 || len(typeParams) != 0 { |
| panic("signatures cannot have type parameters at this Go version") |
| } |
| return types.NewSignature(recv, params, results, variadic) |
| } |
| |
| // ForSignature returns an empty slice. |
| func ForSignature(*types.Signature) *TypeParamList { |
| return nil |
| } |
| |
| // RecvTypeParams returns a nil slice. |
| func RecvTypeParams(sig *types.Signature) *TypeParamList { |
| return nil |
| } |
| |
| // IsComparable returns false, as no interfaces are type-restricted at this Go |
| // version. |
| func IsComparable(*types.Interface) bool { |
| return false |
| } |
| |
| // IsMethodSet returns true, as no interfaces are type-restricted at this Go |
| // version. |
| func IsMethodSet(*types.Interface) bool { |
| return true |
| } |
| |
| // IsImplicit returns false, as no interfaces are implicit at this Go version. |
| func IsImplicit(*types.Interface) bool { |
| return false |
| } |
| |
| // MarkImplicit does nothing, because this Go version does not have implicit |
| // interfaces. |
| func MarkImplicit(*types.Interface) {} |
| |
| // ForNamed returns an empty type parameter list, as type parameters are not |
| // supported at this Go version. |
| func ForNamed(*types.Named) *TypeParamList { |
| return nil |
| } |
| |
| // SetForNamed panics if tparams is non-empty. |
| func SetForNamed(_ *types.Named, tparams []*TypeParam) { |
| if len(tparams) > 0 { |
| unsupported() |
| } |
| } |
| |
| // NamedTypeArgs returns nil. |
| func NamedTypeArgs(*types.Named) *TypeList { |
| return nil |
| } |
| |
| // NamedTypeOrigin is the identity method at this Go version. |
| func NamedTypeOrigin(named *types.Named) *types.Named { |
| return named |
| } |
| |
| // Term holds information about a structural type restriction. |
| type Term struct { |
| tilde bool |
| typ types.Type |
| } |
| |
| func (m *Term) Tilde() bool { return m.tilde } |
| func (m *Term) Type() types.Type { return m.typ } |
| func (m *Term) String() string { |
| pre := "" |
| if m.tilde { |
| pre = "~" |
| } |
| return pre + m.typ.String() |
| } |
| |
| // NewTerm is unsupported at this Go version, and panics. |
| func NewTerm(tilde bool, typ types.Type) *Term { |
| return &Term{tilde, typ} |
| } |
| |
| // Union is a placeholder type, as type parameters are not supported at this Go |
| // version. Its methods panic on use. |
| type Union struct{ types.Type } |
| |
| func (*Union) Len() int { return 0 } |
| func (*Union) Term(i int) *Term { unsupported(); return nil } |
| |
| // NewUnion is unsupported at this Go version, and panics. |
| func NewUnion(terms []*Term) *Union { |
| unsupported() |
| return nil |
| } |
| |
| // InitInstanceInfo is a noop at this Go version. |
| func InitInstanceInfo(*types.Info) {} |
| |
| // Instance is a placeholder type, as type parameters are not supported at this |
| // Go version. |
| type Instance struct { |
| TypeArgs *TypeList |
| Type types.Type |
| } |
| |
| // GetInstances returns a nil map, as type parameters are not supported at this |
| // Go version. |
| func GetInstances(info *types.Info) map[*ast.Ident]Instance { return nil } |
| |
| // Context is a placeholder type, as type parameters are not supported at |
| // this Go version. |
| type Context struct{} |
| |
| // NewContext returns a placeholder Context instance. |
| func NewContext() *Context { |
| return &Context{} |
| } |
| |
| // Instantiate is unsupported on this Go version, and panics. |
| func Instantiate(ctxt *Context, typ types.Type, targs []types.Type, validate bool) (types.Type, error) { |
| unsupported() |
| return nil, nil |
| } |