| // Copyright 2017 syzkaller project authors. All rights reserved. |
| // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. |
| |
| package ast |
| |
| func (desc *Description) Clone() *Description { |
| desc1 := &Description{} |
| for _, n := range desc.Nodes { |
| desc1.Nodes = append(desc1.Nodes, n.Clone()) |
| } |
| return desc1 |
| } |
| |
| func (n *NewLine) Clone() Node { |
| return &NewLine{ |
| Pos: n.Pos, |
| } |
| } |
| |
| func (n *Comment) Clone() Node { |
| return &Comment{ |
| Pos: n.Pos, |
| Text: n.Text, |
| } |
| } |
| |
| func (n *Include) Clone() Node { |
| return &Include{ |
| Pos: n.Pos, |
| File: n.File.Clone().(*String), |
| } |
| } |
| |
| func (n *Incdir) Clone() Node { |
| return &Incdir{ |
| Pos: n.Pos, |
| Dir: n.Dir.Clone().(*String), |
| } |
| } |
| |
| func (n *Define) Clone() Node { |
| return &Define{ |
| Pos: n.Pos, |
| Name: n.Name.Clone().(*Ident), |
| Value: n.Value.Clone().(*Int), |
| } |
| } |
| |
| func (n *Resource) Clone() Node { |
| return &Resource{ |
| Pos: n.Pos, |
| Name: n.Name.Clone().(*Ident), |
| Base: n.Base.Clone().(*Type), |
| Values: cloneInts(n.Values), |
| } |
| } |
| |
| func (n *TypeDef) Clone() Node { |
| var args []*Ident |
| for _, v := range n.Args { |
| args = append(args, v.Clone().(*Ident)) |
| } |
| var typ *Type |
| if n.Type != nil { |
| typ = n.Type.Clone().(*Type) |
| } |
| var str *Struct |
| if n.Struct != nil { |
| str = n.Struct.Clone().(*Struct) |
| } |
| return &TypeDef{ |
| Pos: n.Pos, |
| Name: n.Name.Clone().(*Ident), |
| Args: args, |
| Type: typ, |
| Struct: str, |
| } |
| } |
| |
| func (n *Call) Clone() Node { |
| var ret *Type |
| if n.Ret != nil { |
| ret = n.Ret.Clone().(*Type) |
| } |
| return &Call{ |
| Pos: n.Pos, |
| Name: n.Name.Clone().(*Ident), |
| CallName: n.CallName, |
| NR: n.NR, |
| Args: cloneFields(n.Args), |
| Ret: ret, |
| } |
| } |
| |
| func (n *Struct) Clone() Node { |
| return &Struct{ |
| Pos: n.Pos, |
| Name: n.Name.Clone().(*Ident), |
| Fields: cloneFields(n.Fields), |
| Attrs: cloneTypes(n.Attrs), |
| Comments: cloneComments(n.Comments), |
| IsUnion: n.IsUnion, |
| } |
| } |
| |
| func (n *IntFlags) Clone() Node { |
| return &IntFlags{ |
| Pos: n.Pos, |
| Name: n.Name.Clone().(*Ident), |
| Values: cloneInts(n.Values), |
| } |
| } |
| |
| func (n *StrFlags) Clone() Node { |
| var values []*String |
| for _, v := range n.Values { |
| values = append(values, v.Clone().(*String)) |
| } |
| return &StrFlags{ |
| Pos: n.Pos, |
| Name: n.Name.Clone().(*Ident), |
| Values: values, |
| } |
| } |
| |
| func (n *Ident) Clone() Node { |
| return &Ident{ |
| Pos: n.Pos, |
| Name: n.Name, |
| } |
| } |
| |
| func (n *String) Clone() Node { |
| return &String{ |
| Pos: n.Pos, |
| Value: n.Value, |
| } |
| } |
| |
| func (n *Int) Clone() Node { |
| return &Int{ |
| Pos: n.Pos, |
| Value: n.Value, |
| ValueFmt: n.ValueFmt, |
| Ident: n.Ident, |
| CExpr: n.CExpr, |
| } |
| } |
| |
| func (n *Type) Clone() Node { |
| return &Type{ |
| Pos: n.Pos, |
| Value: n.Value, |
| ValueFmt: n.ValueFmt, |
| Ident: n.Ident, |
| String: n.String, |
| HasString: n.HasString, |
| HasColon: n.HasColon, |
| Pos2: n.Pos2, |
| Value2: n.Value2, |
| Value2Fmt: n.Value2Fmt, |
| Ident2: n.Ident2, |
| Args: cloneTypes(n.Args), |
| } |
| } |
| |
| func (n *Field) Clone() Node { |
| return &Field{ |
| Pos: n.Pos, |
| Name: n.Name.Clone().(*Ident), |
| Type: n.Type.Clone().(*Type), |
| NewBlock: n.NewBlock, |
| Comments: cloneComments(n.Comments), |
| } |
| } |
| |
| func cloneFields(list []*Field) (res []*Field) { |
| for _, n := range list { |
| res = append(res, n.Clone().(*Field)) |
| } |
| return |
| } |
| |
| func cloneInts(list []*Int) (res []*Int) { |
| for _, n := range list { |
| res = append(res, n.Clone().(*Int)) |
| } |
| return |
| } |
| |
| func cloneTypes(list []*Type) (res []*Type) { |
| for _, n := range list { |
| res = append(res, n.Clone().(*Type)) |
| } |
| return |
| } |
| |
| func cloneComments(list []*Comment) (res []*Comment) { |
| for _, n := range list { |
| res = append(res, n.Clone().(*Comment)) |
| } |
| return |
| } |