From 324f1d7f17aaf2decaf845417d26c21dd6ebcc60 Mon Sep 17 00:00:00 2001 From: Nicolas Stucki Date: Thu, 30 Nov 2023 10:28:42 +0100 Subject: [PATCH] Fix TASTy source position printer Now it properly shows that the sources form the position section are references in the name table. This includes the coloring of the indices and referenced names. ```diff source paths: - 0: t/Test.scala + 0: 21 [t/Test.scala] ``` --- .../tools/dotc/core/tasty/PositionUnpickler.scala | 13 ++++++------- .../dotty/tools/dotc/core/tasty/TastyPrinter.scala | 6 +++--- project/scripts/cmdTests | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/core/tasty/PositionUnpickler.scala b/compiler/src/dotty/tools/dotc/core/tasty/PositionUnpickler.scala index b7f88155e3c8..975264a288dd 100644 --- a/compiler/src/dotty/tools/dotc/core/tasty/PositionUnpickler.scala +++ b/compiler/src/dotty/tools/dotc/core/tasty/PositionUnpickler.scala @@ -18,7 +18,7 @@ class PositionUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName) { private var myLineSizes: Array[Int] = uninitialized private var mySpans: util.HashMap[Addr, Span] = uninitialized - private var mySourcePaths: util.HashMap[Addr, String] = uninitialized + private var mySourceNameRefs: util.HashMap[Addr, NameRef] = uninitialized private var isDefined = false def ensureDefined(): Unit = { @@ -31,15 +31,14 @@ class PositionUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName) { i += 1 mySpans = util.HashMap[Addr, Span]() - mySourcePaths = util.HashMap[Addr, String]() + mySourceNameRefs = util.HashMap[Addr, NameRef]() var curIndex = 0 var curStart = 0 var curEnd = 0 while (!isAtEnd) { val header = readInt() if (header == SOURCE) { - val path = nameAtRef(readNameRef()).toString - mySourcePaths(Addr(curIndex)) = path + mySourceNameRefs(Addr(curIndex)) = readNameRef() } else { val addrDelta = header >> 3 @@ -64,9 +63,9 @@ class PositionUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName) { mySpans } - private[tasty] def sourcePaths: util.ReadOnlyMap[Addr, String] = { + private[tasty] def sourceNameRefs: util.ReadOnlyMap[Addr, NameRef] = { ensureDefined() - mySourcePaths + mySourceNameRefs } private[tasty] def lineSizes: Array[Int] = { @@ -75,5 +74,5 @@ class PositionUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName) { } def spanAt(addr: Addr): Span = spans.getOrElse(addr, NoSpan) - def sourcePathAt(addr: Addr): String = sourcePaths.getOrElse(addr, "") + def sourcePathAt(addr: Addr): String = sourceNameRefs.get(addr).fold("")(nameAtRef(_).toString) } diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TastyPrinter.scala b/compiler/src/dotty/tools/dotc/core/tasty/TastyPrinter.scala index 3dd80b937919..8950f4509d3e 100644 --- a/compiler/src/dotty/tools/dotc/core/tasty/TastyPrinter.scala +++ b/compiler/src/dotty/tools/dotc/core/tasty/TastyPrinter.scala @@ -218,12 +218,12 @@ class TastyPrinter(bytes: Array[Byte]) { sb.append(s": ${offsetToInt(pos.start)} .. ${pos.end}\n") } - val sources = posUnpickler.sourcePaths + val sources = posUnpickler.sourceNameRefs sb.append(s"\n source paths:\n") val sortedPath = sources.toSeq.sortBy(_._1.index) - for ((addr, path) <- sortedPath) { + for ((addr, nameRef) <- sortedPath) { sb.append(treeStr("%6d: ".format(addr.index))) - sb.append(path) + sb.append(nameStr(s"${nameRef.index} [${tastyName(nameRef)}]")) sb.append("\n") } diff --git a/project/scripts/cmdTests b/project/scripts/cmdTests index 3405c06b056f..2fb04e7d1b69 100755 --- a/project/scripts/cmdTests +++ b/project/scripts/cmdTests @@ -27,7 +27,7 @@ echo "testing sbt scalac -print-tasty" clear_out "$OUT" "$SBT" ";scalac $SOURCE -d $OUT ;scalac -print-tasty -color:never $TASTY" > "$tmp" grep -qe "0: ASTs" "$tmp" -grep -qe "0: tests/pos/HelloWorld.scala" "$tmp" +grep -qe "0: 41 [tests/pos/HelloWorld.scala]" "$tmp" echo "testing that paths SourceFile annotations are relativized" clear_out "$OUT"