func funcToken(fn *ssa.Function) token.Pos { switch syntax := fn.Syntax().(type) { case *ast.FuncLit: return syntax.Type.Func case *ast.FuncDecl: return syntax.Type.Func } return token.NoPos }
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, _ = pogo.FuncPathName(fnx) //fmt.Sprintf("fn%d", fnx.Pos()) fn := ssa.EnclosingFunction(fnx.Package(), []ast.Node{fnx.Syntax()}) if fn == nil { fn = fnx } if fn.Pkg != nil { if fn.Pkg.Object != nil { pn = fn.Pkg.Object.Path() // was .Name() } } else { if fn.Object() != nil { if fn.Object().Pkg() != nil { pn = fn.Object().Pkg().Path() // was .Name() } } } } return l.LangName(pn, fnx.Name()) }