diff options
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) """ |