github.com/bir3/gocompiler@v0.9.2202/src/cmd/compile/internal/ir/copy.go (about)

     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  
     5  package ir
     6  
     7  import (
     8  	"github.com/bir3/gocompiler/src/cmd/internal/src"
     9  )
    10  
    11  // Copy returns a shallow copy of n.
    12  func 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.
    19  func 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.
    37  func 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  }