summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2009-12-17 15:50:52 +0000
committerMartin Odersky <odersky@gmail.com>2009-12-17 15:50:52 +0000
commitd8ef68e6a18862ac18cd304274feb0b310dd545c (patch)
tree0411106924aa1cd3f58c5225052de53c236b99e3 /src/compiler
parent63333f9e622478997a4cf94ee72d8a31370ad4e2 (diff)
downloadscala-d8ef68e6a18862ac18cd304274feb0b310dd545c.tar.gz
scala-d8ef68e6a18862ac18cd304274feb0b310dd545c.tar.bz2
scala-d8ef68e6a18862ac18cd304274feb0b310dd545c.zip
implement new spec for erasure of intersection ...
implement new spec for erasure of intersection types.
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/scala/tools/nsc/transform/Erasure.scala12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala
index d58d95cbfe..e4ee0afb28 100644
--- a/src/compiler/scala/tools/nsc/transform/Erasure.scala
+++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala
@@ -146,7 +146,17 @@ abstract class Erasure extends AddInterfaces with typechecker.Analyzer with ast.
apply(restpe))
case RefinedType(parents, decls) =>
if (parents.isEmpty) erasedTypeRef(ObjectClass)
- else apply(parents.head)
+ else {
+ // implement new spec for erasure of refined types.
+ val psyms = parents map (_.typeSymbol)
+ def isUnshadowed(psym: Symbol) =
+ !(psyms exists (qsym => (psym ne qsym) && (qsym isNonBottomSubClass psym)))
+ val cs = parents.iterator.filter { p => // isUnshadowed is a bit expensive, so try classes first
+ val psym = p.typeSymbol
+ psym.isClass && !psym.isTrait && isUnshadowed(psym)
+ }
+ apply((if (cs.hasNext) cs else parents.iterator.filter(p => isUnshadowed(p.typeSymbol))).next())
+ }
case AnnotatedType(_, atp, _) =>
apply(atp)
case ClassInfoType(parents, decls, clazz) =>