diff options
author | Paul Phillips <paulp@improving.org> | 2013-08-15 15:02:19 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2013-08-17 08:22:52 -0700 |
commit | e76507f8793cd025b56ba2a0c3b0cc112bcc8aea (patch) | |
tree | 9353e27f0d01b2cda310da36ab666a9dc7a72d2b /src | |
parent | 35122d6cda84bb2df69ca51c6b1b80e61693bf6f (diff) | |
download | scala-e76507f8793cd025b56ba2a0c3b0cc112bcc8aea.tar.gz scala-e76507f8793cd025b56ba2a0c3b0cc112bcc8aea.tar.bz2 scala-e76507f8793cd025b56ba2a0c3b0cc112bcc8aea.zip |
An Unapplied extractor.
This makes it a lot less error prone and redundant to find the
part you need when unwrapping an UnApply tree.
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/reflect/reify/phases/Reshape.scala | 18 | ||||
-rw-r--r-- | src/reflect/scala/reflect/internal/TreeInfo.scala | 11 |
2 files changed, 14 insertions, 15 deletions
diff --git a/src/compiler/scala/reflect/reify/phases/Reshape.scala b/src/compiler/scala/reflect/reify/phases/Reshape.scala index b6f27f71ce..7610df67dc 100644 --- a/src/compiler/scala/reflect/reify/phases/Reshape.scala +++ b/src/compiler/scala/reflect/reify/phases/Reshape.scala @@ -8,6 +8,7 @@ trait Reshape { import global._ import definitions._ + import treeInfo.Unapplied /** * Rolls back certain changes that were introduced during typechecking of the reifee. @@ -65,22 +66,9 @@ trait Reshape { case block @ Block(stats, expr) => val stats1 = reshapeLazyVals(trimSyntheticCaseClassCompanions(stats)) Block(stats1, expr).copyAttrs(block) - case unapply @ UnApply(fun, args) => - def extractExtractor(tree: Tree): Tree = { - val Apply(fun, args) = tree - args match { - case List(Ident(special)) if special == nme.SELECTOR_DUMMY => - val Select(extractor, flavor) = fun - assert(flavor == nme.unapply || flavor == nme.unapplySeq) - extractor - case _ => - extractExtractor(fun) - } - } - + case unapply @ UnApply(Unapplied(Select(fun, nme.unapply | nme.unapplySeq)), args) => if (reifyDebug) println("unapplying unapply: " + tree) - val fun1 = extractExtractor(fun) - Apply(fun1, args).copyAttrs(unapply) + Apply(fun, args).copyAttrs(unapply) case _ => tree } diff --git a/src/reflect/scala/reflect/internal/TreeInfo.scala b/src/reflect/scala/reflect/internal/TreeInfo.scala index d01f1ce681..34fe0afb1a 100644 --- a/src/reflect/scala/reflect/internal/TreeInfo.scala +++ b/src/reflect/scala/reflect/internal/TreeInfo.scala @@ -773,6 +773,17 @@ abstract class TreeInfo { unapply(dissectApplied(tree)) } + /** Locates the synthetic Apply node corresponding to an extractor's call to + * unapply (unwrapping nested Applies) and returns the fun part of that Apply. + */ + object Unapplied { + 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 + } + } + /** Is this file the body of a compilation unit which should not * have Predef imported? This is the case iff the first import in the * unit explicitly refers to Predef. |