@@ -13,9 +13,11 @@ import dotty.tools.tasty.TastyFormat.{ASTsSection, PositionsSection, CommentsSec
13
13
import java .nio .file .{Files , Paths }
14
14
import dotty .tools .io .{JarArchive , Path }
15
15
import dotty .tools .tasty .TastyFormat .header
16
+ import scala .collection .immutable .BitSet
16
17
17
18
import scala .compiletime .uninitialized
18
19
import dotty .tools .tasty .TastyBuffer .Addr
20
+ import dotty .tools .dotc .core .Names .TermName
19
21
20
22
object TastyPrinter :
21
23
@@ -82,10 +84,6 @@ class TastyPrinter(bytes: Array[Byte], val testPickler: Boolean) {
82
84
private val unpickler : TastyPrinterUnpickler = new TastyPrinterUnpickler
83
85
import unpickler .{nameAtRef , unpickle }
84
86
85
- private def nameToString (name : Name ): String = name.debugString
86
-
87
- private def nameRefToString (ref : NameRef ): String = nameToString(nameAtRef(ref))
88
-
89
87
private def printHeader (sb : StringBuilder ): Unit =
90
88
val header = unpickler.header
91
89
sb.append(" Header:\n " )
@@ -101,27 +99,34 @@ class TastyPrinter(bytes: Array[Byte], val testPickler: Boolean) {
101
99
end if
102
100
sb.append(" \n " )
103
101
104
- private def printNames (sb : StringBuilder ): Unit =
102
+ private def printNames (sb : StringBuilder )( using refs : NameRefs ) : Unit =
105
103
sb.append(s " Names ( ${unpickler.namesEnd.index - unpickler.namesStart.index} bytes, starting from ${unpickler.namesStart.index}): \n " )
106
104
for ((name, idx) <- nameAtRef.contents.zipWithIndex) {
107
105
val index = nameStr(" %6d" .format(idx))
108
- sb.append(index).append(" : " ).append(nameToString(name )).append(" \n " )
106
+ sb.append(index).append(" : " ).append(refs.nameRefToString( NameRef (idx) )).append(" \n " )
109
107
}
110
108
111
109
def showContents (): String = {
112
110
val sb : StringBuilder = new StringBuilder
111
+ given NameRefs = unpickle0(new SourceFileUnpickler )(using NameRefs .empty).getOrElse(NameRefs .empty)
113
112
printHeader(sb)
114
113
printNames(sb)
115
- unpickle (new TreeSectionUnpickler (sb))
116
- unpickle (new PositionSectionUnpickler (sb))
117
- unpickle (new CommentSectionUnpickler (sb))
118
- unpickle (new AttributesSectionUnpickler (sb))
114
+ unpickle0 (new TreeSectionUnpickler (sb))
115
+ unpickle0 (new PositionSectionUnpickler (sb))
116
+ unpickle0 (new CommentSectionUnpickler (sb))
117
+ unpickle0 (new AttributesSectionUnpickler (sb))
119
118
sb.result
120
119
}
121
120
122
- class TreeSectionUnpickler (sb : StringBuilder ) extends SectionUnpickler [Unit ](ASTsSection ) {
121
+ def unpickle0 [R ](sec : PrinterSectionUnpickler [R ])(using NameRefs ): Option [R ] =
122
+ unpickle(new SectionUnpickler [R ](sec.name) {
123
+ def unpickle (reader : TastyReader , nameAtRef : NameTable ): R =
124
+ sec.unpickle0(reader.subReader(reader.startAddr, reader.endAddr)) // fork so we can visit multiple times
125
+ })
126
+
127
+ class TreeSectionUnpickler (sb : StringBuilder ) extends PrinterSectionUnpickler [Unit ](ASTsSection ) {
123
128
import dotty .tools .tasty .TastyFormat .*
124
- def unpickle (reader : TastyReader , tastyName : NameTable ): Unit = {
129
+ def unpickle0 (reader : TastyReader )( using refs : NameRefs ): Unit = {
125
130
import reader .*
126
131
var indent = 0
127
132
def newLine () = {
@@ -131,7 +136,7 @@ class TastyPrinter(bytes: Array[Byte], val testPickler: Boolean) {
131
136
def printNat () = sb.append(treeStr(" " + readNat()))
132
137
def printName () = {
133
138
val idx = readNat()
134
- sb.append(nameStr(" " + idx + " [" + nameRefToString(NameRef (idx)) + " ]" ))
139
+ sb.append(nameStr(" " + idx + " [" + refs. nameRefToString(NameRef (idx)) + " ]" ))
135
140
}
136
141
def printTree (): Unit = {
137
142
newLine()
@@ -190,8 +195,8 @@ class TastyPrinter(bytes: Array[Byte], val testPickler: Boolean) {
190
195
}
191
196
}
192
197
193
- class PositionSectionUnpickler (sb : StringBuilder ) extends SectionUnpickler [Unit ](PositionsSection ) {
194
- def unpickle (reader : TastyReader , tastyName : NameTable ): Unit = {
198
+ class PositionSectionUnpickler (sb : StringBuilder ) extends PrinterSectionUnpickler [Unit ](PositionsSection ) {
199
+ def unpickle0 (reader : TastyReader )( using tastyName : NameRefs ): Unit = {
195
200
import reader .*
196
201
val posUnpickler = new PositionUnpickler (reader, tastyName)
197
202
sb.append(s " \n\n Positions ( ${reader.endAddr.index - reader.startAddr.index} bytes, starting from $base): \n " )
@@ -222,8 +227,8 @@ class TastyPrinter(bytes: Array[Byte], val testPickler: Boolean) {
222
227
}
223
228
}
224
229
225
- class CommentSectionUnpickler (sb : StringBuilder ) extends SectionUnpickler [Unit ](CommentsSection ) {
226
- def unpickle (reader : TastyReader , tastyName : NameTable ): Unit = {
230
+ class CommentSectionUnpickler (sb : StringBuilder ) extends PrinterSectionUnpickler [Unit ](CommentsSection ) {
231
+ def unpickle0 (reader : TastyReader )( using NameRefs ): Unit = {
227
232
import reader .*
228
233
val comments = new CommentUnpickler (reader).comments
229
234
if ! comments.isEmpty then
@@ -236,9 +241,9 @@ class TastyPrinter(bytes: Array[Byte], val testPickler: Boolean) {
236
241
}
237
242
}
238
243
239
- class AttributesSectionUnpickler (sb : StringBuilder ) extends SectionUnpickler [Unit ](AttributesSection ) {
244
+ class AttributesSectionUnpickler (sb : StringBuilder ) extends PrinterSectionUnpickler [Unit ](AttributesSection ) {
240
245
import dotty .tools .tasty .TastyFormat .*
241
- def unpickle (reader : TastyReader , tastyName : NameTable ): Unit = {
246
+ def unpickle0 (reader : TastyReader )( using nameAtRef : NameRefs ): Unit = {
242
247
import reader .*
243
248
sb.append(s " \n\n Attributes ( ${reader.endAddr.index - reader.startAddr.index} bytes, starting from $base): \n " )
244
249
while ! isAtEnd do
@@ -256,6 +261,39 @@ class TastyPrinter(bytes: Array[Byte], val testPickler: Boolean) {
256
261
}
257
262
}
258
263
264
+ class NameRefs (sourceFileRefs : Set [NameRef ]) extends (NameRef => TermName ):
265
+ private val isSourceFile = sourceFileRefs.map(_.index).to(BitSet )
266
+
267
+ def nameRefToString (ref : NameRef ): String = this (ref).debugString
268
+
269
+ def apply (ref : NameRef ): TermName =
270
+ if isSourceFile(ref.index) then NameRefs .elidedSourceFile
271
+ else nameAtRef(ref)
272
+
273
+ object NameRefs :
274
+ import dotty .tools .dotc .core .Names .termName
275
+
276
+ private val elidedSourceFile = termName(" <elided source file name>" )
277
+ val empty = NameRefs (Set .empty)
278
+
279
+
280
+ class SourceFileUnpickler extends PrinterSectionUnpickler [NameRefs ](PositionsSection ) {
281
+ def unpickle0 (reader : TastyReader )(using nameAtRef : NameRefs ): NameRefs = {
282
+ if ! testPickler then return NameRefs .empty
283
+ val buf = Set .newBuilder[NameRef ]
284
+ val posUnpickler = new PositionUnpickler (reader, nameAtRef)
285
+ val sources = posUnpickler.sourceNameRefs
286
+ for ((_, nameRef) <- sources.iterator) {
287
+ buf += nameRef
288
+ }
289
+ NameRefs (buf.result)
290
+ }
291
+ }
292
+
293
+ abstract class PrinterSectionUnpickler [T ](val name : String ) {
294
+ def unpickle0 (reader : TastyReader )(using refs : NameRefs ): T
295
+ }
296
+
259
297
protected def nameStr (str : String ): String = str
260
298
protected def treeStr (str : String ): String = str
261
299
protected def lengthStr (str : String ): String = str
0 commit comments