MCPcopy Create free account
hub / github.com/bracesdev/errtrace / parseFile

Method parseFile

cmd/errtrace/main.go:418–560  ·  view source on GitHub ↗
(filename string, src []byte, opts rewriteOpts)

Source from the content-addressed store, hash-verified

416}
417
418func (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,

Callers 2

rewriteCompileMethod · 0.95
processFileMethod · 0.95

Calls 3

WrapFunction · 0.92
optoutLinesFunction · 0.85
PosMethod · 0.65

Tested by

no test coverage detected