inlineRecordExprSpreads transforms "{...{a}}" to "{a}".
(v any)
| 454 | |
| 455 | // inlineRecordExprSpreads transforms "{...{a}}" to "{a}". |
| 456 | func inlineRecordExprSpreads(v any) { |
| 457 | walkT(reflect.ValueOf(v), func(r *dag.RecordExpr) *dag.RecordExpr { |
| 458 | for i := range r.Elems { |
| 459 | s, ok := r.Elems[i].(*dag.Spread) |
| 460 | if !ok { |
| 461 | continue |
| 462 | } |
| 463 | r2, ok := s.Expr.(*dag.RecordExpr) |
| 464 | if !ok { |
| 465 | continue |
| 466 | } |
| 467 | r.Elems = slices.Concat(r.Elems[:i], r2.Elems, r.Elems[i+1:]) |
| 468 | } |
| 469 | // dedupe elems from spreads |
| 470 | m := map[string]struct{}{} |
| 471 | for i := len(r.Elems) - 1; i >= 0; i-- { |
| 472 | if f, ok := r.Elems[i].(*dag.Field); ok { |
| 473 | if _, ok := m[f.Name]; ok { |
| 474 | r.Elems = slices.Delete(r.Elems, i, i+1) |
| 475 | } |
| 476 | m[f.Name] = struct{}{} |
| 477 | } |
| 478 | } |
| 479 | return r |
| 480 | }) |
| 481 | } |
| 482 | |
| 483 | func joinFilterPullup(seq dag.Seq) dag.Seq { |
| 484 | seq = mergeFilters(seq) |
no test coverage detected