cuelang.org/go@v0.10.1/internal/golangorgx/tools/aliases/aliases_go122.go (about)

     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  //go:build go1.22
     6  // +build go1.22
     7  
     8  package aliases
     9  
    10  import (
    11  	"go/ast"
    12  	"go/parser"
    13  	"go/token"
    14  	"go/types"
    15  	"os"
    16  	"strings"
    17  	"sync"
    18  )
    19  
    20  // Alias is an alias of types.Alias.
    21  type Alias = types.Alias
    22  
    23  // Unalias is a wrapper of types.Unalias.
    24  func Unalias(t types.Type) types.Type { return types.Unalias(t) }
    25  
    26  // newAlias is an internal alias around types.NewAlias.
    27  // Direct usage is discouraged as the moment.
    28  // Try to use NewAlias instead.
    29  func newAlias(tname *types.TypeName, rhs types.Type) *Alias {
    30  	a := types.NewAlias(tname, rhs)
    31  	// TODO(go.dev/issue/65455): Remove kludgy workaround to set a.actual as a side-effect.
    32  	Unalias(a)
    33  	return a
    34  }
    35  
    36  // enabled returns true when types.Aliases are enabled.
    37  func enabled() bool {
    38  	// Use the gotypesalias value in GODEBUG if set.
    39  	godebug := os.Getenv("GODEBUG")
    40  	value := -1 // last set value.
    41  	for _, f := range strings.Split(godebug, ",") {
    42  		switch f {
    43  		case "gotypesalias=1":
    44  			value = 1
    45  		case "gotypesalias=0":
    46  			value = 0
    47  		}
    48  	}
    49  	switch value {
    50  	case 0:
    51  		return false
    52  	case 1:
    53  		return true
    54  	default:
    55  		return aliasesDefault()
    56  	}
    57  }
    58  
    59  // aliasesDefault reports if aliases are enabled by default.
    60  func aliasesDefault() bool {
    61  	// Dynamically check if Aliases will be produced from go/types.
    62  	aliasesDefaultOnce.Do(func() {
    63  		fset := token.NewFileSet()
    64  		f, _ := parser.ParseFile(fset, "a.go", "package p; type A = int", 0)
    65  		pkg, _ := new(types.Config).Check("p", fset, []*ast.File{f}, nil)
    66  		_, gotypesaliasDefault = pkg.Scope().Lookup("A").Type().(*types.Alias)
    67  	})
    68  	return gotypesaliasDefault
    69  }
    70  
    71  var gotypesaliasDefault bool
    72  var aliasesDefaultOnce sync.Once