aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/typer/TypeAssigner.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-03-02 14:33:45 +0100
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2015-03-18 11:14:13 +0100
commit2b4236e755ae3a7182dbffa3e633666bf1b32c8a (patch)
tree4fba80e001fc1bfebfce348ab4209dc4bcf28df1 /src/dotty/tools/dotc/typer/TypeAssigner.scala
parent7bd12db9dfad6b5fd28c87e369fa093158840bf7 (diff)
downloaddotty-2b4236e755ae3a7182dbffa3e633666bf1b32c8a.tar.gz
dotty-2b4236e755ae3a7182dbffa3e633666bf1b32c8a.tar.bz2
dotty-2b4236e755ae3a7182dbffa3e633666bf1b32c8a.zip
Fix problems in avoid
It turned out that avoid does not always produce a supertype of the original type, which makes the additions in "ensureNoLocalRefs" type incorrect. This commit fixes the problems.
Diffstat (limited to 'src/dotty/tools/dotc/typer/TypeAssigner.scala')
-rw-r--r--src/dotty/tools/dotc/typer/TypeAssigner.scala8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/typer/TypeAssigner.scala b/src/dotty/tools/dotc/typer/TypeAssigner.scala
index ea489f7b0..84198b954 100644
--- a/src/dotty/tools/dotc/typer/TypeAssigner.scala
+++ b/src/dotty/tools/dotc/typer/TypeAssigner.scala
@@ -47,6 +47,8 @@ trait TypeAssigner {
sym.owner.isTerm && (forbidden contains sym)
|| !(sym.owner is Package) && toAvoid(tp.prefix)
)
+ case tp: TypeRef =>
+ forbidden contains tp.symbol
case _ =>
false
}
@@ -57,7 +59,7 @@ trait TypeAssigner {
tp.info match {
case TypeAlias(ref) =>
apply(ref)
- case info: ClassInfo =>
+ case info: ClassInfo if variance > 0 =>
val parentType = info.instantiatedParents.reduceLeft(ctx.typeComparer.andType(_, _))
def addRefinement(parent: Type, decl: Symbol) = {
val inherited = parentType.findMember(decl.name, info.cls.thisType, Private)
@@ -73,12 +75,14 @@ trait TypeAssigner {
sym => sym.is(TypeParamAccessor | Private) || sym.isConstructor)
val fullType = (parentType /: refinableDecls)(addRefinement)
mapOver(fullType)
+ case TypeBounds(lo, hi) if variance > 0 =>
+ apply(hi)
case _ =>
mapOver(tp)
}
case tp: RefinedType =>
val tp1 @ RefinedType(parent1, _) = mapOver(tp)
- if (tp1.refinedInfo existsPart toAvoid) {
+ if (tp1.refinedInfo.existsPart(toAvoid) && variance > 0) {
typr.println(s"dropping refinement from $tp1")
parent1
}