Skip to content

Commit 2d19588

Browse files
authored
Merge pull request #5593 from dotty-staging/rewrite-termrefset
Rewrite `typer.TermRefSet`
2 parents 6024b0c + 58b0eb9 commit 2d19588

File tree

1 file changed

+22
-16
lines changed

1 file changed

+22
-16
lines changed

compiler/src/dotty/tools/dotc/typer/Implicits.scala

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,8 @@ trait ImplicitRunInfo { self: Run =>
441441

442442
private val implicitScopeCache = mutable.AnyRefMap[Type, OfTypeImplicits]()
443443

444+
private val EmptyTermRefSet = new TermRefSet()(NoContext)
445+
444446
/** The implicit scope of a type `tp`
445447
* @param liftingCtx A context to be used when computing the class symbols of
446448
* a type. Types may contain type variables with their instances
@@ -1533,28 +1535,32 @@ final class SearchRoot extends SearchHistory {
15331535
}
15341536

15351537
/** A set of term references where equality is =:= */
1536-
class TermRefSet(implicit ctx: Context) extends mutable.Traversable[TermRef] {
1537-
import collection.JavaConverters._
1538-
private val elems = (new java.util.LinkedHashMap[TermSymbol, List[Type]]).asScala
1538+
final class TermRefSet(implicit ctx: Context) {
1539+
private[this] val elems = new java.util.LinkedHashMap[TermSymbol, List[Type]]
15391540

15401541
def += (ref: TermRef): Unit = {
15411542
val pre = ref.prefix
15421543
val sym = ref.symbol.asTerm
1543-
elems get sym match {
1544-
case Some(prefixes) =>
1545-
if (!(prefixes exists (_ =:= pre))) elems(sym) = pre :: prefixes
1546-
case None =>
1547-
elems(sym) = pre :: Nil
1544+
elems.get(sym) match {
1545+
case null =>
1546+
elems.put(sym, pre :: Nil)
1547+
case prefixes =>
1548+
if (!prefixes.exists(_ =:= pre))
1549+
elems.put(sym, pre :: prefixes)
15481550
}
15491551
}
15501552

1551-
def ++= (refs: TraversableOnce[TermRef]): Unit =
1552-
refs foreach +=
1553+
def ++= (that: TermRefSet): Unit =
1554+
that.foreach(+=)
15531555

1554-
override def foreach[U](f: TermRef => U): Unit =
1555-
for (sym <- elems.keysIterator)
1556-
for (pre <- elems(sym))
1557-
f(TermRef(pre, sym))
1558-
}
1556+
def foreach[U](f: TermRef => U): Unit =
1557+
elems.forEach((sym: TermSymbol, prefixes: List[Type]) =>
1558+
prefixes.foreach(pre => f(TermRef(pre, sym))))
15591559

1560-
@sharable object EmptyTermRefSet extends TermRefSet()(NoContext)
1560+
// used only for debugging
1561+
def toList: List[TermRef] = {
1562+
val buffer = new mutable.ListBuffer[TermRef]
1563+
foreach(tr => buffer += tr)
1564+
buffer.toList
1565+
}
1566+
}

0 commit comments

Comments
 (0)