// 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.Type { 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 }