aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dotty/tools/dotc/transform/ClassTags.scala68
1 files changed, 0 insertions, 68 deletions
diff --git a/src/dotty/tools/dotc/transform/ClassTags.scala b/src/dotty/tools/dotc/transform/ClassTags.scala
deleted file mode 100644
index 8fd25f785..000000000
--- a/src/dotty/tools/dotc/transform/ClassTags.scala
+++ /dev/null
@@ -1,68 +0,0 @@
-package dotty.tools.dotc
-package transform
-
-import core._
-import TreeTransforms._
-import Contexts.Context
-import Flags._
-import SymUtils._
-import Symbols._
-import SymDenotations._
-import Types._
-import Decorators._
-import DenotTransformers._
-import StdNames._
-import NameOps._
-import ast.Trees._
-import dotty.tools.dotc.ast.tpd
-import dotty.tools.dotc.core.Constants.Constant
-import util.Positions._
-import Names._
-import collection.mutable
-
-/** This phase replaces calls to DottyPredef.classTag by code that synthesizes appropriate ClassTag
- */
-class ClassTags extends MiniPhaseTransform with IdentityDenotTransformer { thisTransform =>
- import ast.tpd._
-
- private var classTagCache: Symbol = null
- private var typeTagCache: Symbol = null
- private var scala2ClassTagModule: Symbol = null
-
-
- override def prepareForUnit(tree: tpd.Tree)(implicit ctx: Context): TreeTransform = {
- classTagCache = defn.DottyPredefModule.requiredMethod(nme.classTag)
- typeTagCache = defn.DottyPredefModule.requiredMethod(nme.typeTag)
- scala2ClassTagModule = ctx.requiredModule("scala.reflect.ClassTag")
- this
- }
-
- override def phaseName: String = "classTags"
-
- override def transformTypeApply(tree: tpd.TypeApply)(implicit ctx: Context, info: TransformerInfo): tpd.Tree =
- if (tree.fun.symbol eq classTagCache) {
- val tp = tree.args.head.tpe
- val defn = ctx.definitions
- val (elemType, ndims) = tp match {
- case defn.MultiArrayOf(elem, ndims) => (elem, ndims)
- case _ => (tp, 0)
- }
-
- val claz = tp.classSymbol
- val elemClaz = elemType.classSymbol
- assert(!claz.isPrimitiveValueClass) // should be inserted by typer
- val elemTag =
- if (elemClaz.isPrimitiveValueClass || elemClaz == defn.NothingClass || elemClaz == defn.NullClass)
- ref(defn.DottyPredefModule).select(s"${elemClaz.name}ClassTag".toTermName)
- else if (ValueClasses.isDerivedValueClass(elemClaz))
- ref(claz.companionModule)
- else if (elemClaz eq defn.AnyClass)
- ref(scala2ClassTagModule).select(nme.Any)
- else {
- val erazedTp = TypeErasure.erasure(elemType).classSymbol.typeRef
- ref(scala2ClassTagModule).select(nme.apply)
- .appliedToType(erazedTp).appliedTo(Literal(Constant(erazedTp)))
- }
- (1 to ndims).foldLeft(elemTag)((arr, level) => Select(arr, nme.wrap).ensureApplied).ensureConforms(tree.tpe)
- } else tree
-}