diff options
author | Den Shabalin <den.shabalin@gmail.com> | 2013-09-26 18:41:02 +0200 |
---|---|---|
committer | Den Shabalin <den.shabalin@gmail.com> | 2013-10-14 13:30:49 +0200 |
commit | debdd2f316934c417c7d9865ea0f2ea503e51b63 (patch) | |
tree | 2f3b2697034dd260035c13adda75b7482f4ddbdd /src/compiler/scala/tools/reflect/quasiquotes/Placeholders.scala | |
parent | 60603f2524bf7c06c6f73eefb1cc30b6df7c392d (diff) | |
download | scala-debdd2f316934c417c7d9865ea0f2ea503e51b63.tar.gz scala-debdd2f316934c417c7d9865ea0f2ea503e51b63.tar.bz2 scala-debdd2f316934c417c7d9865ea0f2ea503e51b63.zip |
use regular macro expansion logic for unapply quasiquotes
Previously due to limited support for expansion in apply position
quasiquotes had to use a compiler hook for deconstruction. Now with
recent changes in pattern matcher it's possible to remove that special
case.
Diffstat (limited to 'src/compiler/scala/tools/reflect/quasiquotes/Placeholders.scala')
-rw-r--r-- | src/compiler/scala/tools/reflect/quasiquotes/Placeholders.scala | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/reflect/quasiquotes/Placeholders.scala b/src/compiler/scala/tools/reflect/quasiquotes/Placeholders.scala index d74350cad8..c31d1fcd12 100644 --- a/src/compiler/scala/tools/reflect/quasiquotes/Placeholders.scala +++ b/src/compiler/scala/tools/reflect/quasiquotes/Placeholders.scala @@ -32,10 +32,17 @@ trait Placeholders { self: Quasiquotes => def appendHole(tree: Tree, cardinality: Cardinality) = { val placeholderName = c.freshName(TermName(nme.QUASIQUOTE_PREFIX + sessionSuffix)) sb.append(placeholderName) - holeMap(placeholderName) = Hole(tree, cardinality) + val holeTree = if (method == nme.unapply) Bind(placeholderName, Ident(nme.WILDCARD)) else tree + holeMap(placeholderName) = Hole(holeTree, cardinality) } - foreach2(args, parts.init) { case (tree, (p, pos)) => + val iargs = method match { + case nme.apply => args + case nme.unapply => List.fill(parts.length - 1)(EmptyTree) + case _ => global.abort("unreachable") + } + + foreach2(iargs, parts.init) { case (tree, (p, pos)) => val (part, cardinality) = parseDots(p) appendPart(part, pos) appendHole(tree, cardinality) @@ -47,7 +54,7 @@ trait Placeholders { self: Quasiquotes => } class HoleMap { - private val underlying = mutable.ListMap[String, Hole]() + private var underlying = immutable.SortedMap[String, Hole]() private val accessed = mutable.Set[String]() def unused: Set[Name] = (underlying.keys.toSet -- accessed).map(TermName(_)) def contains(key: Name) = underlying.contains(key.toString) @@ -64,6 +71,7 @@ trait Placeholders { self: Quasiquotes => accessed += s underlying.get(s) } + def toList = underlying.toList } // Step 2: Transform vanilla Scala AST into an AST with holes |