summaryrefslogtreecommitdiff
path: root/src/reflect
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-09-23 10:35:43 +0200
committerJason Zaugg <jzaugg@gmail.com>2013-09-23 10:42:48 +0200
commit16d963bcb032deb669247e4a95c6391971cafd75 (patch)
treef2dd541f9345d2624069c097d18ae1e8509c87a2 /src/reflect
parent65817bd2b71f5ea0e39af1b1c2b085562cd8e925 (diff)
downloadscala-16d963bcb032deb669247e4a95c6391971cafd75.tar.gz
scala-16d963bcb032deb669247e4a95c6391971cafd75.tar.bz2
scala-16d963bcb032deb669247e4a95c6391971cafd75.zip
SI-7868 Account for numeric widening in match translation
Pattern match translation was unprepared for trees of the shape: (0: Short) match { case A.unapply(<unapply-selector>.toInt) <unapply> (_) => () case _ => () } While a scrutinee is inelibigle for implicit views in order to conform to the type of the extractor call, it is allowed to weakly conform. In this case, the typechecker will add the numeric widening with a `toInt` call. This commit: - Changes treeInfo.Unapplied to recognize this tree shape - Changes spliceApply to recognize and preserve the widening when substituting the unapply selector with the binder - Tests reification of such pattern matches, which also depends on treeInfo.Unapplied.
Diffstat (limited to 'src/reflect')
-rw-r--r--src/reflect/scala/reflect/internal/TreeInfo.scala9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/reflect/scala/reflect/internal/TreeInfo.scala b/src/reflect/scala/reflect/internal/TreeInfo.scala
index 1b763b8632..ab7506e657 100644
--- a/src/reflect/scala/reflect/internal/TreeInfo.scala
+++ b/src/reflect/scala/reflect/internal/TreeInfo.scala
@@ -784,10 +784,13 @@ abstract class TreeInfo {
* unapply (unwrapping nested Applies) and returns the fun part of that Apply.
*/
object Unapplied {
+ // Duplicated with `spliceApply`
def unapply(tree: Tree): Option[Tree] = tree match {
- case Apply(fun, Ident(nme.SELECTOR_DUMMY) :: Nil) => Some(fun)
- case Apply(fun, _) => unapply(fun)
- case _ => None
+ // SI-7868 Admit Select() to account for numeric widening, e.g. <unappplySelector>.toInt
+ case Apply(fun, (Ident(nme.SELECTOR_DUMMY)| Select(Ident(nme.SELECTOR_DUMMY), _)) :: Nil)
+ => Some(fun)
+ case Apply(fun, _) => unapply(fun)
+ case _ => None
}
}