aliases.go raw

   1  // Copyright 2024 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  package aliases
   6  
   7  import (
   8  	"go/token"
   9  	"go/types"
  10  )
  11  
  12  // Package aliases defines backward compatible shims
  13  // for the types.Alias type representation added in 1.22.
  14  // This defines placeholders for x/tools until 1.26.
  15  
  16  // NewAlias creates a new TypeName in Package pkg that
  17  // is an alias for the type rhs.
  18  //
  19  // The enabled parameter determines whether the resulting [TypeName]'s
  20  // type is an [types.Alias]. Its value must be the result of a call to
  21  // [Enabled], which computes the effective value of
  22  // GODEBUG=gotypesalias=... by invoking the type checker. The Enabled
  23  // function is expensive and should be called once per task (e.g.
  24  // package import), not once per call to NewAlias.
  25  //
  26  // Precondition: enabled || len(tparams)==0.
  27  // If materialized aliases are disabled, there must not be any type parameters.
  28  func NewAlias(enabled bool, pos token.Pos, pkg *types.Package, name string, rhs types.Type, tparams []*types.TypeParam) *types.TypeName {
  29  	if enabled {
  30  		tname := types.NewTypeName(pos, pkg, name, nil)
  31  		SetTypeParams(types.NewAlias(tname, rhs), tparams)
  32  		return tname
  33  	}
  34  	if len(tparams) > 0 {
  35  		panic("cannot create an alias with type parameters when gotypesalias is not enabled")
  36  	}
  37  	return types.NewTypeName(pos, pkg, name, rhs)
  38  }
  39