github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/internal/typeparams/typeparams_go117.go (about)

     1  // Copyright 2021 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build !go1.18
     6  // +build !go1.18
     7  
     8  package typeparams
     9  
    10  import (
    11  	"go/ast"
    12  	"go/token"
    13  	"go/types"
    14  )
    15  
    16  func unsupported() {
    17  	panic("type parameters are unsupported at this go version")
    18  }
    19  
    20  // IndexListExpr is a placeholder type, as type parameters are not supported at
    21  // this Go version. Its methods panic on use.
    22  type IndexListExpr struct {
    23  	ast.Expr
    24  	X       ast.Expr   // expression
    25  	Lbrack  token.Pos  // position of "["
    26  	Indices []ast.Expr // index expressions
    27  	Rbrack  token.Pos  // position of "]"
    28  }
    29  
    30  // ForTypeSpec returns an empty field list, as type parameters on not supported
    31  // at this Go version.
    32  func ForTypeSpec(*ast.TypeSpec) *ast.FieldList {
    33  	return nil
    34  }
    35  
    36  // ForFuncType returns an empty field list, as type parameters are not
    37  // supported at this Go version.
    38  func ForFuncType(*ast.FuncType) *ast.FieldList {
    39  	return nil
    40  }
    41  
    42  // TypeParam is a placeholder type, as type parameters are not supported at
    43  // this Go version. Its methods panic on use.
    44  type TypeParam struct{ types.Type }
    45  
    46  func (*TypeParam) Index() int             { unsupported(); return 0 }
    47  func (*TypeParam) Constraint() types.Type { unsupported(); return nil }
    48  func (*TypeParam) Obj() *types.TypeName   { unsupported(); return nil }
    49  
    50  // TypeParamList is a placeholder for an empty type parameter list.
    51  type TypeParamList struct{}
    52  
    53  func (*TypeParamList) Len() int          { return 0 }
    54  func (*TypeParamList) At(int) *TypeParam { unsupported(); return nil }
    55  
    56  // TypeList is a placeholder for an empty type list.
    57  type TypeList struct{}
    58  
    59  func (*TypeList) Len() int          { return 0 }
    60  func (*TypeList) At(int) types.Type { unsupported(); return nil }
    61  
    62  // NewTypeParam is unsupported at this Go version, and panics.
    63  func NewTypeParam(name *types.TypeName, constraint types.Type) *TypeParam {
    64  	unsupported()
    65  	return nil
    66  }
    67  
    68  // SetTypeParamConstraint is unsupported at this Go version, and panics.
    69  func SetTypeParamConstraint(tparam *TypeParam, constraint types.Type) {
    70  	unsupported()
    71  }
    72  
    73  // NewSignatureType calls types.NewSignature, panicking if recvTypeParams or
    74  // typeParams is non-empty.
    75  func NewSignatureType(recv *types.Var, recvTypeParams, typeParams []*TypeParam, params, results *types.Tuple, variadic bool) *types.Signature {
    76  	if len(recvTypeParams) != 0 || len(typeParams) != 0 {
    77  		panic("signatures cannot have type parameters at this Go version")
    78  	}
    79  	return types.NewSignature(recv, params, results, variadic)
    80  }
    81  
    82  // ForSignature returns an empty slice.
    83  func ForSignature(*types.Signature) *TypeParamList {
    84  	return nil
    85  }
    86  
    87  // RecvTypeParams returns a nil slice.
    88  func RecvTypeParams(sig *types.Signature) *TypeParamList {
    89  	return nil
    90  }
    91  
    92  // IsComparable returns false, as no interfaces are type-restricted at this Go
    93  // version.
    94  func IsComparable(*types.Interface) bool {
    95  	return false
    96  }
    97  
    98  // IsMethodSet returns true, as no interfaces are type-restricted at this Go
    99  // version.
   100  func IsMethodSet(*types.Interface) bool {
   101  	return true
   102  }
   103  
   104  // IsImplicit returns false, as no interfaces are implicit at this Go version.
   105  func IsImplicit(*types.Interface) bool {
   106  	return false
   107  }
   108  
   109  // MarkImplicit does nothing, because this Go version does not have implicit
   110  // interfaces.
   111  func MarkImplicit(*types.Interface) {}
   112  
   113  // ForNamed returns an empty type parameter list, as type parameters are not
   114  // supported at this Go version.
   115  func ForNamed(*types.Named) *TypeParamList {
   116  	return nil
   117  }
   118  
   119  // SetForNamed panics if tparams is non-empty.
   120  func SetForNamed(_ *types.Named, tparams []*TypeParam) {
   121  	if len(tparams) > 0 {
   122  		unsupported()
   123  	}
   124  }
   125  
   126  // NamedTypeArgs returns nil.
   127  func NamedTypeArgs(*types.Named) *TypeList {
   128  	return nil
   129  }
   130  
   131  // NamedTypeOrigin is the identity method at this Go version.
   132  func NamedTypeOrigin(named *types.Named) types.Type {
   133  	return named
   134  }
   135  
   136  // Term holds information about a structural type restriction.
   137  type Term struct {
   138  	tilde bool
   139  	typ   types.Type
   140  }
   141  
   142  func (m *Term) Tilde() bool      { return m.tilde }
   143  func (m *Term) Type() types.Type { return m.typ }
   144  func (m *Term) String() string {
   145  	pre := ""
   146  	if m.tilde {
   147  		pre = "~"
   148  	}
   149  	return pre + m.typ.String()
   150  }
   151  
   152  // NewTerm is unsupported at this Go version, and panics.
   153  func NewTerm(tilde bool, typ types.Type) *Term {
   154  	return &Term{tilde, typ}
   155  }
   156  
   157  // Union is a placeholder type, as type parameters are not supported at this Go
   158  // version. Its methods panic on use.
   159  type Union struct{ types.Type }
   160  
   161  func (*Union) Len() int         { return 0 }
   162  func (*Union) Term(i int) *Term { unsupported(); return nil }
   163  
   164  // NewUnion is unsupported at this Go version, and panics.
   165  func NewUnion(terms []*Term) *Union {
   166  	unsupported()
   167  	return nil
   168  }
   169  
   170  // InitInstanceInfo is a noop at this Go version.
   171  func InitInstanceInfo(*types.Info) {}
   172  
   173  // Instance is a placeholder type, as type parameters are not supported at this
   174  // Go version.
   175  type Instance struct {
   176  	TypeArgs *TypeList
   177  	Type     types.Type
   178  }
   179  
   180  // GetInstances returns a nil map, as type parameters are not supported at this
   181  // Go version.
   182  func GetInstances(info *types.Info) map[*ast.Ident]Instance { return nil }
   183  
   184  // Context is a placeholder type, as type parameters are not supported at
   185  // this Go version.
   186  type Context struct{}
   187  
   188  // NewContext returns a placeholder Context instance.
   189  func NewContext() *Context {
   190  	return &Context{}
   191  }
   192  
   193  // Instantiate is unsupported on this Go version, and panics.
   194  func Instantiate(ctxt *Context, typ types.Type, targs []types.Type, validate bool) (types.Type, error) {
   195  	unsupported()
   196  	return nil, nil
   197  }