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