@@ -22,12 +22,16 @@ object Trace:
22
22
23
23
val empty : Trace = Vector .empty
24
24
25
+ val CONNECTING_INDENT = " \u2502 " // "| "
26
+ val CHILD = " \u251c\u2500\u2500 " // "|-- "
27
+ val LAST_CHILD = " \u2514\u2500\u2500 " // "\-- "
28
+
25
29
extension (trace : Trace )
26
30
def add (node : Tree ): Trace = trace :+ node
27
31
def toVector : Vector [Tree ] = trace
28
32
def ++ (trace2 : Trace ): Trace = trace ++ trace2
29
33
30
- def show (using trace : Trace , ctx : Context ): String = buildStacktrace(trace, " \n " )
34
+ def show (using trace : Trace , ctx : Context ): String = buildStacktrace(trace, " " )
31
35
32
36
def position (using trace : Trace ): Tree = trace.last
33
37
@@ -42,7 +46,6 @@ object Trace:
42
46
var lines : mutable.ArrayBuffer [String ] = new mutable.ArrayBuffer
43
47
trace.foreach { tree =>
44
48
val pos = tree.sourcePos
45
- val prefix = " -> "
46
49
val line =
47
50
if pos.source.exists then
48
51
val loc = " [ " + pos.source.file.name + " :" + (pos.line + 1 ) + " ]"
@@ -52,18 +55,19 @@ object Trace:
52
55
tree match
53
56
case defDef : DefTree =>
54
57
// The definition can be huge, avoid printing the whole definition.
55
- defDef.symbol.show
58
+ defDef.symbol.showFullName
56
59
case _ =>
57
- tree.show
60
+ tree.show.split( System .lineSeparator(), 2 ).nn.head.nn
58
61
val positionMarkerLine =
59
62
if pos.exists && pos.source.exists then
60
- positionMarker(pos)
63
+ CONNECTING_INDENT + positionMarker(pos)
61
64
else " "
62
65
63
66
// always use the more precise trace location
64
- if lastLineNum == pos.line then
67
+ if lastLineNum >= 0 && lastLineNum == pos.line then
65
68
lines.dropRightInPlace(1 )
66
69
70
+ val prefix = if tree `eq` trace.last then LAST_CHILD else CHILD
67
71
lines += (prefix + line + " \n " + positionMarkerLine)
68
72
69
73
lastLineNum = pos.line
0 commit comments