summaryrefslogtreecommitdiff
path: root/src/reflect/scala/reflect/internal/tpe
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@typesafe.com>2014-11-10 12:45:43 +0100
committerLukas Rytz <lukas.rytz@typesafe.com>2014-11-10 12:45:43 +0100
commit5a7875fd0e6af19286f3ff125d4ad9b311a7ad7e (patch)
tree8914ab6c9e2ced919b79dbfa3f9437d81ff36084 /src/reflect/scala/reflect/internal/tpe
parent02c08524b2dee1a83ed82ac945de8a1baaba09ac (diff)
parentcbca4943884d23f0a588471ea68e733170d069af (diff)
downloadscala-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.scala16
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`