diff options
author | Martin Odersky <odersky@gmail.com> | 2014-01-13 16:59:38 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2014-01-13 16:59:38 +0100 |
commit | e356e252b9d400730ca8f748ab5986e18d7597d0 (patch) | |
tree | 56b9b3f2b5fd9f9682d34473393d9eca1438891b /src/dotty/tools/dotc/ast | |
parent | 3b21416e1b1ba9f301e8fc269f656651f99ca0ea (diff) | |
download | dotty-e356e252b9d400730ca8f748ab5986e18d7597d0.tar.gz dotty-e356e252b9d400730ca8f748ab5986e18d7597d0.tar.bz2 dotty-e356e252b9d400730ca8f748ab5986e18d7597d0.zip |
Improved avoidance of local symbols
If the refinement in a refined type refers to a local symbol, drop it and return only the parent.
Diffstat (limited to 'src/dotty/tools/dotc/ast')
-rw-r--r-- | src/dotty/tools/dotc/ast/tpd.scala | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/ast/tpd.scala b/src/dotty/tools/dotc/ast/tpd.scala index 878e11b67..b369b4e37 100644 --- a/src/dotty/tools/dotc/ast/tpd.scala +++ b/src/dotty/tools/dotc/ast/tpd.scala @@ -93,13 +93,20 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo { def avoid(tp: Type, syms: => List[Symbol])(implicit ctx: Context): Type = { val widenMap = new TypeMap { - lazy val avoided = syms.toSet - def toAvoid(sym: Symbol) = sym.owner.isTerm && (avoided contains sym) + lazy val forbidden = syms.toSet + def toAvoid(sym: Symbol): Boolean = sym.owner.isTerm && (forbidden contains sym) + def toAvoid(tp: Type): Boolean = tp match { + case tp: TermRef => toAvoid(tp.symbol) + case _ => false + } def apply(tp: Type) = tp match { case tp: TermRef if toAvoid(tp.symbol) && variance > 0 => apply(tp.info) case tp @ TypeRef(pre: TermRef, _) if tp.symbol.isAliasType && toAvoid(pre.symbol) => apply(tp.info.bounds.hi) + case tp @ RefinedType(parent, _) => + val tp1 @ RefinedType(parent1, _) = mapOver(tp) + if (tp1.refinedInfo existsPart toAvoid) parent1 else tp1 case _ => mapOver(tp) } |