Skip to content

Commit 6485d2f

Browse files
committed
Homogenize TASTy printer formatting
* Homogenize the formatting of section names and sizes * Homogenize indentation across sections * Add TASTy header section * Add Names section size
1 parent c88c0fe commit 6485d2f

File tree

2 files changed

+60
-28
lines changed

2 files changed

+60
-28
lines changed

compiler/src/dotty/tools/dotc/core/tasty/TastyPrinter.scala

+50-25
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ import util.Spans.offsetToInt
1212
import dotty.tools.tasty.TastyFormat.{ASTsSection, PositionsSection, CommentsSection, AttributesSection}
1313
import java.nio.file.{Files, Paths}
1414
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
1519

1620
object 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, staring 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, staring from $base):")
170190
while (!isAtEnd) {
171191
printTree()
172192
newLine()
@@ -180,25 +200,29 @@ 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, staring 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

197221
val sources = posUnpickler.sourcePaths
198-
sb.append(s"\n source paths:\n")
222+
sb.append(s"\n source paths:\n")
199223
val sortedPath = sources.toSeq.sortBy(_._1.index)
200224
for ((addr, path) <- sortedPath) {
201-
sb.append(treeStr("%10d: ".format(addr.index)))
225+
sb.append(treeStr("%6d: ".format(addr.index)))
202226
sb.append(path)
203227
sb.append("\n")
204228
}
@@ -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, 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+
}
223248
sb.result
224249
}
225250
}

compiler/src/dotty/tools/dotc/core/tasty/TastyUnpickler.scala

+10-3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import TastyBuffer.NameRef
1111
import scala.collection.mutable
1212
import Names.{TermName, termName, EmptyTermName}
1313
import NameKinds.*
14+
import dotty.tools.tasty.TastyHeader
15+
import dotty.tools.tasty.TastyBuffer.Addr
1416

1517
object TastyUnpickler {
1618

@@ -61,7 +63,7 @@ object TastyUnpickler {
6163

6264
import TastyUnpickler.*
6365

64-
class TastyUnpickler(reader: TastyReader) {
66+
class TastyUnpickler(protected val reader: TastyReader) {
6567
import reader.*
6668

6769
def this(bytes: Array[Byte]) = this(new TastyReader(bytes))
@@ -121,17 +123,22 @@ class TastyUnpickler(reader: TastyReader) {
121123
result
122124
}
123125

124-
val header = new TastyHeaderUnpickler(scala3CompilerConfig, reader).readFullHeader()
126+
val header: TastyHeader =
127+
new TastyHeaderUnpickler(scala3CompilerConfig, reader).readFullHeader()
125128

126-
locally {
129+
def readNames(): Unit =
127130
until(readEnd()) { nameAtRef.add(readNameContents()) }
131+
132+
def loadSections(): Unit = {
128133
while (!isAtEnd) {
129134
val secName = readString()
130135
val secEnd = readEnd()
131136
sectionReader(secName) = new TastyReader(bytes, currentAddr.index, secEnd.index, currentAddr.index)
132137
goto(secEnd)
133138
}
134139
}
140+
readNames()
141+
loadSections()
135142

136143
def unpickle[R](sec: SectionUnpickler[R]): Option[R] =
137144
for (reader <- sectionReader.get(sec.name)) yield

0 commit comments

Comments
 (0)