diff options
author | Eugene Burmako <xeno.by@gmail.com> | 2012-09-19 15:04:50 +0200 |
---|---|---|
committer | Eugene Burmako <xeno.by@gmail.com> | 2012-09-19 22:47:10 +0200 |
commit | 3fa900ca0ea244ac54df75dc2fd6d711739eface (patch) | |
tree | bd37a549da114d7030a7cbce14ecc527058dd1ad /src/reflect/scala/reflect/api/TypeCreator.scala | |
parent | eadf1d2080e0ce763e4c1920a26b80c8b8609ca0 (diff) | |
download | scala-3fa900ca0ea244ac54df75dc2fd6d711739eface.tar.gz scala-3fa900ca0ea244ac54df75dc2fd6d711739eface.tar.bz2 scala-3fa900ca0ea244ac54df75dc2fd6d711739eface.zip |
SI-6363 removes scala.reflect.base
As the experience has shown, there's no need for a separate layer of reflection
in scala-library.jar. Therefore I'm putting an end to it.
Diffstat (limited to 'src/reflect/scala/reflect/api/TypeCreator.scala')
-rw-r--r-- | src/reflect/scala/reflect/api/TypeCreator.scala | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/reflect/scala/reflect/api/TypeCreator.scala b/src/reflect/scala/reflect/api/TypeCreator.scala new file mode 100644 index 0000000000..cc6d38c548 --- /dev/null +++ b/src/reflect/scala/reflect/api/TypeCreator.scala @@ -0,0 +1,26 @@ +package scala.reflect +package api + +/** A mirror-aware factory for types. + * + * In the reflection API, artifacts are specific to universes and + * symbolic references used in artifacts (e.g. `scala.Int`) are resolved by mirrors. + * + * Therefore to build a type one needs to know a universe that the type is going to be bound to + * and a mirror that is going to resolve symbolic references (e.g. to determine that `scala.Int` + * points to a core class `Int` from scala-library.jar). + * + * `TypeCreator` implements this notion by providing a standalone type factory. + * + * This is immediately useful for type tags. When the compiler creates a type tag, + * the end result needs to make sense in any mirror. That's because the compiler knows + * the universe it's creating a type tag for (since `TypeTag` is path-dependent on a universe), + * but it cannot know in advance the mirror to instantiate the result in (e.g. on JVM + * it doesn't know what classloader use to resolve symbolic names in the type tag). + * + * Due to a typechecker restriction (no eta-expansion for dependent method types), + * `TypeCreator` can't have a functional type, so it's implemented as class with an apply method. + */ +abstract class TypeCreator { + def apply[U <: Universe with Singleton](m: MirrorOf[U]): U # Type +} |