1package helpers
2
3import (
4	"runtime/debug"
5	"strings"
6)
7
8func PrettyPrintedStack() string {
9	lines := strings.Split(strings.TrimSpace(string(debug.Stack())), "\n")
10
11	// Strip the first "goroutine" line
12	if len(lines) > 0 {
13		if first := lines[0]; strings.HasPrefix(first, "goroutine ") && strings.HasSuffix(first, ":") {
14			lines = lines[1:]
15		}
16	}
17
18	sb := strings.Builder{}
19
20	for _, line := range lines {
21		// Indented lines are source locations
22		if strings.HasPrefix(line, "\t") {
23			line = line[1:]
24			line = strings.TrimPrefix(line, "github.com/evanw/esbuild/")
25			if offset := strings.LastIndex(line, " +0x"); offset != -1 {
26				line = line[:offset]
27			}
28			sb.WriteString(" (")
29			sb.WriteString(line)
30			sb.WriteString(")")
31			continue
32		}
33
34		// Other lines are function calls
35		if sb.Len() > 0 {
36			sb.WriteByte('\n')
37		}
38		if strings.HasSuffix(line, ")") {
39			if paren := strings.LastIndexByte(line, '('); paren != -1 {
40				line = line[:paren]
41			}
42		}
43		if slash := strings.LastIndexByte(line, '/'); slash != -1 {
44			line = line[slash+1:]
45		}
46		sb.WriteString(line)
47	}
48
49	return sb.String()
50}
51