aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dotty/tools/dotc/typer/TypeAssigner.scala25
-rw-r--r--tests/pos/escapingRefs.scala10
2 files changed, 20 insertions, 15 deletions
diff --git a/src/dotty/tools/dotc/typer/TypeAssigner.scala b/src/dotty/tools/dotc/typer/TypeAssigner.scala
index 496380b3a..22c062243 100644
--- a/src/dotty/tools/dotc/typer/TypeAssigner.scala
+++ b/src/dotty/tools/dotc/typer/TypeAssigner.scala
@@ -42,22 +42,19 @@ trait TypeAssigner {
def avoid(tp: Type, symsToAvoid: => List[Symbol])(implicit ctx: Context): Type = {
val widenMap = new TypeMap {
lazy val forbidden = symsToAvoid.toSet
- def toAvoid(tp: Type): Boolean = tp match {
- case tp: TermRef =>
- val sym = tp.symbol
- sym.exists && (
- sym.owner.isTerm && (forbidden contains sym)
- || !(sym.owner is Package) && toAvoid(tp.prefix)
- )
- case tp: TypeRef =>
- forbidden contains tp.symbol
- case _ =>
- false
- }
+ def toAvoid(tp: Type): Boolean =
+ // TODO: measure the cost of using `existsPart`, and if necessary replace it
+ // by a `TypeAccumulator` where we have set `stopAtStatic = true`.
+ tp existsPart {
+ case tp: NamedType =>
+ forbidden contains tp.symbol
+ case _ =>
+ false
+ }
def apply(tp: Type): Type = tp match {
case tp: TermRef if toAvoid(tp) && variance > 0 =>
apply(tp.info.widenExpr)
- case tp: TypeRef if (forbidden contains tp.symbol) || toAvoid(tp.prefix) =>
+ case tp: TypeRef if toAvoid(tp) =>
tp.info match {
case TypeAlias(ref) =>
apply(ref)
@@ -92,7 +89,7 @@ trait TypeAssigner {
}
case tp: RefinedType =>
val tp1 @ RefinedType(parent1, _) = mapOver(tp)
- if (tp1.refinedInfo.existsPart(toAvoid) && variance > 0) {
+ if (toAvoid(tp1.refinedInfo) && variance > 0) {
typr.println(s"dropping refinement from $tp1")
parent1
}
diff --git a/tests/pos/escapingRefs.scala b/tests/pos/escapingRefs.scala
index a7960bee4..c18720764 100644
--- a/tests/pos/escapingRefs.scala
+++ b/tests/pos/escapingRefs.scala
@@ -1,5 +1,7 @@
class Outer {
- class Inner
+ class Inner {
+ class Inner2
+ }
}
object Test {
@@ -8,5 +10,11 @@ object Test {
val o = new Outer
new o.Inner
}
+
+ val b: Outer#Inner#Inner2 = {
+ val o = new Outer
+ val i = new o.Inner
+ new i.Inner2
+ }
}
}