(filename string, src []byte, opts rewriteOpts)
| 416 | } |
| 417 | |
| 418 | func (cmd *mainCmd) parseFile(filename string, src []byte, opts rewriteOpts) (parsedFile, error) { |
| 419 | fset := token.NewFileSet() |
| 420 | f, err := parser.ParseFile(fset, filename, src, parser.ParseComments) |
| 421 | if err != nil { |
| 422 | return parsedFile{}, errtrace.Wrap(err) |
| 423 | } |
| 424 | |
| 425 | errtracePkg := "errtrace" // name to use for errtrace package |
| 426 | var importsErrtrace bool // whether there's any errtrace import, including blank imports |
| 427 | needErrtraceImport := true // whether to add a new import. |
| 428 | for _, imp := range f.Imports { |
| 429 | if imp.Path.Value == `"braces.dev/errtrace"` { |
| 430 | importsErrtrace = true |
| 431 | if imp.Name != nil { |
| 432 | if imp.Name.Name == "_" { |
| 433 | // Can't use a blank import, keep processing imports. |
| 434 | continue |
| 435 | } |
| 436 | // If the file already imports errtrace, |
| 437 | // we'll want to use the name it's imported under. |
| 438 | errtracePkg = imp.Name.Name |
| 439 | } |
| 440 | needErrtraceImport = false |
| 441 | break |
| 442 | } |
| 443 | } |
| 444 | |
| 445 | if needErrtraceImport { |
| 446 | // If the file doesn't import errtrace already, |
| 447 | // do a quick check to find an unused identifier name. |
| 448 | idents := make(map[string]struct{}) |
| 449 | ast.Inspect(f, func(n ast.Node) bool { |
| 450 | if ident, ok := n.(*ast.Ident); ok { |
| 451 | idents[ident.Name] = struct{}{} |
| 452 | } |
| 453 | return true |
| 454 | }) |
| 455 | |
| 456 | // Pick a name that isn't already used. |
| 457 | // Prefer "errtrace" if it's available. |
| 458 | for i := 1; ; i++ { |
| 459 | candidate := errtracePkg |
| 460 | if i > 1 { |
| 461 | candidate += strconv.Itoa(i) |
| 462 | } |
| 463 | |
| 464 | if _, ok := idents[candidate]; !ok { |
| 465 | errtracePkg = candidate |
| 466 | break |
| 467 | } |
| 468 | } |
| 469 | } |
| 470 | |
| 471 | var inserts []insert |
| 472 | w := walker{ |
| 473 | fset: fset, |
| 474 | optouts: optoutLines(fset, f.Comments), |
| 475 | errtracePkg: errtracePkg, |
no test coverage detected