@@ -1576,6 +1576,7 @@ trait Trees extends api.Trees {
15761576 */
15771577 class TreeSymSubstituter (from : List [Symbol ], to : List [Symbol ]) extends Transformer {
15781578 val symSubst = new SubstSymMap (from, to)
1579+ private var mutatedSymbols : List [Symbol ] = Nil
15791580 override def transform (tree : Tree ): Tree = {
15801581 def subst (from : List [Symbol ], to : List [Symbol ]) {
15811582 if (! from.isEmpty)
@@ -1594,6 +1595,7 @@ trait Trees extends api.Trees {
15941595 |TreeSymSubstituter: updated info of symbol ${tree.symbol}
15951596 | Old: ${showRaw(tree.symbol.info, printTypes = true , printIds = true )}
15961597 | New: ${showRaw(newInfo, printTypes = true , printIds = true )}""" )
1598+ mutatedSymbols ::= tree.symbol
15971599 tree.symbol updateInfo newInfo
15981600 }
15991601 case _ =>
@@ -1613,7 +1615,23 @@ trait Trees extends api.Trees {
16131615 } else
16141616 super .transform(tree)
16151617 }
1616- def apply [T <: Tree ](tree : T ): T = transform(tree).asInstanceOf [T ]
1618+ def apply [T <: Tree ](tree : T ): T = {
1619+ val tree1 = transform(tree)
1620+ invalidateSingleTypeCaches(tree1)
1621+ tree1.asInstanceOf [T ]
1622+ }
1623+ private def invalidateSingleTypeCaches (tree : Tree ): Unit = {
1624+ if (mutatedSymbols.nonEmpty)
1625+ for (t <- tree)
1626+ for (tp <- t.tpe) {
1627+ tp match {
1628+ case s : SingleType if mutatedSymbols contains s.sym =>
1629+ s.underlyingPeriod = NoPeriod
1630+ s.underlyingCache = NoType
1631+ case _ =>
1632+ }
1633+ }
1634+ }
16171635 override def toString () = " TreeSymSubstituter/" + substituterString(" Symbol" , " Symbol" , from, to)
16181636 }
16191637
0 commit comments