@@ -12,6 +12,10 @@ import util.Spans.offsetToInt
12
12
import dotty .tools .tasty .TastyFormat .{ASTsSection , PositionsSection , CommentsSection }
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, starting 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
sb.append(" \n\n " )
@@ -106,8 +127,8 @@ class TastyPrinter(bytes: Array[Byte]) {
106
127
import reader .*
107
128
var indent = 0
108
129
def newLine () = {
109
- val length = treeStr(" %5d " .format(index(currentAddr) - index(startAddr)))
110
- sb.append(s " \n $length: " + " " * indent)
130
+ val length = treeStr(" %6d " .format(index(currentAddr) - index(startAddr)))
131
+ sb.append(s " \n $length: " + " " * indent)
111
132
}
112
133
def printNat () = sb.append(treeStr(" " + readNat()))
113
134
def printName () = {
@@ -163,8 +184,7 @@ class TastyPrinter(bytes: Array[Byte]) {
163
184
}
164
185
indent -= 2
165
186
}
166
- sb.append(s " start = ${reader.startAddr}, base = $base, current = $currentAddr, end = $endAddr\n " )
167
- sb.append(s " ${endAddr.index - startAddr.index} bytes of AST, base = $currentAddr\n " )
187
+ sb.append(s " Trees ( ${endAddr.index - startAddr.index} bytes, starting from $base): " )
168
188
while (! isAtEnd) {
169
189
printTree()
170
190
newLine()
@@ -178,26 +198,30 @@ class TastyPrinter(bytes: Array[Byte]) {
178
198
private val sb : StringBuilder = new StringBuilder
179
199
180
200
def unpickle (reader : TastyReader , tastyName : NameTable ): String = {
201
+ import reader .*
181
202
val posUnpickler = new PositionUnpickler (reader, tastyName)
182
- sb.append(s " ${reader.endAddr.index - reader.currentAddr.index}" )
183
- sb.append(" position bytes:\n " )
203
+ sb.append(s " Positions ( ${reader.endAddr.index - reader.startAddr.index} bytes, starting from $base): \n " )
184
204
val lineSizes = posUnpickler.lineSizes
185
- sb.append(s " lines: ${lineSizes.length}\n " )
186
- sb.append(posUnpickler.lineSizes.mkString(" line sizes: " , " , " , " \n " ))
187
- sb.append(" positions:\n " )
205
+ sb.append(s " lines: ${lineSizes.length}\n " )
206
+ sb.append(s " line sizes: \n " )
207
+ val windowSize = 20
208
+ for window <- posUnpickler.lineSizes.sliding(windowSize, windowSize) do
209
+ sb.append(" " ).append(window.mkString(" , " )).append(" \n " )
210
+ // sb.append(posUnpickler.lineSizes.mkString(" line sizes: ", ", ", "\n"))
211
+ sb.append(" positions:\n " )
188
212
val spans = posUnpickler.spans
189
213
val sorted = spans.toSeq.sortBy(_._1.index)
190
214
for ((addr, pos) <- sorted) {
191
- sb.append(treeStr(" %10d " .format(addr.index)))
215
+ sb.append(treeStr(" %6d " .format(addr.index)))
192
216
sb.append(s " : ${offsetToInt(pos.start)} .. ${pos.end}\n " )
193
217
}
194
218
195
- val sources = posUnpickler.sourcePaths
196
- sb.append(s " \n source paths: \n " )
219
+ val sources = posUnpickler.sourceNameRefs
220
+ sb.append(s " \n source paths: \n " )
197
221
val sortedPath = sources.toSeq.sortBy(_._1.index)
198
- for ((addr, path ) <- sortedPath) {
199
- sb.append(treeStr(" %10d : " .format(addr.index)))
200
- sb.append(path )
222
+ for ((addr, nameRef ) <- sortedPath) {
223
+ sb.append(treeStr(" %6d : " .format(addr.index)))
224
+ sb.append(nameStr( s " ${nameRef.index} [ ${tastyName(nameRef)} ] " ) )
201
225
sb.append(" \n " )
202
226
}
203
227
@@ -210,14 +234,15 @@ class TastyPrinter(bytes: Array[Byte]) {
210
234
private val sb : StringBuilder = new StringBuilder
211
235
212
236
def unpickle (reader : TastyReader , tastyName : NameTable ): String = {
213
- sb.append( s " ${ reader.endAddr.index - reader.currentAddr.index} " )
237
+ import reader .*
214
238
val comments = new CommentUnpickler (reader).comments
215
- sb.append(s " comment bytes: \n " )
216
- val sorted = comments.toSeq.sortBy(_._1.index)
217
- for ((addr, cmt) <- sorted) {
218
- sb.append(treeStr(" %10d" .format(addr.index)))
219
- sb.append(s " : ${cmt.raw} (expanded = ${cmt.isExpanded}) \n " )
220
- }
239
+ if ! comments.isEmpty then
240
+ sb.append(s " Comments ( ${reader.endAddr.index - reader.startAddr.index} bytes, starting from $base): \n " )
241
+ val sorted = comments.toSeq.sortBy(_._1.index)
242
+ for ((addr, cmt) <- sorted) {
243
+ sb.append(treeStr(" %6d" .format(addr.index)))
244
+ sb.append(s " : ${cmt.raw} (expanded = ${cmt.isExpanded}) \n " )
245
+ }
221
246
sb.result
222
247
}
223
248
}
0 commit comments