(f parsedFile, out *bytes.Buffer)
| 560 | } |
| 561 | |
| 562 | func (cmd *mainCmd) rewriteFile(f parsedFile, out *bytes.Buffer) error { |
| 563 | var lastOffset int |
| 564 | filePos := f.fset.File(f.file.Pos()) // position information for this file |
| 565 | for _, it := range f.inserts { |
| 566 | offset := filePos.Offset(it.Pos()) |
| 567 | _, _ = out.Write(f.src[lastOffset:offset]) |
| 568 | lastOffset = offset |
| 569 | |
| 570 | switch it := it.(type) { |
| 571 | case *insertImportErrtrace: |
| 572 | _, _ = io.WriteString(out, "; ") |
| 573 | if it.AddKeyword { |
| 574 | _, _ = io.WriteString(out, "import ") |
| 575 | } |
| 576 | |
| 577 | if f.errtracePkg == "errtrace" { |
| 578 | // Don't use named imports if we're using the default name. |
| 579 | fmt.Fprintf(out, "%q", "braces.dev/errtrace") |
| 580 | } else { |
| 581 | fmt.Fprintf(out, "%s %q", f.errtracePkg, "braces.dev/errtrace") |
| 582 | } |
| 583 | |
| 584 | case *insertWrapOpen: |
| 585 | fmt.Fprintf(out, "%s.Wrap", f.errtracePkg) |
| 586 | if it.N > 1 { |
| 587 | fmt.Fprintf(out, "%d", it.N) |
| 588 | } |
| 589 | _, _ = out.WriteString("(") |
| 590 | |
| 591 | case *insertWrapClose: |
| 592 | _, _ = out.WriteString(")") |
| 593 | |
| 594 | case *insertReturnNBlockStart: |
| 595 | vars := nVars("r", it.N) |
| 596 | fmt.Fprintf(out, "{ %s := ", strings.Join(vars, ", ")) |
| 597 | |
| 598 | // Update last offset, so we skip writing the "return", as it's |
| 599 | // followed by the expression we want to assign to. |
| 600 | // The "return" is added in insertReturnNBlockClose. |
| 601 | lastOffset = filePos.Offset(it.SkipReturn) |
| 602 | |
| 603 | case *insertReturnNBlockClose: |
| 604 | vars := nVars("r", it.N) // must match insertReturnNBlockStart |
| 605 | |
| 606 | // Last return is an error, wrap it. |
| 607 | last := &vars[len(vars)-1] |
| 608 | *last = fmt.Sprintf("%s.Wrap(%v)", f.errtracePkg, *last) |
| 609 | |
| 610 | fmt.Fprintf(out, "; return %s }", strings.Join(vars, ", ")) |
| 611 | |
| 612 | case *insertWrapAssign: |
| 613 | // Turns this: |
| 614 | // return |
| 615 | // Into this: |
| 616 | // x, y = errtrace.Wrap(x), errtrace.Wrap(y); return |
| 617 | for i, name := range it.Names { |
| 618 | if i > 0 { |
| 619 | _, _ = out.WriteString(", ") |
no test coverage detected