aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/ast
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-01-13 16:59:38 +0100
committerMartin Odersky <odersky@gmail.com>2014-01-13 16:59:38 +0100
commite356e252b9d400730ca8f748ab5986e18d7597d0 (patch)
tree56b9b3f2b5fd9f9682d34473393d9eca1438891b /src/dotty/tools/dotc/ast
parent3b21416e1b1ba9f301e8fc269f656651f99ca0ea (diff)
downloaddotty-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.scala11
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)
}