func()

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)
}