@@ -19,6 +19,8 @@ import scala.quoted.Exprs._
1919
2020import scala .reflect .ClassTag
2121
22+ import scala .collection .mutable
23+
2224object PickledQuotes {
2325 import tpd ._
2426
@@ -34,43 +36,58 @@ object PickledQuotes {
3436 }
3537
3638 /** Transform the expression into its fully spliced Tree */
37- def quotedExprToTree [T ](expr : quoted.Expr [T ])(implicit ctx : Context ): Tree = expr match {
38- case expr : TastyExpr [_] => unpickleExpr(expr)
39+ def quotedExprToTree [T ](expr : quoted.Expr [T ], nested : Boolean )(implicit ctx : Context ): Tree = expr match {
40+ case expr : TastyExpr [_] => unpickleExpr(expr, nested )
3941 case expr : LiftedExpr [T ] =>
4042 expr.value match {
4143 case value : Class [_] => ref(defn.Predef_classOf ).appliedToType(classToType(value))
42- case value=> Literal (Constant (value))
44+ case value => Literal (Constant (value))
4345 }
4446 case expr : TreeExpr [Tree ] @ unchecked => expr.tree
4547 case expr : FunctionAppliedTo [_, _] =>
46- functionAppliedTo(quotedExprToTree(expr.f), quotedExprToTree(expr.x))
48+ functionAppliedTo(quotedExprToTree(expr.f, nested ), quotedExprToTree(expr.x, nested ))
4749 }
4850
4951 /** Transform the expression into its fully spliced TypeTree */
50- def quotedTypeToTree (expr : quoted.Type [_])(implicit ctx : Context ): Tree = expr match {
51- case expr : TastyType [_] => unpickleType(expr)
52+ def quotedTypeToTree (expr : quoted.Type [_], nested : Boolean )(implicit ctx : Context ): Tree = expr match {
53+ case expr : TastyType [_] => unpickleType(expr, nested )
5254 case expr : TaggedType [_] => classTagToTypeTree(expr.ct)
5355 case expr : TreeType [Tree ] @ unchecked => expr.tree
5456 }
5557
5658 /** Unpickle the tree contained in the TastyExpr */
57- private def unpickleExpr (expr : TastyExpr [_])(implicit ctx : Context ): Tree = {
59+ private def unpickleExpr (expr : TastyExpr [_], nested : Boolean )(implicit ctx : Context ): Tree = {
5860 val tastyBytes = TastyString .unpickle(expr.tasty)
5961 val unpickled = unpickle(tastyBytes, expr.args)
6062 unpickled match {
6163 case PackageDef (_, (vdef : ValDef ) :: Nil ) =>
62- vdef.rhs.changeOwner (vdef.symbol, ctx.owner )
64+ changeQuoteOwners (vdef.rhs, nested )
6365 }
6466 }
6567
6668 /** Unpickle the tree contained in the TastyType */
67- private def unpickleType (ttpe : TastyType [_])(implicit ctx : Context ): Tree = {
69+ private def unpickleType (ttpe : TastyType [_], nested : Boolean )(implicit ctx : Context ): Tree = {
6870 val tastyBytes = TastyString .unpickle(ttpe.tasty)
6971 val unpickled = unpickle(tastyBytes, ttpe.args)
7072 unpickled match {
7173 case PackageDef (_, (vdef : ValDef ) :: Nil ) =>
72- vdef.rhs.asInstanceOf [TypeApply ].args.head
73- .changeOwner(vdef.symbol, ctx.owner)
74+ changeQuoteOwners(vdef.rhs.asInstanceOf [TypeApply ].args.head, nested)
75+ }
76+ }
77+
78+ private def changeQuoteOwners (tree : Tree , nested : Boolean )(implicit ctx : Context ): Tree = {
79+ if (nested) tree
80+ else {
81+ val set = mutable.HashSet .empty[Symbol ]
82+ new TreeTraverser {
83+ override def traverse (tree : tpd.Tree )(implicit ctx : Context ): Unit = {
84+ if (tree.symbol.exists && tree.symbol.owner.name == " $quote" .toTermName)
85+ set += tree.symbol.owner
86+ traverseChildren(tree)
87+ }
88+ }.traverse(tree)
89+ val owners = set.toList
90+ new TreeTypeMap (oldOwners = owners, newOwners = owners.map(_ => ctx.owner)).apply(tree)
7491 }
7592 }
7693
0 commit comments