(fn reflect.Value)
| 17 | } |
| 18 | |
| 19 | func newSource(fn reflect.Value) Source { |
| 20 | var ( |
| 21 | callerFileName string |
| 22 | callerLineNumber int |
| 23 | callerName string |
| 24 | ) |
| 25 | |
| 26 | switch fn.Kind() { |
| 27 | case reflect.Func, reflect.Chan, reflect.Map, reflect.Ptr, reflect.UnsafePointer, reflect.Slice: |
| 28 | pc := fn.Pointer() |
| 29 | fpc := runtime.FuncForPC(pc) |
| 30 | if fpc != nil { |
| 31 | callerFileName, callerLineNumber = fpc.FileLine(pc) |
| 32 | callerName = fpc.Name() |
| 33 | } |
| 34 | |
| 35 | fallthrough |
| 36 | default: |
| 37 | if callerFileName == "" { |
| 38 | callerFileName, callerLineNumber = GetCaller() |
| 39 | } |
| 40 | } |
| 41 | |
| 42 | wd, _ := os.Getwd() |
| 43 | if relFile, err := filepath.Rel(wd, callerFileName); err == nil { |
| 44 | if !strings.HasPrefix(relFile, "..") { |
| 45 | // Only if it's relative to this path, not parent. |
| 46 | callerFileName = "./" + relFile |
| 47 | } |
| 48 | } |
| 49 | |
| 50 | return Source{ |
| 51 | File: filepath.ToSlash(callerFileName), |
| 52 | Line: callerLineNumber, |
| 53 | Caller: callerName, |
| 54 | } |
| 55 | } |
| 56 | |
| 57 | func getSource() Source { |
| 58 | filename, line := GetCaller() |
no test coverage detected
searching dependent graphs…