@@ -7,11 +7,12 @@ import dotty.tools.dotc.core.Constants.Constant
77import dotty .tools .dotc .core .Contexts ._
88import dotty .tools .dotc .core .Decorators ._
99import dotty .tools .dotc .core .Flags ._
10+ import dotty .tools .dotc .core .StdNames ._
1011import dotty .tools .dotc .core .Symbols ._
1112import dotty .tools .dotc .core .tasty .{TastyPickler , TastyPrinter , TastyString }
1213import dotty .tools .dotc .interpreter .RawQuoted
1314
14- import scala .runtime . quoted . Unpickler . Pickled
15+ import scala .reflect . ClassTag
1516
1617object PickledQuotes {
1718 import tpd ._
@@ -34,6 +35,18 @@ object PickledQuotes {
3435 def quotedToTree (expr : quoted.Quoted )(implicit ctx : Context ): Tree = expr match {
3536 case expr : quoted.TastyQuoted => unpickleQuote(expr)
3637 case expr : quoted.Liftable .ConstantExpr [_] => Literal (Constant (expr.value))
38+ case expr : quoted.Type .TaggedPrimitive [_] =>
39+ val tpe = expr.ct match {
40+ case ClassTag .Unit => defn.UnitType
41+ case ClassTag .Byte => defn.ByteType
42+ case ClassTag .Char => defn.CharType
43+ case ClassTag .Short => defn.ShortType
44+ case ClassTag .Int => defn.IntType
45+ case ClassTag .Long => defn.LongType
46+ case ClassTag .Float => defn.FloatType
47+ case ClassTag .Double => defn.FloatType
48+ }
49+ TypeTree (tpe)
3750 case expr : RawQuoted => expr.tree
3851 }
3952
@@ -42,26 +55,24 @@ object PickledQuotes {
4255 val tastyBytes = TastyString .unpickle(expr.tasty)
4356 val unpickled = unpickle(tastyBytes, expr.args)
4457 unpickled match {
45- case PackageDef (_, (vdef : ValDef ) :: Nil ) => vdef.rhs
46- case PackageDef (_, (tdef : TypeDef ) :: Nil ) => tdef.rhs
58+ case PackageDef (_, (vdef : ValDef ) :: Nil ) =>
59+ if (vdef.name == " $quote" .toTermName) vdef.rhs
60+ else vdef.rhs.asInstanceOf [TypeApply ].args.head
4761 }
4862 }
4963
5064 /** Encapsulate the tree in a top level `val` or `type`
51- * `<tree>` ==> `package _root_ { val ' : Any = <tree> }`
65+ * `<tree>` ==> `package _root_ { val $quote : Any = <tree> }`
5266 * or
53- * `<type tree>` ==> `package _root_ { type ' = <tree tree> }`
67+ * `<type tree>` ==> `package _root_ { val $typeQuote: Any = null.asInstanceOf[ <tree>] }`
5468 */
5569 private def encapsulateQuote (tree : Tree )(implicit ctx : Context ): Tree = {
56- def encapsulatedTerm = {
57- val sym = ctx.newSymbol(ctx.owner, " '" .toTermName, Synthetic , defn.AnyType , coord = tree.pos)
58- ValDef (sym, tree).withPos(tree.pos)
59- }
60-
61- def encapsulatedType =
62- untpd.TypeDef (" '" .toTypeName, tree).withPos(tree.pos).withType(defn.AnyType )
63-
64- val quoted = if (tree.isTerm) encapsulatedTerm else encapsulatedType
70+ val name = (if (tree.isTerm) " $quote" else " $typeQuote" ).toTermName
71+ val sym = ctx.newSymbol(ctx.owner, name, Synthetic , defn.AnyType , coord = tree.pos)
72+ val encoded =
73+ if (tree.isTerm) tree
74+ else Literal (Constant (null )).select(nme.asInstanceOf_).appliedToTypeTrees(tree :: Nil )
75+ val quoted = ValDef (sym, encoded).withPos(tree.pos)
6576 PackageDef (ref(defn.RootPackage ).asInstanceOf [Ident ], quoted :: Nil ).withPos(tree.pos)
6677 }
6778
0 commit comments