@@ -7,11 +7,12 @@ import dotty.tools.dotc.core.Constants.Constant
7
7
import dotty .tools .dotc .core .Contexts ._
8
8
import dotty .tools .dotc .core .Decorators ._
9
9
import dotty .tools .dotc .core .Flags ._
10
+ import dotty .tools .dotc .core .StdNames ._
10
11
import dotty .tools .dotc .core .Symbols ._
11
12
import dotty .tools .dotc .core .tasty .{TastyPickler , TastyPrinter , TastyString }
12
13
import dotty .tools .dotc .interpreter .RawQuoted
13
14
14
- import scala .runtime . quoted . Unpickler . Pickled
15
+ import scala .reflect . ClassTag
15
16
16
17
object PickledQuotes {
17
18
import tpd ._
@@ -34,6 +35,18 @@ object PickledQuotes {
34
35
def quotedToTree (expr : quoted.Quoted )(implicit ctx : Context ): Tree = expr match {
35
36
case expr : quoted.TastyQuoted => unpickleQuote(expr)
36
37
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)
37
50
case expr : RawQuoted => expr.tree
38
51
}
39
52
@@ -42,26 +55,24 @@ object PickledQuotes {
42
55
val tastyBytes = TastyString .unpickle(expr.tasty)
43
56
val unpickled = unpickle(tastyBytes, expr.args)
44
57
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
47
61
}
48
62
}
49
63
50
64
/** 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> }`
52
66
* or
53
- * `<type tree>` ==> `package _root_ { type ' = <tree tree> }`
67
+ * `<type tree>` ==> `package _root_ { val $typeQuote: Any = null.asInstanceOf[ <tree>] }`
54
68
*/
55
69
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)
65
76
PackageDef (ref(defn.RootPackage ).asInstanceOf [Ident ], quoted :: Nil ).withPos(tree.pos)
66
77
}
67
78
0 commit comments