// prettyFunc pretty-prints fn for the user interface. // TODO(adonovan): return HTML so we have more markup freedom. func prettyFunc(this *types.Package, fn *ssa.Function) string { if fn.Parent() != nil { return fmt.Sprintf("%s in %s", types.TypeString(this, fn.Signature), prettyFunc(this, fn.Parent())) } if fn.Synthetic != "" && fn.Name() == "init" { // (This is the actual initializer, not a declared 'func init'). if fn.Pkg.Object == this { return "package initializer" } return fmt.Sprintf("%q package initializer", fn.Pkg.Object.Path()) } return fn.RelString(this) }
// Emit the start of a function. func emitFuncStart(fn *ssa.Function, trackPhi bool, canOptMap map[string]bool) { posStr := CodePosition(fn.Pos()) pName := "unknown" // TODO review why this code appears to duplicate that at the start of emitFunctions() if fn.Pkg != nil { if fn.Pkg.Object != nil { pName = fn.Pkg.Object.Name() } } mName := fn.Name() if fn.Signature.Recv() != nil { // we have a method pName = fn.Signature.Recv().Type().String() // note no underlying() } isPublic := unicode.IsUpper(rune(mName[0])) // TODO check rules for non-ASCII 1st characters and fix l := TargetLang fmt.Fprintln(&LanguageList[l].buffer, LanguageList[l].FuncStart(pName, mName, fn, posStr, isPublic, trackPhi, canOptMap)) }
func (l langType) FuncName(fnx *ssa.Function) string { pn := "" if fnx.Signature.Recv() != nil { pn = fnx.Signature.Recv().Type().String() // NOTE no use of underlying here } else { pn = "unknown" fn := fnx if fn.Enclosing != nil { fn = fn.Enclosing } if fn.Pkg != nil { if fn.Pkg.Object != nil { pn = fn.Pkg.Object.Name() } } else { if fn.Object() != nil { if fn.Object().Pkg() != nil { pn = fn.Object().Pkg().Name() } } } } return l.LangName(pn, fnx.Name()) }