diff options
author | Martin Odersky <odersky@gmail.com> | 2014-01-04 23:06:45 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2014-01-04 23:06:55 +0100 |
commit | 35eeb8e8f17735bee5722954338836b10cfbb1e8 (patch) | |
tree | 332cdecd32f1fe2ac32db1684d43189fbae3494a /src/dotty | |
parent | 0aa4d2ce10dcf872c16ed4a5ecb7cd6a2b8c9b30 (diff) | |
download | dotty-35eeb8e8f17735bee5722954338836b10cfbb1e8.tar.gz dotty-35eeb8e8f17735bee5722954338836b10cfbb1e8.tar.bz2 dotty-35eeb8e8f17735bee5722954338836b10cfbb1e8.zip |
Changes to propagation of wildcardtypes
1) Selecting from a wildcardtype now gives a wildcard type. Wildcard types are no longer legal as prefixes of NamedTypes.
2) Bound of type variables are proagated into wildcard type approximations.
Diffstat (limited to 'src/dotty')
-rw-r--r-- | src/dotty/tools/dotc/core/TypeComparer.scala | 2 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/Types.scala | 10 |
2 files changed, 7 insertions, 5 deletions
diff --git a/src/dotty/tools/dotc/core/TypeComparer.scala b/src/dotty/tools/dotc/core/TypeComparer.scala index 0b6e8294b..cdef1ab2c 100644 --- a/src/dotty/tools/dotc/core/TypeComparer.scala +++ b/src/dotty/tools/dotc/core/TypeComparer.scala @@ -971,7 +971,7 @@ class ExplainingTypeComparer(initctx: Context) extends TypeComparer(initctx) { } override def isSubType(tp1: Type, tp2: Type) = - traceIndented(s"${show(tp1)} <:< ${show(tp2)}${if (ctx.settings.verbose.value) s" ${tp1.getClass} ${tp2.getClass}" else ""}${if (frozenConstraint) " frozen" else ""}") { + traceIndented(s"${show(tp1)} <:< ${show(tp2)}${if (Config.verboseExplainSubtype) s" ${tp1.getClass} ${tp2.getClass}" else ""}${if (frozenConstraint) " frozen" else ""}") { super.isSubType(tp1, tp2) } diff --git a/src/dotty/tools/dotc/core/Types.scala b/src/dotty/tools/dotc/core/Types.scala index 8fe813e4d..92f65c1fe 100644 --- a/src/dotty/tools/dotc/core/Types.scala +++ b/src/dotty/tools/dotc/core/Types.scala @@ -628,6 +628,8 @@ object Types { case TypeBounds(lo, hi) if lo eq hi => hi case _ => NoType } + case pre: WildcardType => + WildcardType case _ => NoType } @@ -1044,8 +1046,7 @@ object Types { val name: Name assert(prefix.isValueType || - (prefix eq NoPrefix) || - prefix.isInstanceOf[WildcardType], s"bad prefix in $prefix.$name") + (prefix eq NoPrefix), s"bad prefix in $prefix.$name") private[this] var lastDenotationOrSym: AnyRef = null @@ -1145,7 +1146,7 @@ object Types { def derivedSelect(prefix: Type)(implicit ctx: Context): Type = if (prefix eq this.prefix) this else { - val res = lookupRefined(this, name) + val res = lookupRefined(prefix, name) if (res.exists) res else newLikeThis(prefix) } @@ -2196,7 +2197,8 @@ object Types { case MethodParam(mt, pnum) => WildcardType(TypeBounds.upper(apply(mt.paramTypes(pnum)))) case tp: TypeVar => - apply(tp.underlying) + val inst = tp.instanceOpt + apply(inst orElse WildcardType(ctx.typerState.constraint.bounds(tp.origin))) case _ => mapOver(tp) } |