123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- package xreflect
- import (
- "fmt"
- "net/url"
- "reflect"
- "regexp"
- "runtime"
- "strings"
- "go.uber.org/dig"
- )
- var vendorRe = regexp.MustCompile("^.*?/vendor/")
- func ReturnTypes(t interface{}) []string {
- if reflect.TypeOf(t).Kind() != reflect.Func {
-
- return []string{}
- }
- rtypes := []string{}
- ft := reflect.ValueOf(t).Type()
- for i := 0; i < ft.NumOut(); i++ {
- t := ft.Out(i)
- traverseOuts(key{t: t}, func(s string) {
- rtypes = append(rtypes, s)
- })
- }
- return rtypes
- }
- type key struct {
- t reflect.Type
- name string
- }
- func (k *key) String() string {
- if k.name != "" {
- return fmt.Sprintf("%v:%s", k.t, k.name)
- }
- return k.t.String()
- }
- func traverseOuts(k key, f func(s string)) {
-
- if isErr(k.t) {
- return
- }
-
- if dig.IsOut(k.t) {
-
- for i := 0; i < k.t.NumField(); i++ {
- field := k.t.Field(i)
- ft := field.Type
- if field.PkgPath != "" {
- continue
- }
-
- k := key{
- t: ft,
- name: field.Tag.Get("name"),
- }
- traverseOuts(k, f)
- }
- return
- }
- f(k.String())
- }
- func sanitize(function string) string {
-
-
- if unescaped, err := url.QueryUnescape(function); err == nil {
- function = unescaped
- }
-
- return vendorRe.ReplaceAllString(function, "vendor/")
- }
- func Caller() string {
- return CallerStack(1, 0).CallerName()
- }
- func FuncName(fn interface{}) string {
- fnV := reflect.ValueOf(fn)
- if fnV.Kind() != reflect.Func {
- return fmt.Sprint(fn)
- }
- function := runtime.FuncForPC(fnV.Pointer()).Name()
- return fmt.Sprintf("%s()", sanitize(function))
- }
- func isErr(t reflect.Type) bool {
- errInterface := reflect.TypeOf((*error)(nil)).Elem()
- return t.Implements(errInterface)
- }
- func shouldIgnoreFrame(f Frame) bool {
-
- if strings.Contains(f.File, "_test.go") {
- return false
- }
-
-
- s := strings.TrimPrefix(f.Function, "kpt-tmr-group/pkg/di")
- if len(s) > 0 && s[0] == '.' || s[0] == '/' {
-
-
-
-
- return true
- }
- return false
- }
|