Skip to content

Commit 090b647

Browse files
committed
elide source file names
1 parent 8920162 commit 090b647

File tree

2 files changed

+60
-22
lines changed

2 files changed

+60
-22
lines changed

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

+57-19
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ import dotty.tools.tasty.TastyFormat.{ASTsSection, PositionsSection, CommentsSec
1313
import java.nio.file.{Files, Paths}
1414
import dotty.tools.io.{JarArchive, Path}
1515
import dotty.tools.tasty.TastyFormat.header
16+
import scala.collection.immutable.BitSet
1617

1718
import scala.compiletime.uninitialized
1819
import dotty.tools.tasty.TastyBuffer.Addr
20+
import dotty.tools.dotc.core.Names.TermName
1921

2022
object 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\nPositions (${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\nAttributes (${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

tests/pos/i19806/J.tastycheck

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ Names (217 bytes, starting from 80):
2727
20: T
2828
21: Nothing
2929
22: Positions
30-
23: tests/pos/i19806/J_SCALA_ONLY.java
30+
23: <elided source file name>
3131
24: Comments
3232
25: Attributes
3333

@@ -152,10 +152,10 @@ Positions (145 bytes, starting from 448):
152152
140: 46 .. 46
153153

154154
source paths:
155-
0: 23 [tests/pos/i19806/J_SCALA_ONLY.java]
155+
0: 23 [<elided source file name>]
156156

157157

158158
Attributes (4 bytes, starting from 597):
159159
JAVAattr
160160
OUTLINEattr
161-
SOURCEFILEattr 23 [tests/pos/i19806/J_SCALA_ONLY.java]
161+
SOURCEFILEattr 23 [<elided source file name>]

0 commit comments

Comments
 (0)