diff options
Diffstat (limited to 'src/library/scala/reflect/TagInterop.scala')
-rw-r--r-- | src/library/scala/reflect/TagInterop.scala | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/library/scala/reflect/TagInterop.scala b/src/library/scala/reflect/TagInterop.scala new file mode 100644 index 0000000000..6c6bfcc2f2 --- /dev/null +++ b/src/library/scala/reflect/TagInterop.scala @@ -0,0 +1,34 @@ +package scala.reflect + +import scala.runtime.ScalaRunTime._ +import mirror._ +import definitions._ + +object TagInterop { + def arrayTagToClassManifest[T](tag: ArrayTag[T]): ClassManifest[T] = { + val erasure = arrayElementClass(tag) + if (erasure.isArray) { + val elementClass = arrayElementClass(erasure) + val elementManifest = arrayTagToClassManifest(ClassTag(elementClass)) + ClassManifest.arrayType(elementManifest).asInstanceOf[ClassManifest[T]] + } else { + ClassManifest.fromClass(erasure.asInstanceOf[Class[T]]) + } + } + + def concreteTypeTagToManifest[T](tag: ConcreteTypeTag[T]): Manifest[T] = { + // todo. reproduce manifest generation code here. toolboxes are too slow. + val implicitly = PredefModule.typeSignature.member(newTermName("implicitly")) + val taggedTpe = appliedType(staticClass("scala.reflect.Manifest").asTypeConstructor, List(tag.tpe)) + val materializer = TypeApply(Ident(implicitly), List(TypeTree(taggedTpe))) + try mkToolBox().runExpr(materializer).asInstanceOf[Manifest[T]] + catch { case ex: Throwable => Manifest.classType(tag.erasure).asInstanceOf[Manifest[T]] } + } + + def manifestToConcreteTypeTag[T](tag: Manifest[T]): ConcreteTypeTag[T] = { + val tpe = + if (tag.typeArguments.isEmpty) classToType(tag.erasure) + else appliedType(classToType(tag.erasure).typeConstructor, tag.typeArguments map (manifestToConcreteTypeTag(_)) map (_.tpe)) + ConcreteTypeTag(tpe, tag.erasure) + } +}
\ No newline at end of file |