diff options
author | Lukas Rytz <lukas.rytz@typesafe.com> | 2014-11-10 12:45:43 +0100 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@typesafe.com> | 2014-11-10 12:45:43 +0100 |
commit | 5a7875fd0e6af19286f3ff125d4ad9b311a7ad7e (patch) | |
tree | 8914ab6c9e2ced919b79dbfa3f9437d81ff36084 /src/reflect/scala/reflect/internal/tpe | |
parent | 02c08524b2dee1a83ed82ac945de8a1baaba09ac (diff) | |
parent | cbca4943884d23f0a588471ea68e733170d069af (diff) | |
download | scala-5a7875fd0e6af19286f3ff125d4ad9b311a7ad7e.tar.gz scala-5a7875fd0e6af19286f3ff125d4ad9b311a7ad7e.tar.bz2 scala-5a7875fd0e6af19286f3ff125d4ad9b311a7ad7e.zip |
Merge pull request #4101 from adriaanm/sam-ex
[sammy] eta-expansion, overloading, existentials
Diffstat (limited to 'src/reflect/scala/reflect/internal/tpe')
-rw-r--r-- | src/reflect/scala/reflect/internal/tpe/TypeMaps.scala | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/reflect/scala/reflect/internal/tpe/TypeMaps.scala b/src/reflect/scala/reflect/internal/tpe/TypeMaps.scala index f06420de96..c705ca7069 100644 --- a/src/reflect/scala/reflect/internal/tpe/TypeMaps.scala +++ b/src/reflect/scala/reflect/internal/tpe/TypeMaps.scala @@ -422,6 +422,22 @@ private[internal] trait TypeMaps { } } + /** + * Get rid of BoundedWildcardType where variance allows us to do so. + * Invariant: `wildcardExtrapolation(tp) =:= tp` + * + * For example, the MethodType given by `def bla(x: (_ >: String)): (_ <: Int)` + * is both a subtype and a supertype of `def bla(x: String): Int`. + */ + object wildcardExtrapolation extends TypeMap(trackVariance = true) { + def apply(tp: Type): Type = + tp match { + case BoundedWildcardType(TypeBounds(lo, AnyTpe)) if variance.isContravariant => lo + case BoundedWildcardType(TypeBounds(NothingTpe, hi)) if variance.isCovariant => hi + case tp => mapOver(tp) + } + } + /** Might the given symbol be important when calculating the prefix * of a type? When tp.asSeenFrom(pre, clazz) is called on `tp`, * the result will be `tp` unchanged if `pre` is trivial and `clazz` |