in tools/go-agent/tools/dst.go [316:369]
func writeDSTFileWithDebug(fset *token.FileSet, file *ast.File, debug *DebugInfo, output io.Writer) error {
var changeInfo *dstFilePathChangeInfo
if !debug.CheckOldLine {
changeInfo = &dstFilePathChangeInfo{
oldDebugPath: debug.FilePath,
oldDebugLine: 1,
newDebugLine: 1,
}
if _, err := fmt.Fprintf(output, "//line %s:%d\n", debug.FilePath, debug.Line); err != nil {
return err
}
if err := printer.Fprint(output, fset, file); err != nil {
return err
}
return nil
}
var buffer bytes.Buffer
if err := printer.Fprint(&buffer, fset, file); err != nil {
return err
}
newPosition, err := findFirstNoImportLocation(fset, file, bytes.NewBuffer(buffer.Bytes()))
if err != nil {
return err
}
changeInfo = &dstFilePathChangeInfo{
oldDebugPath: debug.FilePath,
oldDebugLine: debug.Line,
newDebugLine: newPosition,
}
lineCount := 1
alreadyChange := false
for {
line, err := buffer.ReadBytes('\n')
if err != nil {
if err == io.EOF && !alreadyChange {
return fmt.Errorf("rewrite file line number failure: %v", err)
}
break
}
if lineCount == changeInfo.newDebugLine {
line = []byte(fmt.Sprintf("//line %s:%d\n%s", debug.FilePath, changeInfo.oldDebugLine, line))
alreadyChange = true
}
if _, e := output.Write(line); e != nil {
return err
}
lineCount++
}
return nil
}