Skip to content

Commit 94a228f

Browse files
committed
Merge pull request scala#4911 from lrytz/showRawFootnotes
SD-70 Don't share footnotes across multiple calls to universe.showRaw
2 parents ed74a84 + a3e62cc commit 94a228f

File tree

5 files changed

+36
-38
lines changed

5 files changed

+36
-38
lines changed

src/reflect/scala/reflect/api/Printers.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ trait Printers { self: Universe =>
232232
* @group Printers
233233
*/
234234
def showRaw(any: Any, printTypes: BooleanFlag = None, printIds: BooleanFlag = None, printOwners: BooleanFlag = None, printKinds: BooleanFlag = None, printMirrors: BooleanFlag = None, printPositions: BooleanFlag = None): String =
235-
render(any, newRawTreePrinter(_), printTypes, printIds, printOwners, printKinds, printMirrors, printPositions)
235+
render(any, newRawTreePrinter, printTypes, printIds, printOwners, printKinds, printMirrors, printPositions)
236236

237237
/** Hook to define what `showRaw(...)` means.
238238
* @group Printers

src/reflect/scala/reflect/internal/Printers.scala

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,11 +1134,12 @@ trait Printers extends api.Printers { self: SymbolTable =>
11341134
def newRawTreePrinter(writer: PrintWriter): RawTreePrinter = new RawTreePrinter(writer)
11351135

11361136
// provides footnotes for types and mirrors
1137-
import scala.collection.mutable.{Map, WeakHashMap, SortedSet}
1138-
private val footnoteIndex = new FootnoteIndex
1139-
private class FootnoteIndex {
1137+
private class Footnotes {
1138+
import scala.collection.mutable.{Map, WeakHashMap, SortedSet}
1139+
11401140
private val index = Map[Class[_], WeakHashMap[Any, Int]]()
11411141
private def classIndex[T: ClassTag] = index.getOrElseUpdate(classTag[T].runtimeClass, WeakHashMap[Any, Int]())
1142+
11421143
private val counters = Map[Class[_], Int]()
11431144
private def nextCounter[T: ClassTag] = {
11441145
val clazz = classTag[T].runtimeClass
@@ -1147,29 +1148,26 @@ trait Printers extends api.Printers { self: SymbolTable =>
11471148
counters(clazz)
11481149
}
11491150

1150-
def mkFootnotes() = new Footnotes
1151-
class Footnotes {
1152-
private val footnotes = Map[Class[_], SortedSet[Int]]()
1153-
private def classFootnotes[T: ClassTag] = footnotes.getOrElseUpdate(classTag[T].runtimeClass, SortedSet[Int]())
1151+
private val footnotes = Map[Class[_], SortedSet[Int]]()
1152+
private def classFootnotes[T: ClassTag] = footnotes.getOrElseUpdate(classTag[T].runtimeClass, SortedSet[Int]())
11541153

1155-
def put[T: ClassTag](any: T): Int = {
1156-
val index = classIndex[T].getOrElseUpdate(any, nextCounter[T])
1157-
classFootnotes[T] += index
1158-
index
1159-
}
1154+
def put[T: ClassTag](any: T): Int = {
1155+
val index = classIndex[T].getOrElseUpdate(any, nextCounter[T])
1156+
classFootnotes[T] += index
1157+
index
1158+
}
11601159

1161-
def get[T: ClassTag]: List[(Int, Any)] =
1162-
classFootnotes[T].toList map (fi => (fi, classIndex[T].find{ case (any, ii) => ii == fi }.get._1))
1163-
1164-
def print[T: ClassTag](printer: Printers.super.TreePrinter): Unit = {
1165-
val footnotes = get[T]
1166-
if (footnotes.nonEmpty) {
1167-
printer.print(EOL)
1168-
footnotes.zipWithIndex foreach {
1169-
case ((fi, any), ii) =>
1170-
printer.print("[", fi, "] ", any)
1171-
if (ii < footnotes.length - 1) printer.print(EOL)
1172-
}
1160+
def get[T: ClassTag]: List[(Int, Any)] =
1161+
classFootnotes[T].toList map (fi => (fi, classIndex[T].find{ case (any, ii) => ii == fi }.get._1))
1162+
1163+
def print[T: ClassTag](printer: Printers.super.TreePrinter): Unit = {
1164+
val footnotes = get[T]
1165+
if (footnotes.nonEmpty) {
1166+
printer.print(EOL)
1167+
footnotes.zipWithIndex foreach {
1168+
case ((fi, any), ii) =>
1169+
printer.print("[", fi, "] ", any)
1170+
if (ii < footnotes.length - 1) printer.print(EOL)
11731171
}
11741172
}
11751173
}
@@ -1180,7 +1178,7 @@ trait Printers extends api.Printers { self: SymbolTable =>
11801178
private var depth = 0
11811179
private var printTypesInFootnotes = true
11821180
private var printingFootnotes = false
1183-
private val footnotes = footnoteIndex.mkFootnotes()
1181+
private val footnotes = new Footnotes()
11841182

11851183
def print(args: Any*): Unit = {
11861184
// don't print type footnotes if the argument is a mere type

test/files/run/showraw_tree_types_ids.check

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ Apply[1](Select[2](New[1](TypeTree[1]().setOriginal(AppliedTypeTree(Ident[3](sca
44
[3] TypeRef(ThisType(scala.collection.immutable#<id>), scala.collection.immutable.HashMap#<id>, List())
55
[4] TypeRef(SingleType(ThisType(scala#<id>), scala.Predef#<id>), TypeName("String")#<id>, List())
66
[5] SingleType(ThisType(scala#<id>), scala.Predef#<id>)
7-
Apply[6](Select[7](New[6](TypeTree[6]().setOriginal(AppliedTypeTree(Ident[8](scala.collection.mutable.HashMap#<id>), List(TypeTree[4]().setOriginal(Select[4](Ident[5](scala.Predef#<id>), TypeName("String")#<id>)), TypeTree[4]().setOriginal(Select[4](Ident[5](scala.Predef#<id>), TypeName("String")#<id>)))))), termNames.CONSTRUCTOR#<id>), List())
7+
Apply[1](Select[2](New[1](TypeTree[1]().setOriginal(AppliedTypeTree(Ident[3](scala.collection.mutable.HashMap#<id>), List(TypeTree[4]().setOriginal(Select[4](Ident[5](scala.Predef#<id>), TypeName("String")#<id>)), TypeTree[4]().setOriginal(Select[4](Ident[5](scala.Predef#<id>), TypeName("String")#<id>)))))), termNames.CONSTRUCTOR#<id>), List())
8+
[1] TypeRef(ThisType(scala.collection.mutable#<id>), scala.collection.mutable.HashMap#<id>, List(TypeRef(SingleType(ThisType(scala#<id>), scala.Predef#<id>), TypeName("String")#<id>, List()), TypeRef(SingleType(ThisType(scala#<id>), scala.Predef#<id>), TypeName("String")#<id>, List())))
9+
[2] MethodType(List(), TypeRef(ThisType(scala.collection.mutable#<id>), scala.collection.mutable.HashMap#<id>, List(TypeRef(SingleType(ThisType(scala#<id>), scala.Predef#<id>), TypeName("String")#<id>, List()), TypeRef(SingleType(ThisType(scala#<id>), scala.Predef#<id>), TypeName("String")#<id>, List()))))
10+
[3] TypeRef(ThisType(scala.collection.mutable#<id>), scala.collection.mutable.HashMap#<id>, List())
811
[4] TypeRef(SingleType(ThisType(scala#<id>), scala.Predef#<id>), TypeName("String")#<id>, List())
912
[5] SingleType(ThisType(scala#<id>), scala.Predef#<id>)
10-
[6] TypeRef(ThisType(scala.collection.mutable#<id>), scala.collection.mutable.HashMap#<id>, List(TypeRef(SingleType(ThisType(scala#<id>), scala.Predef#<id>), TypeName("String")#<id>, List()), TypeRef(SingleType(ThisType(scala#<id>), scala.Predef#<id>), TypeName("String")#<id>, List())))
11-
[7] MethodType(List(), TypeRef(ThisType(scala.collection.mutable#<id>), scala.collection.mutable.HashMap#<id>, List(TypeRef(SingleType(ThisType(scala#<id>), scala.Predef#<id>), TypeName("String")#<id>, List()), TypeRef(SingleType(ThisType(scala#<id>), scala.Predef#<id>), TypeName("String")#<id>, List()))))
12-
[8] TypeRef(ThisType(scala.collection.mutable#<id>), scala.collection.mutable.HashMap#<id>, List())

test/files/run/showraw_tree_types_typed.check

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ Apply[1](Select[2](New[1](TypeTree[1]().setOriginal(AppliedTypeTree(Ident[3](sca
44
[3] TypeRef(ThisType(scala.collection.immutable), scala.collection.immutable.HashMap, List())
55
[4] TypeRef(SingleType(ThisType(scala), scala.Predef), TypeName("String"), List())
66
[5] SingleType(ThisType(scala), scala.Predef)
7-
Apply[6](Select[7](New[6](TypeTree[6]().setOriginal(AppliedTypeTree(Ident[8](scala.collection.mutable.HashMap), List(TypeTree[4]().setOriginal(Select[4](Ident[5](scala.Predef), TypeName("String"))), TypeTree[4]().setOriginal(Select[4](Ident[5](scala.Predef), TypeName("String"))))))), termNames.CONSTRUCTOR), List())
7+
Apply[1](Select[2](New[1](TypeTree[1]().setOriginal(AppliedTypeTree(Ident[3](scala.collection.mutable.HashMap), List(TypeTree[4]().setOriginal(Select[4](Ident[5](scala.Predef), TypeName("String"))), TypeTree[4]().setOriginal(Select[4](Ident[5](scala.Predef), TypeName("String"))))))), termNames.CONSTRUCTOR), List())
8+
[1] TypeRef(ThisType(scala.collection.mutable), scala.collection.mutable.HashMap, List(TypeRef(SingleType(ThisType(scala), scala.Predef), TypeName("String"), List()), TypeRef(SingleType(ThisType(scala), scala.Predef), TypeName("String"), List())))
9+
[2] MethodType(List(), TypeRef(ThisType(scala.collection.mutable), scala.collection.mutable.HashMap, List(TypeRef(SingleType(ThisType(scala), scala.Predef), TypeName("String"), List()), TypeRef(SingleType(ThisType(scala), scala.Predef), TypeName("String"), List()))))
10+
[3] TypeRef(ThisType(scala.collection.mutable), scala.collection.mutable.HashMap, List())
811
[4] TypeRef(SingleType(ThisType(scala), scala.Predef), TypeName("String"), List())
912
[5] SingleType(ThisType(scala), scala.Predef)
10-
[6] TypeRef(ThisType(scala.collection.mutable), scala.collection.mutable.HashMap, List(TypeRef(SingleType(ThisType(scala), scala.Predef), TypeName("String"), List()), TypeRef(SingleType(ThisType(scala), scala.Predef), TypeName("String"), List())))
11-
[7] MethodType(List(), TypeRef(ThisType(scala.collection.mutable), scala.collection.mutable.HashMap, List(TypeRef(SingleType(ThisType(scala), scala.Predef), TypeName("String"), List()), TypeRef(SingleType(ThisType(scala), scala.Predef), TypeName("String"), List()))))
12-
[8] TypeRef(ThisType(scala.collection.mutable), scala.collection.mutable.HashMap, List())

test/files/run/showraw_tree_ultimate.check

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ Apply[1](Select[2](New[1](TypeTree[1]().setOriginal(AppliedTypeTree(Ident[3](sca
44
[3] TypeRef(ThisType(scala.collection.immutable#<id>#PKC), scala.collection.immutable.HashMap#<id>#CLS, List())
55
[4] TypeRef(SingleType(ThisType(scala#<id>#PKC), scala.Predef#<id>#MOD), TypeName("String")#<id>#TPE, List())
66
[5] SingleType(ThisType(scala#<id>#PKC), scala.Predef#<id>#MOD)
7-
Apply[6](Select[7](New[6](TypeTree[6]().setOriginal(AppliedTypeTree(Ident[8](scala.collection.mutable.HashMap#<id>#CLS), List(TypeTree[4]().setOriginal(Select[4](Ident[5](scala.Predef#<id>#MOD), TypeName("String")#<id>#TPE)), TypeTree[4]().setOriginal(Select[4](Ident[5](scala.Predef#<id>#MOD), TypeName("String")#<id>#TPE)))))), termNames.CONSTRUCTOR#<id>#CTOR), List())
7+
Apply[1](Select[2](New[1](TypeTree[1]().setOriginal(AppliedTypeTree(Ident[3](scala.collection.mutable.HashMap#<id>#CLS), List(TypeTree[4]().setOriginal(Select[4](Ident[5](scala.Predef#<id>#MOD), TypeName("String")#<id>#TPE)), TypeTree[4]().setOriginal(Select[4](Ident[5](scala.Predef#<id>#MOD), TypeName("String")#<id>#TPE)))))), termNames.CONSTRUCTOR#<id>#CTOR), List())
8+
[1] TypeRef(ThisType(scala.collection.mutable#<id>#PKC), scala.collection.mutable.HashMap#<id>#CLS, List(TypeRef(SingleType(ThisType(scala#<id>#PKC), scala.Predef#<id>#MOD), TypeName("String")#<id>#TPE, List()), TypeRef(SingleType(ThisType(scala#<id>#PKC), scala.Predef#<id>#MOD), TypeName("String")#<id>#TPE, List())))
9+
[2] MethodType(List(), TypeRef(ThisType(scala.collection.mutable#<id>#PKC), scala.collection.mutable.HashMap#<id>#CLS, List(TypeRef(SingleType(ThisType(scala#<id>#PKC), scala.Predef#<id>#MOD), TypeName("String")#<id>#TPE, List()), TypeRef(SingleType(ThisType(scala#<id>#PKC), scala.Predef#<id>#MOD), TypeName("String")#<id>#TPE, List()))))
10+
[3] TypeRef(ThisType(scala.collection.mutable#<id>#PKC), scala.collection.mutable.HashMap#<id>#CLS, List())
811
[4] TypeRef(SingleType(ThisType(scala#<id>#PKC), scala.Predef#<id>#MOD), TypeName("String")#<id>#TPE, List())
912
[5] SingleType(ThisType(scala#<id>#PKC), scala.Predef#<id>#MOD)
10-
[6] TypeRef(ThisType(scala.collection.mutable#<id>#PKC), scala.collection.mutable.HashMap#<id>#CLS, List(TypeRef(SingleType(ThisType(scala#<id>#PKC), scala.Predef#<id>#MOD), TypeName("String")#<id>#TPE, List()), TypeRef(SingleType(ThisType(scala#<id>#PKC), scala.Predef#<id>#MOD), TypeName("String")#<id>#TPE, List())))
11-
[7] MethodType(List(), TypeRef(ThisType(scala.collection.mutable#<id>#PKC), scala.collection.mutable.HashMap#<id>#CLS, List(TypeRef(SingleType(ThisType(scala#<id>#PKC), scala.Predef#<id>#MOD), TypeName("String")#<id>#TPE, List()), TypeRef(SingleType(ThisType(scala#<id>#PKC), scala.Predef#<id>#MOD), TypeName("String")#<id>#TPE, List()))))
12-
[8] TypeRef(ThisType(scala.collection.mutable#<id>#PKC), scala.collection.mutable.HashMap#<id>#CLS, List())

0 commit comments

Comments
 (0)