summaryrefslogtreecommitdiff
path: root/test/files/run/t7871/Macros_1.scala
diff options
context:
space:
mode:
Diffstat (limited to 'test/files/run/t7871/Macros_1.scala')
-rw-r--r--test/files/run/t7871/Macros_1.scala43
1 files changed, 43 insertions, 0 deletions
diff --git a/test/files/run/t7871/Macros_1.scala b/test/files/run/t7871/Macros_1.scala
new file mode 100644
index 0000000000..2943445ff8
--- /dev/null
+++ b/test/files/run/t7871/Macros_1.scala
@@ -0,0 +1,43 @@
+import scala.reflect.macros.Context
+import scala.language.experimental.macros
+
+trait Tree
+case object SomeTree extends Tree
+
+object NewQuasiquotes {
+ implicit class QuasiquoteInterpolation(c: StringContext) {
+ object nq {
+ def unapply(t: Tree): Any = macro QuasiquoteMacros.unapplyImpl
+ }
+ }
+}
+
+object QuasiquoteMacros {
+ def unapplyImpl(c: Context)(t: c.Expr[Tree]) = {
+ import c.universe._
+ import Flag._
+ // q"""
+ // new {
+ // def unapply(t: Tree) = t match {
+ // case SomeTree => Some((SomeTree, SomeTree))
+ // case _ => None
+ // }
+ // }.unapply($t)
+ // """
+ c.Expr[Any](Apply(
+ Select(
+ Block(List(
+ ClassDef(Modifiers(FINAL), newTypeName("$anon"), List(),
+ Template(List(Select(Ident(newTermName("scala")), newTypeName("AnyRef"))), emptyValDef, List(
+ DefDef(Modifiers(), nme.CONSTRUCTOR, List(), List(List()), TypeTree(),
+ Block(List(Apply(Select(Super(This(tpnme.EMPTY), tpnme.EMPTY), nme.CONSTRUCTOR), List())), Literal(Constant(())))),
+ DefDef(Modifiers(), newTermName("unapply"), List(), List(List(ValDef(Modifiers(PARAM), newTermName("t"), Ident(newTypeName("Tree")), EmptyTree))), TypeTree(),
+ Match(
+ Ident(newTermName("t")), List(
+ CaseDef(Ident(newTermName("SomeTree")), EmptyTree, Apply(Ident(newTermName("Some")), List(Apply(Select(Ident(newTermName("scala")), newTermName("Tuple2")), List(Ident(newTermName("SomeTree")), Ident(newTermName("SomeTree"))))))),
+ CaseDef(Ident(nme.WILDCARD), EmptyTree, Ident(newTermName("None")))))))))),
+ Apply(Select(New(Ident(newTypeName("$anon"))), nme.CONSTRUCTOR), List())),
+ newTermName("unapply")),
+ List(t.tree)))
+ }
+}