diff options
author | Martin Odersky <odersky@gmail.com> | 2009-12-17 15:50:52 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2009-12-17 15:50:52 +0000 |
commit | d8ef68e6a18862ac18cd304274feb0b310dd545c (patch) | |
tree | 0411106924aa1cd3f58c5225052de53c236b99e3 /src | |
parent | 63333f9e622478997a4cf94ee72d8a31370ad4e2 (diff) | |
download | scala-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')
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/Erasure.scala | 12 |
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) => |