diff options
author | Martin Odersky <odersky@gmail.com> | 2009-02-05 19:24:56 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2009-02-05 19:24:56 +0000 |
commit | 48355ee28a930f19000901d761f24ca44b324c1f (patch) | |
tree | d16dd3125cdcdb955af61c1289f5e92af07a147c /src/compiler/scala/tools/nsc/transform/Erasure.scala | |
parent | a81199163d973c9e643d28cc00bb3adb7ea26a10 (diff) | |
download | scala-48355ee28a930f19000901d761f24ca44b324c1f.tar.gz scala-48355ee28a930f19000901d761f24ca44b324c1f.tar.bz2 scala-48355ee28a930f19000901d761f24ca44b324c1f.zip |
Fixed duplicate symbols problem in new collecti...
Fixed duplicate symbols problem in new collection libraries by adding
a special case to Erasure. Fixed override problems in new collection
libraries by refining OverriddenPairs. Fixed repeated load by applying
patch to Settings. Improved error message iin RefChecks.
Diffstat (limited to 'src/compiler/scala/tools/nsc/transform/Erasure.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/Erasure.scala | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala index d9aa3e89aa..15cad39db3 100644 --- a/src/compiler/scala/tools/nsc/transform/Erasure.scala +++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala @@ -8,6 +8,7 @@ package scala.tools.nsc.transform import scala.tools.nsc.symtab.classfile.ClassfileConstants._ import scala.collection.mutable.{HashMap,ListBuffer} +import scala.collection.immutable.Set import scala.tools.nsc.util.Position import symtab._ import Flags._ @@ -816,8 +817,9 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer { * with the erased type of <code>m1</code> in the template. * </p> */ - private def bridgeDefs(owner: Symbol): List[Tree] = { - //Console.println("computing bridges for " + owner)//DEBUG + private def bridgeDefs(owner: Symbol): (List[Tree], Set[Symbol]) = { + var toBeRemoved: Set[Symbol] = Set() + //println("computing bridges for " + owner)//DEBUG assert(phase == currentRun.erasurePhase) val site = owner.thisType val bridgesScope = newScope @@ -834,7 +836,7 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer { val member = opc.overriding val other = opc.overridden //Console.println("bridge? " + member + ":" + member.tpe + member.locationString + " to " + other + ":" + other.tpe + other.locationString);//DEBUG - if (!atPhase(currentRun.explicitOuterPhase)(member.isDeferred)) { + if (atPhase(currentRun.explicitOuterPhase)(!member.isDeferred)) { val otpe = erasure(other.tpe); val bridgeNeeded = atPhase(phase.next) ( !(other.tpe =:= member.tpe) && @@ -853,6 +855,11 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer { .setInfo(otpe); bridgeTarget(bridge) = member atPhase(phase.next) { owner.info.decls.enter(bridge) } + if (other.owner == owner) { + //println("bridge to same: "+other+other.locationString)//DEBUG + atPhase(phase.next) { owner.info.decls.unlink(other) } + toBeRemoved += other + } bridgesScope enter bridge bridges = atPhase(phase.next) { @@ -874,7 +881,7 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer { } opc.next } - bridges + (bridges, toBeRemoved) } /* for (val bc <- site.baseClasses.tail; val other <- bc.info.decls.toList) { @@ -893,8 +900,9 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer { def addBridges(stats: List[Tree], base: Symbol): List[Tree] = if (base.isTrait) stats else { - val bridges = bridgeDefs(base) - if (bridges.isEmpty) stats else stats ::: bridges + val (bridges, toBeRemoved) = bridgeDefs(base) + if (bridges.isEmpty) stats + else (stats remove (stat => toBeRemoved contains stat.symbol)) ::: bridges } /** <p> |