@@ -10,6 +10,7 @@ import dotty.tools.dotc.core.Flags._
1010import dotty .tools .dotc .core .StdNames ._
1111import dotty .tools .dotc .core .NameKinds
1212import dotty .tools .dotc .core .Symbols ._
13+ import dotty .tools .dotc .core .Types .Type
1314import dotty .tools .dotc .core .tasty .{TastyPickler , TastyPrinter , TastyString }
1415
1516import scala .quoted .Types ._
@@ -33,7 +34,10 @@ object PickledQuotes {
3334 /** Transform the expression into its fully spliced Tree */
3435 def quotedExprToTree (expr : quoted.Expr [_])(implicit ctx : Context ): Tree = expr match {
3536 case expr : TastyExpr [_] => unpickleExpr(expr)
36- case expr : LiftedExpr [_] => Literal (Constant (expr.value))
37+ case expr : LiftedExpr [_] =>
38+ if (expr.value.isInstanceOf [Class [_]]) // Should be a pattern match after #4198 is fixed
39+ ref(defn.Predef_classOf ).appliedToType(classToType(expr.value.asInstanceOf [Class [_]]))
40+ else Literal (Constant (expr.value))
3741 case expr : TreeExpr [Tree ] @ unchecked => expr.tree
3842 case expr : FunctionAppliedTo [_, _] =>
3943 functionAppliedTo(quotedExprToTree(expr.f), quotedExprToTree(expr.x))
@@ -154,4 +158,25 @@ object PickledQuotes {
154158 }
155159 Block (x1 :: Nil , rec(f))
156160 }
161+
162+ private def classToType (clazz : Class [_])(implicit ctx : Context ): Type = {
163+ if (clazz == classOf [Boolean ]) defn.BooleanType
164+ else if (clazz == classOf [Byte ]) defn.ByteType
165+ else if (clazz == classOf [Char ]) defn.CharType
166+ else if (clazz == classOf [Short ]) defn.ShortType
167+ else if (clazz == classOf [Int ]) defn.IntType
168+ else if (clazz == classOf [Long ]) defn.LongType
169+ else if (clazz == classOf [Float ]) defn.FloatType
170+ else if (clazz == classOf [Double ]) defn.DoubleType
171+ else if (clazz == classOf [Unit ]) defn.UnitType
172+ else if (! clazz.isMemberClass) ctx.getClassIfDefined(clazz.getCanonicalName).typeRef
173+ else {
174+ val name = clazz.getSimpleName.toTypeName
175+ val enclosing = classToType(clazz.getEnclosingClass)
176+ if (enclosing.member(name).exists) enclosing.select(name)
177+ else {
178+ enclosing.classSymbol.companionModule.termRef.select(name)
179+ }
180+ }
181+ }
157182}
0 commit comments