blob: cc7f8bad3d36641ec498bc6e911891641192c1c9 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
package dotty.tools.dotc
package transform
import ast.tpd
import core.Constants.Constant
import core.Contexts.Context
import core.StdNames.nme
import core.Symbols.TermSymbol
import core.TypeErasure
import TreeTransforms.{MiniPhaseTransform, TransformerInfo, TreeTransform}
/** Rewrite `classOf` calls as follow:
*
* For every primitive class C whose boxed class is called B:
* classOf[C] -> B.TYPE
* For every non-primitive class D:
* classOf[D] -> Literal(Constant(erasure(D)))
*/
class ClassOf extends MiniPhaseTransform {
import tpd._
override def phaseName: String = "classOf"
private var classOfMethod: TermSymbol = _
override def prepareForUnit(tree: tpd.Tree)(implicit ctx: Context): TreeTransform = {
val predefModule = ctx.definitions.ScalaPredefModuleRef
classOfMethod = ctx.requiredMethod(predefModule, nme.classOf)
this
}
override def transformTypeApply(tree: TypeApply)(implicit ctx: Context, info: TransformerInfo): Tree =
if (tree.symbol eq classOfMethod) {
val targ = tree.args.head.tpe
tree.clsOf(targ, Literal(Constant(TypeErasure.erasure(targ))))
}
else tree
}
|