aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/Definitions.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-11-08 18:29:27 +0100
committerMartin Odersky <odersky@gmail.com>2015-11-09 15:45:40 +0100
commit0e14e70b1bb4b079990b952ada3e8dd6b8de955d (patch)
tree8b199c169d361cfad56601f18cdc637f14131173 /src/dotty/tools/dotc/core/Definitions.scala
parent820bd7ec55bc8ef621204dc82f56a80e2d2459f0 (diff)
downloaddotty-0e14e70b1bb4b079990b952ada3e8dd6b8de955d.tar.gz
dotty-0e14e70b1bb4b079990b952ada3e8dd6b8de955d.tar.bz2
dotty-0e14e70b1bb4b079990b952ada3e8dd6b8de955d.zip
Generalize MultiArrayOf to arrays of wildcards
Needed for both ClassTags and instance of checks. This makes scala/Array.scala compile.
Diffstat (limited to 'src/dotty/tools/dotc/core/Definitions.scala')
-rw-r--r--src/dotty/tools/dotc/core/Definitions.scala14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/core/Definitions.scala b/src/dotty/tools/dotc/core/Definitions.scala
index b08a20889..433b8544a 100644
--- a/src/dotty/tools/dotc/core/Definitions.scala
+++ b/src/dotty/tools/dotc/core/Definitions.scala
@@ -529,15 +529,27 @@ class Definitions {
}
}
+ /** An extractor for multi-dimensional arrays.
+ * Note that this will also extract the high bound if an
+ * element type is a wildcard. E.g.
+ *
+ * Array[_ <: Array[_ <: Number]]
+ *
+ * would match
+ *
+ * MultiArrayOf(<Number>, 2)
+ */
object MultiArrayOf {
def apply(elem: Type, ndims: Int)(implicit ctx: Context): Type =
if (ndims == 0) elem else ArrayOf(apply(elem, ndims - 1))
def unapply(tp: Type)(implicit ctx: Context): Option[(Type, Int)] = tp match {
case ArrayOf(elemtp) =>
- elemtp match {
+ def recur(elemtp: Type): Option[(Type, Int)] = elemtp.dealias match {
+ case TypeBounds(lo, hi) => recur(hi)
case MultiArrayOf(finalElemTp, n) => Some(finalElemTp, n + 1)
case _ => Some(elemtp, 1)
}
+ recur(elemtp)
case _ =>
None
}