| // Copyright 2020 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package ir |
| |
| import ( |
| "cmd/internal/src" |
| ) |
| |
| // Copy returns a shallow copy of n. |
| func Copy(n Node) Node { |
| return n.copy() |
| } |
| |
| // DeepCopy returns a “deep” copy of n, with its entire structure copied |
| // (except for shared nodes like ONAME, ONONAME, OLITERAL, and OTYPE). |
| // If pos.IsKnown(), it sets the source position of newly allocated Nodes to pos. |
| func DeepCopy(pos src.XPos, n Node) Node { |
| var edit func(Node) Node |
| edit = func(x Node) Node { |
| switch x.Op() { |
| case ONAME, ONONAME, OLITERAL, ONIL, OTYPE: |
| return x |
| } |
| x = Copy(x) |
| if pos.IsKnown() { |
| x.SetPos(pos) |
| } |
| EditChildren(x, edit) |
| return x |
| } |
| return edit(n) |
| } |
| |
| // DeepCopyList returns a list of deep copies (using DeepCopy) of the nodes in list. |
| func DeepCopyList(pos src.XPos, list []Node) []Node { |
| var out []Node |
| for _, n := range list { |
| out = append(out, DeepCopy(pos, n)) |
| } |
| return out |
| } |