summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/reflect/quasiquotes/Placeholders.scala2
-rw-r--r--src/reflect/scala/reflect/internal/Internals.scala2
-rw-r--r--src/reflect/scala/reflect/macros/Universe.scala5
-rw-r--r--test/files/run/macro-subpatterns/Macro_1.scala3
4 files changed, 9 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/reflect/quasiquotes/Placeholders.scala b/src/compiler/scala/tools/reflect/quasiquotes/Placeholders.scala
index 825d0c04f3..f50d699e22 100644
--- a/src/compiler/scala/tools/reflect/quasiquotes/Placeholders.scala
+++ b/src/compiler/scala/tools/reflect/quasiquotes/Placeholders.scala
@@ -42,7 +42,7 @@ trait Placeholders { self: Quasiquotes =>
case nme.apply => args
case nme.unapply =>
val (dummy @ Ident(nme.SELECTOR_DUMMY)) :: Nil = args
- dummy.attachments.get[SubpatternsAttachment].get.patterns
+ internal.subpatterns(dummy)
case _ => global.abort("unreachable")
}
diff --git a/src/reflect/scala/reflect/internal/Internals.scala b/src/reflect/scala/reflect/internal/Internals.scala
index cd2017e693..43a118217d 100644
--- a/src/reflect/scala/reflect/internal/Internals.scala
+++ b/src/reflect/scala/reflect/internal/Internals.scala
@@ -121,6 +121,8 @@ trait Internals extends api.Internals {
def annotatedType(annotations: List[Annotation], underlying: Type): AnnotatedType = self.AnnotatedType(annotations, underlying)
def typeBounds(lo: Type, hi: Type): TypeBounds = self.TypeBounds(lo, hi)
def boundedWildcardType(bounds: TypeBounds): BoundedWildcardType = self.BoundedWildcardType(bounds)
+
+ def subpatterns(tree: Tree): List[Tree] = tree.attachments.get[SubpatternsAttachment].get.patterns
}
lazy val treeBuild = new self.TreeGen {
diff --git a/src/reflect/scala/reflect/macros/Universe.scala b/src/reflect/scala/reflect/macros/Universe.scala
index 15fd6bad99..e69805cfc1 100644
--- a/src/reflect/scala/reflect/macros/Universe.scala
+++ b/src/reflect/scala/reflect/macros/Universe.scala
@@ -134,6 +134,11 @@ abstract class Universe extends scala.reflect.api.Universe {
* @group Macros
*/
def capturedVariableType(vble: Symbol): Type
+
+ /** Retrieves the untyped list of subpatterns attached to selector dummy of an UnApply node.
+ * Useful in writing quasiquoting macros that do pattern matching.
+ */
+ def subpatterns(tree: Tree): List[Tree]
}
/** @group Internal */
diff --git a/test/files/run/macro-subpatterns/Macro_1.scala b/test/files/run/macro-subpatterns/Macro_1.scala
index 994421aa32..e009e411a2 100644
--- a/test/files/run/macro-subpatterns/Macro_1.scala
+++ b/test/files/run/macro-subpatterns/Macro_1.scala
@@ -6,11 +6,10 @@ object Extractor {
def unapplyImpl(c: Context)(x: c.Tree) = {
import c.universe._
import internal._
- val subpatterns = attachments(x).get[scala.reflect.internal.SymbolTable#SubpatternsAttachment].get.patterns.toString
q"""
new {
def isEmpty = false
- def get = $subpatterns
+ def get = ${subpatterns(x).toString}
def unapply(x: Any) = this
}.unapply($x)
"""