Skip to content

Commit 040ef52

Browse files
Implement getClass method
1 parent cf17b73 commit 040ef52

File tree

4 files changed

+108
-0
lines changed

4 files changed

+108
-0
lines changed

src/dotty/tools/dotc/Compiler.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ class Compiler {
6262
new AugmentScala2Traits,
6363
new ResolveSuper),
6464
List(new Erasure),
65+
List(new GetClass), // getClass transformation should be applied to specialized methods
6566
List(new ElimErasedValueType,
6667
new VCElideAllocations,
6768
new Mixin,
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package dotty.tools.dotc
2+
package transform
3+
4+
import ast.tpd
5+
import core.Contexts.Context
6+
import core.StdNames.nme
7+
import core.Symbols.TermSymbol
8+
import TreeTransforms.{MiniPhaseTransform, TransformerInfo}
9+
10+
/**
11+
* FILL ME
12+
*/
13+
class GetClass extends MiniPhaseTransform {
14+
import tpd._
15+
16+
override def phaseName: String = "getClass"
17+
18+
override def transformApply(tree: Apply)(implicit ctx: Context, info: TransformerInfo): Tree = {
19+
import ast.Trees._
20+
21+
tree match {
22+
case Apply(Select(qual, nme.getClass_), Nil) =>
23+
val defn = ctx.definitions
24+
val claz = qual.tpe.classSymbol
25+
26+
def TYPE(module: TermSymbol) = ref(module).select(nme.TYPE_).ensureConforms(tree.tpe)
27+
claz match {
28+
case defn.BooleanClass => TYPE(defn.BoxedBooleanModule)
29+
case defn.ByteClass => TYPE(defn.BoxedByteModule)
30+
case defn.ShortClass => TYPE(defn.BoxedShortModule)
31+
case defn.CharClass => TYPE(defn.BoxedCharModule)
32+
case defn.IntClass => TYPE(defn.BoxedIntModule)
33+
case defn.LongClass => TYPE(defn.BoxedLongModule)
34+
case defn.FloatClass => TYPE(defn.BoxedFloatModule)
35+
case defn.DoubleClass => TYPE(defn.BoxedDoubleModule)
36+
case defn.UnitClass => TYPE(defn.BoxedVoidModule)
37+
case _ => qual.selectWithSig(defn.Any_getClass).appliedToNone
38+
}
39+
case _ => tree
40+
}
41+
}
42+
}

tests/run/getclass.check

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
Value types:
2+
void
3+
boolean
4+
byte
5+
short
6+
char
7+
int
8+
long
9+
float
10+
double
11+
12+
Class types:
13+
class SomeClass
14+
class ValueClass
15+
class scala.collection.immutable.$colon$colon
16+
class scala.Tuple2
17+
18+
Arrays:
19+
class [Lscala.runtime.BoxedUnit;
20+
class [I
21+
class [D
22+
class [Lscala.collection.immutable.List;
23+
24+
Functions:
25+
class Test$$$Lambda$1/1349414238
26+
class Test$$$Lambda$2/1626877848

tests/run/getclass.scala

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
class ValueClass(val i: Integer) extends AnyVal
2+
class SomeClass
3+
4+
object Test {
5+
def main(args: Array[String]): Unit = {
6+
val cls: Predef.Class[_] = new SomeClass().getClass
7+
val valCls: Predef.Class[_] = new ValueClass(1).getClass
8+
val iCls: Class[Int] = 1.getClass
9+
val f1: Function2[Int, Int, Unit] = (a: Int, b: Int) => println(a + b)
10+
val f2: Function1[Int, Boolean] = (a: Int) => a % 2 == 0
11+
12+
println("Value types:")
13+
println(().getClass)
14+
println(true.getClass)
15+
println(1.asInstanceOf[Byte].getClass)
16+
println(1.asInstanceOf[Short].getClass)
17+
println('a'.getClass)
18+
println(1.getClass)
19+
println(1L.getClass)
20+
println(1f.getClass)
21+
println(1d.getClass)
22+
23+
println("\nClass types:")
24+
println(new SomeClass().getClass)
25+
println(new ValueClass(1).getClass)
26+
println(List(Array(1f)).getClass)
27+
println(("a", Map(1 -> "b")).getClass)
28+
29+
println("\nArrays:")
30+
println(Array(()).getClass)
31+
println(Array(1).getClass)
32+
println(Array(1d).getClass)
33+
println(Array(List("1")).getClass)
34+
35+
println("\nFunctions:")
36+
println(f1.getClass)
37+
println(f2.getClass)
38+
}
39+
}

0 commit comments

Comments
 (0)