@@ -12,6 +12,10 @@ import util.Spans.offsetToInt
1212import dotty .tools .tasty .TastyFormat .{ASTsSection , PositionsSection , CommentsSection , AttributesSection }
1313import java .nio .file .{Files , Paths }
1414import 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
1519
1620object TastyPrinter :
1721
@@ -62,26 +66,43 @@ class TastyPrinter(bytes: Array[Byte]) {
6266
6367 private val sb : StringBuilder = new StringBuilder
6468
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
6680 import unpickler .{nameAtRef , unpickle }
6781
6882 private def nameToString (name : Name ): String = name.debugString
6983
7084 private def nameRefToString (ref : NameRef ): String = nameToString(nameAtRef(ref))
7185
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+
7294 private def printNames (): Unit =
95+ sb.append(s " Names ( ${unpickler.namesEnd.index - unpickler.namesStart.index} bytes, starting from ${unpickler.namesStart.index}): \n " )
7396 for ((name, idx) <- nameAtRef.contents.zipWithIndex) {
74- val index = nameStr(" %4d " .format(idx))
97+ val index = nameStr(" %6d " .format(idx))
7598 sb.append(index).append(" : " ).append(nameToString(name)).append(" \n " )
7699 }
77100
78101 def showContents (): String = {
79- sb.append( " Names: \n " )
102+ printHeader( )
80103 printNames()
81- sb.append(" \n " )
82- sb.append(" Trees:\n " )
83104 unpickle(new TreeSectionUnpickler ) match {
84- case Some (s) => sb.append(s)
105+ case Some (s) => sb.append(" \n\n " ).append( s)
85106 case _ =>
86107 }
87108 unpickle(new PositionSectionUnpickler ) match {
@@ -108,8 +129,8 @@ class TastyPrinter(bytes: Array[Byte]) {
108129 import reader .*
109130 var indent = 0
110131 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)
113134 }
114135 def printNat () = sb.append(treeStr(" " + readNat()))
115136 def printName () = {
@@ -165,8 +186,7 @@ class TastyPrinter(bytes: Array[Byte]) {
165186 }
166187 indent -= 2
167188 }
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, starting from $base): " )
170190 while (! isAtEnd) {
171191 printTree()
172192 newLine()
@@ -180,26 +200,30 @@ class TastyPrinter(bytes: Array[Byte]) {
180200 private val sb : StringBuilder = new StringBuilder
181201
182202 def unpickle (reader : TastyReader , tastyName : NameTable ): String = {
203+ import reader .*
183204 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, starting from $base): \n " )
186206 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 " )
190214 val spans = posUnpickler.spans
191215 val sorted = spans.toSeq.sortBy(_._1.index)
192216 for ((addr, pos) <- sorted) {
193- sb.append(treeStr(" %10d " .format(addr.index)))
217+ sb.append(treeStr(" %6d " .format(addr.index)))
194218 sb.append(s " : ${offsetToInt(pos.start)} .. ${pos.end}\n " )
195219 }
196220
197- val sources = posUnpickler.sourcePaths
198- sb.append(s " \n source paths: \n " )
221+ val sources = posUnpickler.sourceNameRefs
222+ sb.append(s " \n source paths: \n " )
199223 val sortedPath = sources.toSeq.sortBy(_._1.index)
200- for ((addr, path ) <- sortedPath) {
201- sb.append(treeStr(" %10d : " .format(addr.index)))
202- sb.append(path )
224+ for ((addr, nameRef ) <- sortedPath) {
225+ sb.append(treeStr(" %6d : " .format(addr.index)))
226+ sb.append(nameStr( s " ${nameRef.index} [ ${tastyName(nameRef)} ] " ) )
203227 sb.append(" \n " )
204228 }
205229
@@ -212,14 +236,15 @@ class TastyPrinter(bytes: Array[Byte]) {
212236 private val sb : StringBuilder = new StringBuilder
213237
214238 def unpickle (reader : TastyReader , tastyName : NameTable ): String = {
215- sb.append( s " ${ reader.endAddr.index - reader.currentAddr.index} " )
239+ import reader .*
216240 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, starting 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+ }
223248 sb.result
224249 }
225250 }
0 commit comments