in tools/go-agent/instrument/instrument.go [103:152]
func instrumentFiles(buildDir string, inst api.Instrument, args []string) error {
// parse files
parsedFiles, err := parseFilesInArgs(args)
if err != nil {
return err
}
allFiles := make([]*dst.File, 0)
for _, f := range parsedFiles {
allFiles = append(allFiles, f.dstFile)
}
// filter and edit the files
instrumentedFiles := make([]string, 0)
for path, info := range parsedFiles {
hasInstruted := false
dstutil.Apply(info.dstFile, func(cursor *dstutil.Cursor) bool {
if inst.FilterAndEdit(path, info.dstFile, cursor, allFiles) {
hasInstruted = true
}
return true
}, func(cursor *dstutil.Cursor) bool {
return true
})
if hasInstruted {
instrumentedFiles = append(instrumentedFiles, path)
}
}
// write instrumented files to the build directory
for _, updateFileSrc := range instrumentedFiles {
info := parsedFiles[updateFileSrc]
filename := filepath.Base(updateFileSrc)
dest := filepath.Join(buildDir, filename)
debugInfo, err := tools.BuildDSTDebugInfo(updateFileSrc, nil)
if err != nil {
return err
}
if err := tools.WriteDSTFile(dest, info.dstFile, debugInfo); err != nil {
return err
}
if err := inst.AfterEnhanceFile(updateFileSrc, dest); err != nil {
return err
}
args[info.argsIndex] = dest
}
return nil
}