Source file src/cmd/compile/internal/types2/compiler_internal.go
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 types2 6 7 import ( 8 "cmd/compile/internal/syntax" 9 "fmt" 10 ) 11 12 // This file should not be copied to go/types. See go.dev/issue/67477 13 14 // RenameResult takes an array of (result) fields and an index, and if the indexed field 15 // does not have a name and if the result in the signature also does not have a name, 16 // then the signature and field are renamed to 17 // 18 // fmt.Sprintf("#rv%d", i+1)` 19 // 20 // the newly named object is inserted into the signature's scope, 21 // and the object and new field name are returned. 22 // 23 // The intended use for RenameResult is to allow rangefunc to assign results within a closure. 24 // This is a hack, as narrowly targeted as possible to discourage abuse. 25 func (s *Signature) RenameResult(results []*syntax.Field, i int) (*Var, *syntax.Name) { 26 a := results[i] 27 obj := s.Results().At(i) 28 29 if !(obj.name == "" || obj.name == "_" && a.Name == nil || a.Name.Value == "_") { 30 panic("Cannot change an existing name") 31 } 32 33 pos := a.Pos() 34 typ := a.Type.GetTypeInfo().Type 35 36 name := fmt.Sprintf("#rv%d", i+1) 37 obj.name = name 38 s.scope.Insert(obj) 39 obj.setScopePos(pos) 40 41 tv := syntax.TypeAndValue{Type: typ} 42 tv.SetIsValue() 43 44 n := syntax.NewName(pos, obj.Name()) 45 n.SetTypeInfo(tv) 46 47 a.Name = n 48 49 return obj, n 50 } 51