diff options
author | Eugene Burmako <xeno.by@gmail.com> | 2014-02-01 00:19:16 +0100 |
---|---|---|
committer | Eugene Burmako <xeno.by@gmail.com> | 2014-02-14 23:51:24 +0100 |
commit | 462d0b8b1c9de95baad773856a7e1f658ebd0956 (patch) | |
tree | 7d8476b9f174d53c2e68d8255a5e221c30db3e6c | |
parent | 8c29132055845181a34ed9077d30fac87c284574 (diff) | |
download | scala-462d0b8b1c9de95baad773856a7e1f658ebd0956.tar.gz scala-462d0b8b1c9de95baad773856a7e1f658ebd0956.tar.bz2 scala-462d0b8b1c9de95baad773856a7e1f658ebd0956.zip |
adds internal.subpatterns
As per Denys’s request, this commit exposes the hack that we use to
obtain subpatterns of UnApply nodes. This is useful when writing
quasiquoting macros that do pattern matching.
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) """ |