merge merges two similar Args, zapping out differences.
(r *Args)
| 275 | |
| 276 | // merge merges two similar Args, zapping out differences. |
| 277 | func (a *Args) merge(r *Args) Args { |
| 278 | out := Args{ |
| 279 | Values: make([]Arg, len(a.Values)), |
| 280 | Elided: a.Elided, |
| 281 | } |
| 282 | for i, l := range a.Values { |
| 283 | rv := &r.Values[i] |
| 284 | if l.IsAggregate { |
| 285 | out.Values[i].IsAggregate = true |
| 286 | out.Values[i].Fields = l.Fields.merge(&rv.Fields) |
| 287 | } else if !l.equal(rv) { |
| 288 | out.Values[i].Name = "*" |
| 289 | out.Values[i].Value = l.Value |
| 290 | out.Values[i].IsPtr = l.IsPtr |
| 291 | } else { |
| 292 | out.Values[i] = l |
| 293 | } |
| 294 | } |
| 295 | return out |
| 296 | } |
| 297 | |
| 298 | // walk traverses all non-aggregate arguments in the Args struct, calling the |
| 299 | // provided visitor function with each Arg. |