@@ -12,6 +12,10 @@ import util.Spans.offsetToInt
12
12
import dotty .tools .tasty .TastyFormat .{ASTsSection , PositionsSection , CommentsSection , AttributesSection }
13
13
import java .nio .file .{Files , Paths }
14
14
import dotty .tools .io .{JarArchive , Path }
15
+ import dotty .tools .tasty .TastyFormat .header
16
+
17
+ import scala .compiletime .uninitialized
18
+ import dotty .tools .tasty .TastyBuffer .Addr
15
19
16
20
object TastyPrinter :
17
21
@@ -62,26 +66,43 @@ class TastyPrinter(bytes: Array[Byte]) {
62
66
63
67
private val sb : StringBuilder = new StringBuilder
64
68
65
- private val unpickler : TastyUnpickler = new TastyUnpickler (bytes)
69
+ class TastyPrinterUnpickler extends TastyUnpickler (bytes) {
70
+ var namesStart : Addr = uninitialized
71
+ var namesEnd : Addr = uninitialized
72
+ override def readNames () = {
73
+ namesStart = reader.currentAddr
74
+ super .readNames()
75
+ namesEnd = reader.currentAddr
76
+ }
77
+ }
78
+
79
+ private val unpickler : TastyPrinterUnpickler = new TastyPrinterUnpickler
66
80
import unpickler .{nameAtRef , unpickle }
67
81
68
82
private def nameToString (name : Name ): String = name.debugString
69
83
70
84
private def nameRefToString (ref : NameRef ): String = nameToString(nameAtRef(ref))
71
85
86
+ private def printHeader (): Unit =
87
+ val header = unpickler.header
88
+ sb.append(" Header:\n " )
89
+ sb.append(s " version: ${header.majorVersion}. ${header.minorVersion}. ${header.experimentalVersion}\n " )
90
+ sb.append(" tooling: " ).append(header.toolingVersion).append(" \n " )
91
+ sb.append(" UUID: " ).append(header.uuid).append(" \n " )
92
+ sb.append(" \n " )
93
+
72
94
private def printNames (): Unit =
95
+ sb.append(s " Names ( ${unpickler.namesEnd.index - unpickler.namesStart.index} bytes, staring from ${unpickler.namesStart.index}): \n " )
73
96
for ((name, idx) <- nameAtRef.contents.zipWithIndex) {
74
- val index = nameStr(" %4d " .format(idx))
97
+ val index = nameStr(" %6d " .format(idx))
75
98
sb.append(index).append(" : " ).append(nameToString(name)).append(" \n " )
76
99
}
77
100
78
101
def showContents (): String = {
79
- sb.append( " Names: \n " )
102
+ printHeader( )
80
103
printNames()
81
- sb.append(" \n " )
82
- sb.append(" Trees:\n " )
83
104
unpickle(new TreeSectionUnpickler ) match {
84
- case Some (s) => sb.append(s)
105
+ case Some (s) => sb.append(" \n\n " ).append( s)
85
106
case _ =>
86
107
}
87
108
unpickle(new PositionSectionUnpickler ) match {
@@ -108,8 +129,8 @@ class TastyPrinter(bytes: Array[Byte]) {
108
129
import reader .*
109
130
var indent = 0
110
131
def newLine () = {
111
- val length = treeStr(" %5d " .format(index(currentAddr) - index(startAddr)))
112
- sb.append(s " \n $length: " + " " * indent)
132
+ val length = treeStr(" %6d " .format(index(currentAddr) - index(startAddr)))
133
+ sb.append(s " \n $length: " + " " * indent)
113
134
}
114
135
def printNat () = sb.append(treeStr(" " + readNat()))
115
136
def printName () = {
@@ -165,8 +186,7 @@ class TastyPrinter(bytes: Array[Byte]) {
165
186
}
166
187
indent -= 2
167
188
}
168
- sb.append(s " start = ${reader.startAddr}, base = $base, current = $currentAddr, end = $endAddr\n " )
169
- sb.append(s " ${endAddr.index - startAddr.index} bytes of AST, base = $currentAddr\n " )
189
+ sb.append(s " Trees ( ${endAddr.index - startAddr.index} bytes, staring from $base): " )
170
190
while (! isAtEnd) {
171
191
printTree()
172
192
newLine()
@@ -180,25 +200,29 @@ class TastyPrinter(bytes: Array[Byte]) {
180
200
private val sb : StringBuilder = new StringBuilder
181
201
182
202
def unpickle (reader : TastyReader , tastyName : NameTable ): String = {
203
+ import reader .*
183
204
val posUnpickler = new PositionUnpickler (reader, tastyName)
184
- sb.append(s " ${reader.endAddr.index - reader.currentAddr.index}" )
185
- sb.append(" position bytes:\n " )
205
+ sb.append(s " Positions ( ${reader.endAddr.index - reader.startAddr.index} bytes, staring from $base): \n " )
186
206
val lineSizes = posUnpickler.lineSizes
187
- sb.append(s " lines: ${lineSizes.length}\n " )
188
- sb.append(posUnpickler.lineSizes.mkString(" line sizes: " , " , " , " \n " ))
189
- sb.append(" positions:\n " )
207
+ sb.append(s " lines: ${lineSizes.length}\n " )
208
+ sb.append(s " line sizes: \n " )
209
+ val windowSize = 20
210
+ for window <- posUnpickler.lineSizes.sliding(windowSize, windowSize) do
211
+ sb.append(" " ).append(window.mkString(" , " )).append(" \n " )
212
+ // sb.append(posUnpickler.lineSizes.mkString(" line sizes: ", ", ", "\n"))
213
+ sb.append(" positions:\n " )
190
214
val spans = posUnpickler.spans
191
215
val sorted = spans.toSeq.sortBy(_._1.index)
192
216
for ((addr, pos) <- sorted) {
193
- sb.append(treeStr(" %10d " .format(addr.index)))
217
+ sb.append(treeStr(" %6d " .format(addr.index)))
194
218
sb.append(s " : ${offsetToInt(pos.start)} .. ${pos.end}\n " )
195
219
}
196
220
197
221
val sources = posUnpickler.sourcePaths
198
- sb.append(s " \n source paths: \n " )
222
+ sb.append(s " \n source paths: \n " )
199
223
val sortedPath = sources.toSeq.sortBy(_._1.index)
200
224
for ((addr, path) <- sortedPath) {
201
- sb.append(treeStr(" %10d : " .format(addr.index)))
225
+ sb.append(treeStr(" %6d : " .format(addr.index)))
202
226
sb.append(path)
203
227
sb.append(" \n " )
204
228
}
@@ -212,14 +236,15 @@ class TastyPrinter(bytes: Array[Byte]) {
212
236
private val sb : StringBuilder = new StringBuilder
213
237
214
238
def unpickle (reader : TastyReader , tastyName : NameTable ): String = {
215
- sb.append( s " ${ reader.endAddr.index - reader.currentAddr.index} " )
239
+ import reader .*
216
240
val comments = new CommentUnpickler (reader).comments
217
- sb.append(s " comment bytes: \n " )
218
- val sorted = comments.toSeq.sortBy(_._1.index)
219
- for ((addr, cmt) <- sorted) {
220
- sb.append(treeStr(" %10d" .format(addr.index)))
221
- sb.append(s " : ${cmt.raw} (expanded = ${cmt.isExpanded}) \n " )
222
- }
241
+ if ! comments.isEmpty then
242
+ sb.append(s " Comments ( ${reader.endAddr.index - reader.startAddr.index} bytes, staring from $base): \n " )
243
+ val sorted = comments.toSeq.sortBy(_._1.index)
244
+ for ((addr, cmt) <- sorted) {
245
+ sb.append(treeStr(" %6d" .format(addr.index)))
246
+ sb.append(s " : ${cmt.raw} (expanded = ${cmt.isExpanded}) \n " )
247
+ }
223
248
sb.result
224
249
}
225
250
}
0 commit comments