aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-08-13 11:25:29 +0200
committerMartin Odersky <odersky@gmail.com>2014-08-13 11:25:29 +0200
commitece76567bc230bdbcea21f57a4e6ebf0d8d6434d (patch)
tree4eaec4c175e2424fd152c05d8faa176f9a5d831c /src
parentdeaa0d8bdcd5592e124acfbca1a1414365b667d7 (diff)
downloaddotty-ece76567bc230bdbcea21f57a4e6ebf0d8d6434d.tar.gz
dotty-ece76567bc230bdbcea21f57a4e6ebf0d8d6434d.tar.bz2
dotty-ece76567bc230bdbcea21f57a4e6ebf0d8d6434d.zip
Erasure should copy denotations only if they are changed.
Diffstat (limited to 'src')
-rw-r--r--src/dotty/tools/dotc/transform/Erasure.scala17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/dotty/tools/dotc/transform/Erasure.scala b/src/dotty/tools/dotc/transform/Erasure.scala
index c571d836d..06e3506df 100644
--- a/src/dotty/tools/dotc/transform/Erasure.scala
+++ b/src/dotty/tools/dotc/transform/Erasure.scala
@@ -25,7 +25,7 @@ import dotty.tools.dotc.core.Flags
import ValueClasses._
import TypeUtils._
-class Erasure extends Phase with DenotTransformer {
+class Erasure extends Phase with DenotTransformer { thisTransformer =>
override def name: String = "erasure"
@@ -46,10 +46,15 @@ class Erasure extends Phase with DenotTransformer {
)
}
else {
- val owner = ref.owner
- ref.copySymDenotation(
- owner = if (owner eq defn.AnyClass) defn.ObjectClass else owner,
- info = transformInfo(ref.symbol, ref.info))
+ val oldOwner = ref.owner
+ val newOwner = if (oldOwner eq defn.AnyClass) defn.ObjectClass else oldOwner
+ val oldInfo = ref.info
+ val newInfo = transformInfo(ref.symbol, oldInfo)
+ if ((oldOwner eq newOwner) && (oldInfo eq newInfo)) ref
+ else {
+ assert(!ref.is(Flags.PackageClass), s"trans $ref @ ${ctx.phase} oldOwner = $oldOwner, newOwner = $newOwner, oldInfo = $oldInfo, newInfo = $newInfo ${oldOwner eq newOwner} ${oldInfo eq newInfo}")
+ ref.copySymDenotation(owner = newOwner, info = newInfo)
+ }
}
case ref =>
ref.derivedSingleDenotation(ref.symbol, erasure(ref.info))
@@ -359,7 +364,7 @@ object Erasure {
}
val bridge = ctx.newSymbol(newDef.symbol.owner,
parentSym.name, parentSym.flags | Flags.Bridge, parentSym.info, coord = newDef.symbol.owner.coord).asTerm
- bridge.entered // this should be safe, as we're executing in context of next phase
+ bridge.enteredAfter(ctx.phase.prev.asInstanceOf[DenotTransformer]) // this should be safe, as we're executing in context of next phase
ctx.debuglog(s"generating bridge from ${newDef.symbol} to $bridge")
val sel: Tree = This(newDef.symbol.owner.asClass).select(newDef.symbol.termRef)