typeparams

package
v0.1.9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 25, 2022 License: BSD-3-Clause Imports: 8 Imported by: 0

Documentation

Overview

Package typeparams contains common utilities for writing tools that interact with generic Go code, as introduced with Go 1.18.

Many of the types and functions in this package are proxies for the new APIs introduced in the standard library with Go 1.18. For example, the typeparams.Union type is an alias for go/types.Union, and the ForTypeSpec function returns the value of the go/ast.TypeSpec.TypeParams field. At Go versions older than 1.18 these helpers are implemented as stubs, allowing users of this package to write code that handles generic constructs inline, even if the Go version being used to compile does not support generics.

Additionally, this package contains common utilities for working with the new generic constructs, to supplement the standard library APIs. Notably, the StructuralTerms API computes a minimal representation of the structural restrictions on a type parameter. In the future, this API may be available from go/types.

See the example/README.md for a more detailed guide on how to update tools to support generics.

Index

Constants

View Source
const Enabled = false

Enabled reports whether type parameters are enabled in the current build environment.

Variables

View Source
var ErrEmptyTypeSet = errors.New("empty type set")

Functions

func ForFuncType added in v0.1.7

func ForFuncType(*ast.FuncType) *ast.FieldList

ForFuncType returns an empty field list, as type parameters are not supported at this Go version.

func ForTypeSpec added in v0.1.7

func ForTypeSpec(*ast.TypeSpec) *ast.FieldList

ForTypeSpec returns an empty field list, as type parameters on not supported at this Go version.

func GetInstances added in v0.1.8

func GetInstances(info *types.Info) map[*ast.Ident]Instance

GetInstances returns a nil map, as type parameters are not supported at this Go version.

func InitInstanceInfo added in v0.1.7

func InitInstanceInfo(*types.Info)

InitInstanceInfo is a noop at this Go version.

func Instantiate added in v0.1.6

func Instantiate(ctxt *Context, typ types.Type, targs []types.Type, validate bool) (types.Type, error)

Instantiate is unsupported on this Go version, and panics.

func IsComparable

func IsComparable(*types.Interface) bool

IsComparable returns false, as no interfaces are type-restricted at this Go version.

func IsImplicit added in v0.1.8

func IsImplicit(*types.Interface) bool

IsImplicit returns false, as no interfaces are implicit at this Go version.

func IsMethodSet added in v0.1.8

func IsMethodSet(*types.Interface) bool

IsMethodSet returns true, as no interfaces are type-restricted at this Go version.

func IsTypeParam added in v0.1.8

func IsTypeParam(t types.Type) bool

IsTypeParam reports whether t is a type parameter.

func MarkImplicit added in v0.1.8

func MarkImplicit(*types.Interface)

MarkImplicit does nothing, because this Go version does not have implicit interfaces.

func NamedTypeOrigin added in v0.1.7

func NamedTypeOrigin(named *types.Named) types.Type

NamedTypeOrigin is the identity method at this Go version.

func NewSignatureType added in v0.1.8

func NewSignatureType(recv *types.Var, recvTypeParams, typeParams []*TypeParam, params, results *types.Tuple, variadic bool) *types.Signature

NewSignatureType calls types.NewSignature, panicking if recvTypeParams or typeParams is non-empty.

func PackIndexExpr added in v0.1.8

func PackIndexExpr(x ast.Expr, lbrack token.Pos, indices []ast.Expr, rbrack token.Pos) ast.Expr

PackIndexExpr returns an *ast.IndexExpr or *ast.IndexListExpr, depending on the cardinality of indices. Calling PackIndexExpr with len(indices) == 0 will panic.

func SetForNamed added in v0.1.6

func SetForNamed(_ *types.Named, tparams []*TypeParam)

SetForNamed panics if tparams is non-empty.

func SetTypeParamConstraint added in v0.1.6

func SetTypeParamConstraint(tparam *TypeParam, constraint types.Type)

SetTypeParamConstraint is unsupported at this Go version, and panics.

func UnpackIndexExpr added in v0.1.9

func UnpackIndexExpr(n ast.Node) (x ast.Expr, lbrack token.Pos, indices []ast.Expr, rbrack token.Pos)

UnpackIndexExpr extracts data from AST nodes that represent index expressions.

For an ast.IndexExpr, the resulting indices slice will contain exactly one index expression. For an ast.IndexListExpr (go1.18+), it may have a variable number of index expressions.

For nodes that don't represent index expressions, the first return value of UnpackIndexExpr will be nil.

Types

type Context added in v0.1.8

type Context struct{}

Context is a placeholder type, as type parameters are not supported at this Go version.

type IndexListExpr added in v0.1.8

type IndexListExpr struct {
	ast.Expr
	X       ast.Expr   // expression
	Lbrack  token.Pos  // position of "["
	Indices []ast.Expr // index expressions
	Rbrack  token.Pos  // position of "]"
}

IndexListExpr is a placeholder type, as type parameters are not supported at this Go version. Its methods panic on use.

type Instance added in v0.1.8

type Instance struct {
	TypeArgs *TypeList
	Type     types.Type
}

Instance is a placeholder type, as type parameters are not supported at this Go version.

type Term added in v0.1.6

type Term struct {
	// contains filtered or unexported fields
}

Term holds information about a structural type restriction.

func InterfaceTermSet added in v0.1.8

func InterfaceTermSet(iface *types.Interface) ([]*Term, error)

InterfaceTermSet computes the normalized terms for a constraint interface, returning an error if the term set cannot be computed or is empty. In the latter case, the error will be ErrEmptyTypeSet.

See the documentation of StructuralTerms for more information on normalization.

func NewTerm added in v0.1.6

func NewTerm(tilde bool, typ types.Type) *Term

NewTerm is unsupported at this Go version, and panics.

func StructuralTerms added in v0.1.8

func StructuralTerms(tparam *TypeParam) ([]*Term, error)

StructuralTerms returns a slice of terms representing the normalized structural type restrictions of a type parameter, if any.

Structural type restrictions of a type parameter are created via non-interface types embedded in its constraint interface (directly, or via a chain of interface embeddings). For example, in the declaration

type T[P interface{~int; m()}] int

the structural restriction of the type parameter P is ~int.

With interface embedding and unions, the specification of structural type restrictions may be arbitrarily complex. For example, consider the following:

type A interface{ ~string|~[]byte }

type B interface{ int|string }

type C interface { ~string|~int }

type T[P interface{ A|B; C }] int

In this example, the structural type restriction of P is ~string|int: A|B expands to ~string|~[]byte|int|string, which reduces to ~string|~[]byte|int, which when intersected with C (~string|~int) yields ~string|int.

StructuralTerms computes these expansions and reductions, producing a "normalized" form of the embeddings. A structural restriction is normalized if it is a single union containing no interface terms, and is minimal in the sense that removing any term changes the set of types satisfying the constraint. It is left as a proof for the reader that, modulo sorting, there is exactly one such normalized form.

Because the minimal representation always takes this form, StructuralTerms returns a slice of tilde terms corresponding to the terms of the union in the normalized structural restriction. An error is returned if the constraint interface is invalid, exceeds complexity bounds, or has an empty type set. In the latter case, StructuralTerms returns ErrEmptyTypeSet.

StructuralTerms makes no guarantees about the order of terms, except that it is deterministic.

func UnionTermSet added in v0.1.8

func UnionTermSet(union *Union) ([]*Term, error)

UnionTermSet computes the normalized terms for a union, returning an error if the term set cannot be computed or is empty. In the latter case, the error will be ErrEmptyTypeSet.

See the documentation of StructuralTerms for more information on normalization.

func (*Term) String added in v0.1.7

func (m *Term) String() string

func (*Term) Tilde added in v0.1.7

func (m *Term) Tilde() bool

func (*Term) Type added in v0.1.7

func (m *Term) Type() types.Type

type TypeList added in v0.1.6

type TypeList struct{}

TypeList is a placeholder for an empty type list.

func NamedTypeArgs added in v0.1.6

func NamedTypeArgs(*types.Named) *TypeList

NamedTypeArgs returns nil.

func (*TypeList) At added in v0.1.6

func (*TypeList) At(int) types.Type

func (*TypeList) Len added in v0.1.6

func (*TypeList) Len() int

type TypeParam added in v0.1.6

type TypeParam struct{ types.Type }

TypeParam is a placeholder type, as type parameters are not supported at this Go version. Its methods panic on use.

func NewTypeParam added in v0.1.6

func NewTypeParam(name *types.TypeName, constraint types.Type) *TypeParam

NewTypeParam is unsupported at this Go version, and panics.

func (*TypeParam) Constraint added in v0.1.7

func (*TypeParam) Constraint() types.Type

func (*TypeParam) Index added in v0.1.8

func (*TypeParam) Index() int

func (*TypeParam) Obj added in v0.1.7

func (*TypeParam) Obj() *types.TypeName

type TypeParamList added in v0.1.6

type TypeParamList struct{}

TypeParamList is a placeholder for an empty type parameter list.

func ForNamed

func ForNamed(*types.Named) *TypeParamList

ForNamed returns an empty type parameter list, as type parameters are not supported at this Go version.

func ForSignature

func ForSignature(*types.Signature) *TypeParamList

ForSignature returns an empty slice.

func RecvTypeParams added in v0.1.6

func RecvTypeParams(sig *types.Signature) *TypeParamList

RecvTypeParams returns a nil slice.

func (*TypeParamList) At added in v0.1.6

func (*TypeParamList) At(int) *TypeParam

func (*TypeParamList) Len added in v0.1.6

func (*TypeParamList) Len() int

type Union added in v0.1.6

type Union struct{ types.Type }

Union is a placeholder type, as type parameters are not supported at this Go version. Its methods panic on use.

func NewUnion added in v0.1.6

func NewUnion(terms []*Term) *Union

NewUnion is unsupported at this Go version, and panics.

func (*Union) Len added in v0.1.7

func (*Union) Len() int

func (*Union) Term added in v0.1.7

func (*Union) Term(i int) *Term

Directories

Path Synopsis
The genericfeatures package provides utilities for detecting usage of generic programming in Go packages.
The genericfeatures package provides utilities for detecting usage of generic programming in Go packages.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL