@@ -13,9 +13,11 @@ import dotty.tools.tasty.TastyFormat.{ASTsSection, PositionsSection, CommentsSec
1313import java .nio .file .{Files , Paths }
1414import dotty .tools .io .{JarArchive , Path }
1515import dotty .tools .tasty .TastyFormat .header
16+ import scala .collection .immutable .BitSet
1617
1718import scala .compiletime .uninitialized
1819import dotty .tools .tasty .TastyBuffer .Addr
20+ import dotty .tools .dotc .core .Names .TermName
1921
2022object TastyPrinter :
2123
@@ -82,10 +84,6 @@ class TastyPrinter(bytes: Array[Byte], val testPickler: Boolean) {
8284 private val unpickler : TastyPrinterUnpickler = new TastyPrinterUnpickler
8385 import unpickler .{nameAtRef , unpickle }
8486
85- private def nameToString (name : Name ): String = name.debugString
86-
87- private def nameRefToString (ref : NameRef ): String = nameToString(nameAtRef(ref))
88-
8987 private def printHeader (sb : StringBuilder ): Unit =
9088 val header = unpickler.header
9189 sb.append(" Header:\n " )
@@ -101,27 +99,34 @@ class TastyPrinter(bytes: Array[Byte], val testPickler: Boolean) {
10199 end if
102100 sb.append(" \n " )
103101
104- private def printNames (sb : StringBuilder ): Unit =
102+ private def printNames (sb : StringBuilder )( using refs : NameRefs ) : Unit =
105103 sb.append(s " Names ( ${unpickler.namesEnd.index - unpickler.namesStart.index} bytes, starting from ${unpickler.namesStart.index}): \n " )
106104 for ((name, idx) <- nameAtRef.contents.zipWithIndex) {
107105 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 " )
109107 }
110108
111109 def showContents (): String = {
112110 val sb : StringBuilder = new StringBuilder
111+ given NameRefs = unpickle0(new SourceFileUnpickler )(using NameRefs .empty).getOrElse(NameRefs .empty)
113112 printHeader(sb)
114113 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))
119118 sb.result
120119 }
121120
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 ) {
123128 import dotty .tools .tasty .TastyFormat .*
124- def unpickle (reader : TastyReader , tastyName : NameTable ): Unit = {
129+ def unpickle0 (reader : TastyReader )( using refs : NameRefs ): Unit = {
125130 import reader .*
126131 var indent = 0
127132 def newLine () = {
@@ -131,7 +136,7 @@ class TastyPrinter(bytes: Array[Byte], val testPickler: Boolean) {
131136 def printNat () = sb.append(treeStr(" " + readNat()))
132137 def printName () = {
133138 val idx = readNat()
134- sb.append(nameStr(" " + idx + " [" + nameRefToString(NameRef (idx)) + " ]" ))
139+ sb.append(nameStr(" " + idx + " [" + refs. nameRefToString(NameRef (idx)) + " ]" ))
135140 }
136141 def printTree (): Unit = {
137142 newLine()
@@ -190,8 +195,8 @@ class TastyPrinter(bytes: Array[Byte], val testPickler: Boolean) {
190195 }
191196 }
192197
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 = {
195200 import reader .*
196201 val posUnpickler = new PositionUnpickler (reader, tastyName)
197202 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) {
222227 }
223228 }
224229
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 = {
227232 import reader .*
228233 val comments = new CommentUnpickler (reader).comments
229234 if ! comments.isEmpty then
@@ -236,9 +241,9 @@ class TastyPrinter(bytes: Array[Byte], val testPickler: Boolean) {
236241 }
237242 }
238243
239- class AttributesSectionUnpickler (sb : StringBuilder ) extends SectionUnpickler [Unit ](AttributesSection ) {
244+ class AttributesSectionUnpickler (sb : StringBuilder ) extends PrinterSectionUnpickler [Unit ](AttributesSection ) {
240245 import dotty .tools .tasty .TastyFormat .*
241- def unpickle (reader : TastyReader , tastyName : NameTable ): Unit = {
246+ def unpickle0 (reader : TastyReader )( using nameAtRef : NameRefs ): Unit = {
242247 import reader .*
243248 sb.append(s " \n\n Attributes ( ${reader.endAddr.index - reader.startAddr.index} bytes, starting from $base): \n " )
244249 while ! isAtEnd do
@@ -256,6 +261,39 @@ class TastyPrinter(bytes: Array[Byte], val testPickler: Boolean) {
256261 }
257262 }
258263
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+
259297 protected def nameStr (str : String ): String = str
260298 protected def treeStr (str : String ): String = str
261299 protected def lengthStr (str : String ): String = str
0 commit comments