in tools/go-agent/instrument/logger/instrument.go [103:138]
func (i *Instrument) addAutomaticBindFunc(path string, curFile dst.Node, fun *dst.FuncDecl, body string) {
automaticBind, err := frameworks.FrameworkFS.ReadFile("templates/automatic_bind.tmpl")
if err != nil {
panic(err)
}
funcID := tools.BuildFuncIdentity(i.compileOpts.Package, fun)
var generateFuncName = fmt.Sprintf("%sautomaticLoggerBind%s", rewrite.GenerateMethodPrefix, funcID)
var replaceName = fmt.Sprintf("//goagent:bind_%s\n", funcID)
importAnalyzer := tools.CreateImportAnalyzer()
importAnalyzer.AnalyzeFileImports(path, curFile)
funcInvoker := tools.ExecuteTemplate(string(automaticBind), struct {
AutomaticBindFuncName string
Recvs []*tools.ParameterInfo
Parameters []*tools.ParameterInfo
Results []*tools.ParameterInfo
}{
AutomaticBindFuncName: generateFuncName,
Recvs: tools.EnhanceParameterNames(fun.Recv, tools.FieldListTypeRecv),
Parameters: tools.EnhanceParameterNames(fun.Type.Params, tools.FieldListTypeParam),
Results: tools.EnhanceParameterNames(fun.Type.Results, tools.FieldListTypeResult),
})
importAnalyzer.AnalyzeNeedsImports(path, fun.Recv)
importAnalyzer.AnalyzeNeedsImports(path, fun.Type.Params)
importAnalyzer.AnalyzeNeedsImports(path, fun.Type.Results)
i.automaticFunc = append(i.automaticFunc, &AutomaticFunctionInfo{
Path: path,
Func: fun,
FuncName: generateFuncName,
RealInvoker: funcInvoker,
ReplaceName: replaceName,
DelegateBody: body,
ImportAnalyzer: importAnalyzer,
})
fun.Body.Decs.Lbrace.Prepend("\n", replaceName)
}