1// Copyright 2020 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 5package ir 6 7import ( 8 "cmd/internal/src" 9) 10 11// Copy returns a shallow copy of n. 12func Copy(n Node) Node { 13 return n.copy() 14} 15 16// DeepCopy returns a “deep” copy of n, with its entire structure copied 17// (except for shared nodes like ONAME, ONONAME, OLITERAL, and OTYPE). 18// If pos.IsKnown(), it sets the source position of newly allocated Nodes to pos. 19func DeepCopy(pos src.XPos, n Node) Node { 20 var edit func(Node) Node 21 edit = func(x Node) Node { 22 switch x.Op() { 23 case ONAME, ONONAME, OLITERAL, ONIL, OTYPE: 24 return x 25 } 26 x = Copy(x) 27 if pos.IsKnown() { 28 x.SetPos(pos) 29 } 30 EditChildren(x, edit) 31 return x 32 } 33 return edit(n) 34} 35 36// DeepCopyList returns a list of deep copies (using DeepCopy) of the nodes in list. 37func DeepCopyList(pos src.XPos, list []Node) []Node { 38 var out []Node 39 for _, n := range list { 40 out = append(out, DeepCopy(pos, n)) 41 } 42 return out 43} 44