Skip to content

Commit a1fda63

Browse files
committed
ClassTags: handle Or and AndTypes, and Arrays.
1 parent b6bb034 commit a1fda63

File tree

1 file changed

+16
-3
lines changed

1 file changed

+16
-3
lines changed

src/dotty/tools/dotc/transform/ClassTags.scala

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,23 @@ class ClassTags extends MiniPhaseTransform with IdentityDenotTransformer { thisT
4343
override def transformTypeApply(tree: tpd.TypeApply)(implicit ctx: Context, info: TransformerInfo): tpd.Tree =
4444
if (tree.fun.symbol eq classTagCache) {
4545
val tp = tree.args.head.tpe
46+
val defn = ctx.definitions
47+
val (elemType, ndims) = tp match {
48+
case defn.MultiArrayType(elem, ndims) => (elem, ndims)
49+
case _ => (tp, 0)
50+
}
51+
4652
val claz = tp.classSymbol
53+
val elemClaz = elemType.classSymbol
4754
assert(!claz.isPrimitiveValueClass) // should be inserted by typer
48-
if (ValueClasses.isDerivedValueClass(claz)) ref(claz.companionModule)
49-
else if (claz eq defn.AnyClass) ref(scala2ClassTagModule).select(nme.Any).ensureConforms(tree.tpe)
50-
else ref(scala2ClassTagModule).select(nme.apply).appliedToType(tp).appliedTo(Literal(Constant(claz.typeRef)))
55+
val elemTag = if (defn.ScalaValueClasses.contains(elemClaz) || elemClaz == defn.NothingClass || elemClaz == defn.NullClass)
56+
ref(defn.DottyPredefModule).select(s"${elemClaz.name}ClassTag".toTermName)
57+
else if (ValueClasses.isDerivedValueClass(elemClaz)) ref(claz.companionModule)
58+
else if (elemClaz eq defn.AnyClass) ref(scala2ClassTagModule).select(nme.Any)
59+
else {
60+
val erazedTp = TypeErasure.erasure(elemType).classSymbol.typeRef
61+
ref(scala2ClassTagModule).select(nme.apply).appliedToType(erazedTp).appliedTo(Literal(Constant(erazedTp)))
62+
}
63+
(1 to ndims).foldLeft(elemTag)((arr, level) => Select(arr, nme.wrap).ensureApplied).ensureConforms(tree.tpe)
5164
} else tree
5265
}

0 commit comments

Comments
 (0)