diff options
author | Martin Odersky <odersky@gmail.com> | 2015-11-08 18:29:27 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2015-11-09 15:45:40 +0100 |
commit | 0e14e70b1bb4b079990b952ada3e8dd6b8de955d (patch) | |
tree | 8b199c169d361cfad56601f18cdc637f14131173 /src/dotty/tools/dotc/core/Definitions.scala | |
parent | 820bd7ec55bc8ef621204dc82f56a80e2d2459f0 (diff) | |
download | dotty-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.scala | 14 |
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 } |